C语言单链表讲解(上):有表头链表的使用

目录

 

前言

单链表的分类

有表头单链表

一、create()创建链表,后面产生的结构体将放在表头后面

二、newNote()创建节点,读取用户输入的记录,生成结构体数据

三、insert()从表头插入新的数据,可用于添加信息的功能。

四、query()通过接收用户的编号来查找链表中对应的记录,但只能返回第一个编号相同的记录

五、query a record()查找函数,可用于查找信息功能

六、delete()用于删除第一个与编号相同的记录

八、sort()按编号排序,用于信息排序,经典的冒泡排序法

九、display()用于信息显示

十、Reverse()链表逆置

完整代码展示


前言

在我们学习C语言基础的过程中,指针链表一直是新手的两大拦路虎。在大学的程序语言课程设计中,我们在设计系统时可能会用到链表或者结构体数组今天,我想为大家梳理一下关于单链表的使用。本文章需要读者先行理解C语言的结构体和结构体中next的使用。

注:我所使用的是vs2019,部分代码可能在其他编译器中会报错。

单链表的分类

在我理解中,单链表分为两类,一种是有表头单链表,一种是无表头单链表。本章我先来帮助大家理解有表头单链表。

结构体框架

struct Structure //为了方便大家理解char类型和int类型在使用上的区别,我特地分别设置了两个变量
{
	char num[4];//编号
	int score;//分数
	char name[10];//姓名
	int room;//房间号
	struct Structure* next;
};

有表头单链表

有表头单链表,顾名思义,就是创建的链表中表头数据为NULL,next直接指向下一结构体。它包含的基础功能有:添加信息查找信息删除信息信息排序文件操作信息显示。文件操作功能我暂且放在下一章讲解。

下面,我来讲解使用有表头单链表需要使用到的函数:

一、create()创建链表,后面产生的结构体将放在表头后面

struct Structure* create()//创建有表头链表(不存数据)
{
	struct Structure* head = (struct Structure*)malloc(sizeof(struct Structure));//产生变量
	head->next = NULL;//初始化变量
	return head;
}

我们需要在主函数main中编写 struct Structure* head = create();  这样一个链表的表头就形成了。

二、newNote()创建节点,读取用户输入的记录,生成结构体数据

struct Structure* newNote()//创建节点
{
	struct Structure* p = (struct Structure*)malloc(sizeof(struct Structure));
	scanf_s("%s%d%s%d", p->num, 4, &p->score, p->name, 10, &p->room);
	p->next = NULL;
	return p;
}

scanf_s代码解释:              //  scanf_s("%s%d%s%d", p->num, 4, &p->score, p->name, 10, &p->room);

1.代码解读:num和name均为char类型的数组变量,在取址时可以不用添加“&”,后面跟着的4,10为可读取数据的长度。score和room为int类型变量,需添加“&”读取地址

2.这是vs新版本中为了保证系统的安全,添加了检验机制。

3.它与scanf的区别在于,读取字符串时可以确定读取的长度,当输入字符串长度过长时可以直接对该变量赋值为空,且不影响后续数据的读取。若输入数据为123456 78 张三 101,则存储的数据为:num=""   score=78   name="张三"  room=101   。

函数解读,创建一个结构体,并存储用户输入数据,并将该结构体返回。

三、insert()从表头插入新的数据,可用于添加信息的功能。

void insert(struct Structure* head)//调用创建节点导入数据并从表头插入
{
	int n;//用于读取用户输入的记录个数
	printf("请输入你要录入的学生个数:");
	scanf_s("%d", &n);

	for (;  n < 1; n--)
	{
		printf("请输入数据\n");//也可以定义变量i来提示用户当前输入的记录条数
		struct Structure* node = newNote();
		node->next = head->next;
		head->next = node;
	}
}</
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值