前面文章写到了链表的创建,节点的创建,插入,以及遍历链表,本文来解析两道关于遍历链表的基本题目
#*题目1*#
【问题描述】
输入n个数据,建立带有头结点的单链表,并将建立好的单链表中的数据从头至尾遍历输出(要求输出数据的顺序与输入数据的顺序一致)。
【输入形式】
输入两行
第一行为整数n(范围1-10)
第二行为n个整型数据,数据与数据之间用空格分开。
【输出形式】
输出数据的顺序与输入数据的顺序一致,数据与数据之间仅用一个空格隔开。
【样例输入】
3
34 56 23
【样例输出】
34 56 23
【题目分析】
本题可以理解为创建一个含有n个数据节点(不包含表头)的单链表,n个节点的数据由用户输入,那么就可以用表尾插入来完成
#include<stdio.h>
#include<stdlib.h>
struct Node
{
int data;
struct Node * next;
};
//创建表头
struct Node * createlist()
{
struct Node * head = (struct Node * )malloc(sizeof(struct Node));
head->next = NULL; //头节点指向空
return head;
}
//创建节点
struct Node * createNode(int num) //num为节点储存值
{
struct Node * newNode = (struct Node * )malloc(sizeof(struct Node));
newNode->data = num;
newNode->next = NULL;
return newNode; //返回的即是节点的地址
}
//打印链表
void printlist(struct Node * head)
{
head = head->next;
while (head != NULL)//当head指向的不为空时就打印输出
{
printf("%d ", head->data);
head = head->next;
}
}
//表尾法插入
struct Node * insertByEnd(struct Node * head, int num)
{
struct Node * newNode = createNode(num); // 指向新创建节点的指针
while (head->next != NULL)
{
head = head->next;
}
head->next = newNode; //使最后一个节点的next指针指向新创立的节点
return newNode;
}
int main()
{
struct Node * list = createlist(); //创建头节点
int n;
scanf("%d", &n);//数据个数
int i;
for(i = 0; i < n; i++)
{
int num = 0; //结点中储存的数据
scanf("%d", &num); //输入数据
if(i == 0)
{
list->next = insertByEnd(list, num); //list 为头节点 || 链接头节点与下一节点
}
else
insertByEnd(list, num);
}
printlist(list); //链表遍历输出函数
return 0;
#*题目2*#
【问题描述】
输入n个数据,建立带有头结点的单链表,并将建立好的单链表中的数据从头至尾遍历输出(要求输出数据的顺序与输入数据的顺序相反)。
【输入形式】
输入两行
第一行为整数n(范围1-10)
第二行为n个整型数据,数据与数据之间用空格分开。
【输出形式】
输出数据的顺序与输入数据的顺序一致,数据与数据之间仅用一个空格隔开。
【样例输入】
3
34 56 23
【样例输出】
23 56 34
【题目分析】
该题目要求的是逆序输出,其实可以转换一种思路,可以利用表头插入将数据存入链表的顺序与用户输入的顺序相反,再将链表从头到尾遍历,即可完成题目要求
#include<stdio.h>
#include<stdlib.h>
struct Node
{
int data;
struct Node* next;
};
//创建表头
struct Node* createlist()
{
struct Node* head = (struct Node*)malloc(sizeof(struct Node));
head->next = NULL; //头节点指向空
return head;
}
//创建节点
struct Node* createNode(int num) //num为节点储存值
{
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = num;
newNode->next = NULL;
return newNode; //返回的即是节点的地址
}
//打印链表
void printlist(struct Node* head)
{
head = head->next;
while (head != NULL)//当head指向的不为空时就打印输出
{
printf("%d ", head->data);
head = head->next;
}
}
//表头法插入
struct Node* insertByHead(struct Node* head, int num)
{
struct Node* newNode = createNode(num);
newNode->next = head->next;
head->next = newNode;
return newNode;
}
int main()
{
struct Node* list = createlist(); //创建头节点
int n = 0;
scanf("%d", &n); //数据个数
int i;
for (i = 0; i < n; i++)
{
int num = 0; //结点中储存的数据
scanf("%d", &num); //输入数据
insertByHead(list, num); //表头插入,使得存放顺序与用户输入顺序相反
}
printlist(list); //链表遍历输出函数
return 0;
}