逆序输出
(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 <stdio.h>
#include <stdlib.h>
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);
}