目录
一、create()创建链表,后面产生的结构体将放在表头后面
二、newNote()创建节点,读取用户输入的记录,生成结构体数据
三、insert()从表头插入新的数据,可用于添加信息的功能。
四、query()通过接收用户的编号来查找链表中对应的记录,但只能返回第一个编号相同的记录
五、query a record()查找函数,可用于查找信息功能
前言
在我们学习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;
}
}</