题目描述:
输入一个链表,从尾到头打印链表每个节点的值。
输入:
每个输入件仅包含一组测试样例。
每一组测试案例包含多行,每行一个大于0的整数,代表一个链表的节点。第一行是链表第一个节点的值,依次类推。当输入到-1时代表链表输入完毕。-1本身不属于链表。
输出:
对应每个测试案例,以从尾到头的顺序输出链表每个节点的值,每个值占一行。
样例输入:
1
2
3
4
5
-1
样例输出:
5
4
3
2
1
这里的从尾到头打印链表,即打印的顺序和输入的顺序是相反的。在链表的插入方法当中,就有头插法,每一次插入的数据都存放在链表的首位,就是数据结构当中栈的操作,即后进先出。我们可以通过栈来实现题目的要求。实际上栈的操作和链表是相似的,如果对链表和结构体不清楚的,可以参考我的另一篇博文:
最接地气的C语言结构体与链表教程----手把手教你从0开始写学生成绩管理系统(附完整代码)
下面我们来通过链表的头插法实现需求:
#include <stdio.h>
#include <stdlib.h>
struct Node{
int data;
struct Node* pNext;
};
struct Node* creatlist()
{
struct Node* headnode = (struct Node*)malloc(sizeof(struct Node));
headnode->pNext = NULL;
headnode->data = 0;
return headnode;
}
void insertByHead(struct Node* list ,int data)
{
struct Node* newnode = (struct Node*)malloc(sizeof(struct Node));
newnode->data = data;
newnode->pNext = list->pNext;
list->pNext = newnode;
}
void printflist(struct Node* list)
{
struct Node* pMove = list->pNext;
if(pMove == NULL)
{
printf("空链表");
}
else
{
while(pMove)
{
printf("%d",pMove->data);
pMove = pMove->pNext;
}
printf("\n");
}
}
int main()
{
int temp;
struct Node* list = creatlist();
printf("please input data:");
scanf("%d",&temp);
while(temp != -1)
{
insertByHead(list,temp);
printf("please input data:");
scanf("%d",&temp);
}
printflist(list);
return 0;
}