C语言-链表(单链表,循环链表)
C语言-链表(单链表,循环链表)
1.链表的概念
单链表:线性表的链接存储结构。
存储思想:用一组任意的存储单元存放线性表的元素。
*next其实很好理解它是一个指针域指向另外一个相同结点的指针域
Node st; 等价于 struct node st;
Link p;等价于 struct node *p;
p=&st(p指向了st这个变量)
p = (Link)malloc(sizeof(Node))
等价于 (struct node *) malloc (sizeof(Node))
不写type of就需要写struct xxx
如何申请链表中的一个结点?
p = (Link)malloc(sizeof(Node))
malloc分配的首地址要赋给p,先要转成指针p需要看待他的方式
如何引用数据元素和指针域?
指针p指向了我们想要访问的这一块存储空间。
什么是存储结构?
重点在数据元素之间的逻辑关系的表示,所以,将实际存储地址抽象。
空表和非空表不统一, 缺点?
如何将空表与非空表统一?
加入一个头结点
头结点:在单链表的第一个元素结点之前附设一个类型相同的结点,以便空表和非空表处理统一 。
2单链表的实现
(1)单链表的遍历操作
思路:
1.先将头节点传入
2.再让p指向第一个有效的结点a1
- 如果这个链表是一个空表我们怎么考虑?
当p指向head.next就为空,啥都不做。
- 当不是空表的时候,当p指向head.next,就是head结点的第一个有效的首地址
3.显示data域
4.显示下一个结点 p = p.next
最后的时候 p = null 就退出了
p++能否完成后移?
p++指的是指向下一个结构体,并不是你所希望的链表的下一个结点。因为地址不是连续的。
(2)求单链表的元素个数
p !=null可以直接写成p
这里一旦找到就会提前出去,这里并没有找到,就会走到最后的false
/#include<bool.h>
(4)单链表的插入操作
p是指针,首先分配空间的函数返回的是地址,只有指针才会用到->这个符号
1.先将p移动到合适的位置
https://www.bilibili.com/video/BV1FJ411X7w2?t=1746.3
创建结点,node指针指向
【顺序不能反】
node.next指向ai(p.next)
p.next保存node地址(有了新的之前的就断开)
这里语句顺序如果反过来,这里需要借助之前p.next去找ai这个结点,如果先断开就找不到了
这里如果没有头结点就没法写出通用的代码适用于插在所有的位置。
5.创建一个单链表-头插法
tips:创建好一个结点,就把他的next域设置为空。
数组插入的顺序和链表的顺序是相反的。
5.创建一个单链表-尾插法
这里如果没有设置rear.next = NULL就会指向别的不可知的位置,循环扫描的时候就结束不了,死循环。
6.单链表结点的删除
如何保存一前一后?
- 出发的时候就一前一后
- 每次移动
7.单链表的释放
三、循环链表的实现
四、双向链表
五、作业《C语言-链表作业1:学生管理系统》实验内容
要求完成学生管理的链表程序。具有学生信息增加、显示、修改、删除、查找、学生人数统计功能的程序。增加学生信息时,按照学号排序;根据给定的学号,可以完成指定学号的修改、删除和查找功能。
学生管理系统的模板已经替你们把编程框架打好了,可以运行并增加记录,其他功能只写了函数头,需要在代码中修改直到完成作业。代码如下:(懒猫老师版权所有,转发请标明出处)