C语言-链表逆序输出


逆序输出 (10分)

题目内容:

你的程序会读入一系列的正整数,预先不知道正整数的数量,一旦读到-1,就表示输入结束。然后,按照和输入相反的顺序输出所读到的数字,不包括最后标识结束的-1。


输入格式:

一系列正整数,输入-1表示结束,-1不是输入的数据的一部分。


输出格式:

按照与输入相反的顺序输出所有的整数,每个整数后面跟一个空格以与后面的整数区分,最后的整数后面也有空格。


输入样例:

1 2 3 4 -1


输出样例:

4 3 2 1 

时间限制:500ms内存限制:32000kb
分析:该题比较简单,只要熟悉链表的操作,都能解决,我的算法思路如下:
List Sort(List L)
{
	List P=L->Next,P0=L,P1=P->Next,t;  /* P0当前处理的上一个结点,P1当前处理的下一个结点 */ 
	List Pt = L;
	Pt->Next = NULL;    /* 头结点指向空 */ 
	for(; P1!=NULL; )
	{
		P->Next = P0; /* 指向前驱 */     
		P0 = P;       /* 将当前结点赋给上一个结点 */
		P = P1;      /* 将下一个结点赋给当前结点 */
		P1 = P->Next; /* P重新指向下一个结点P */ 
	}
	L = P0;   
	free(P);
	return L;
}

遇到问题:

1、指针用的不够熟悉,花了两分钟才发现第一个bug

for(P=L;P->Next!=NULL;P=P->Next)      //P->Next!=NULL明显的错误,会少打印一个
		printf("%d ",P->data);

2、void Sort(List L)   定义为void类型函数,此时若函数参数为List L,使不能返回指向L的链表,需要改成指向指针的指针才行。

源程序:

#include 
#include 

typedef struct LNode* List;
struct LNode{
	int data;
	List Next;
};

List ReadInput();   /* 输入 */ 
List Sort(List L);  /* 逆序 */ 
void Print(List L);     /* 输出 */ 

int main()
{
	List L,P;
	L = ReadInput();
	P = Sort(L);
	Print(P);
	return 0;		
}

List ReadInput()
{
	List L,P,t;
	L = (List)malloc(sizeof(struct LNode));
	P = L;
	for(;;)
	{
		scanf("%d",&P->data);
		t = P;
		P = (List)malloc(sizeof(struct LNode));
		t->Next = P;
		if(t->data == -1)
		{
			t->Next = NULL; 
			free(P);
			break;
		}
	}
	return L;
 } 
 
List Sort(List L)
{
	List P=L->Next,P0=L,P1=P->Next,t;  /* P0当前处理的上一个结点,P1当前处理的下一个结点 */ 
	List Pt = L;
	Pt->Next = NULL;    /* 头结点指向空 */ 
	for(; P1!=NULL; )
	{
		P->Next = P0; /* 指向前驱 */     
		P0 = P;       /* 将当前结点赋给上一个结点 */
		P = P1;      /* 将下一个结点赋给当前结点 */
		P1 = P->Next; /* P重新指向下一个结点P */ 
	}
	L = P0;   
	free(P);
	return L;
}

void Print(List L)
{
	List P;
	for(P=L;P!=NULL;P=P->Next)
		printf("%d ",P->data);
}

你可能感兴趣的:(学习)