单链表:链表遍历经典题目

前面文章写到了链表的创建,节点的创建,插入,以及遍历链表,本文来解析两道关于遍历链表的基本题目

#*题目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;
}

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值