- 3
- 0
- 约5.76千字
- 约 19页
- 2023-01-10 发布于上海
- 举报
c语⾔学习链表的增删查改(瞎⼦都能看懂)有代码
⼀.介绍
1. 格式
尾结点为NULL
⼆.增删查改(风险与机遇并存)
头指针:phead
尾指针:ptail
链表可以只有头指针
如何定义链表?
1. 定义头指针,尾指针,要插⼊的值.两个指针表⽰链表, ⾃⼰幻想⼀下
2. 头指针尾指针要赋值为NULL,要插⼊的值其实是⾃⼰输⼊的值
3. 循环输⼊要插⼊的值,循环体⾥是调⽤的函数
1.插⼊
结构体怎么写:
1.要有值,整型,字符型之类的值
2.要有指向下⼀结点的指针
3.要定义别名,普通别名,指针类型别名
函数
函数声明怎么写?
1. 定义头指针,定义尾指针,定义要插⼊的值
2. 函数声明中类型必须写,形参可以不写
3. 头指针和尾指针都是⼆级指针,通过对⼆级指针取地址,得到⼀级指针,也就是结点中值的地址,eg:*头节
点 新结点的地址
⼀开始头指针和尾指针都是NULL
1.头插法
插⼊⽅法:
1. 定义⼀个新结构体结点(⽕车车厢)
2. 为该结构体结点申请空间
3. 将该结构体结点的内存全部清0(让新结点的pNext为空)
4. 将插⼊的值传到该结构体结点中对应的值中
5. 如果链表为空:头结点和尾结点都指向该结点(结构体的变量名,代表该结构体的⾸地址)
6. 如果链表不为空:先将原有链表的头指针,赋给新结点的pNext((pNext是结构体⾥⾃带的指向下⼀结点地
址的指针,已定义),再将新结点
作为链表头
2.尾插法
插⼊⽅法:
1. 定义⼀个新结构体结点(⽕车车厢)
2. 为该结构体结点申请空间
3. 将该结构体结点的内存全部清0(让新结点的pNext为空)
4. 将插⼊的值传到该结构体结点中对应的值中
5. 如果链表为空:头结点和尾结点都指向该结点(结构体的变量名,代表该结构体的⾸地址)
6. 如果链表不为空:先将新结点的地址,赋给原有链表的尾指针的pNext,再将新结点作为尾指针
3. 有序插⼊法
插⼊⽅法:
1. 定义⼀个新结构体结点(⽕车车厢)
2. 为该结构体结点申请空间
3. 将该结构体结点的内存全部清0(让新结点的pNext为空)
4. 将插⼊的值传到该结构体结点中对应的值中
5. 如果链表为空:头结点和尾结点都指向该结点(结构体的变量名,代表该结构体的⾸地址)
6.
7. 链表不为空:这时有三种情况考虑
pcur是当前的结点,ppre是上⼀个结点,pcur要往下⼀个结点,前提是ppre=pcur;然后pcur=pcur-pNext
8. 判断插⼊值是否⼩于头部数据(第⼀个数据),若是则插⼊头部,头插法
9. 若不⼩于第⼀个数据,则和下⼀个结点进⾏⽐较,或下下个,直到找到⽐插⼊值⼤的数,然后插在该数的前
⾯.新结点的指针插⼊该节点前⾯,
前⼀个结点的pNext指向新结点
这⾥为什么是while(pCur)呢?(2,5,8)
不为空时,先和第⼀个结点⽐较,此时发现⽐第⼀个结点⼤,然后和下⼀个结点⽐较,假如插⼊值时6.此时
pcur还是指向第⼀个结点,6⽐2⼤,然后和下⼀个⽐较,这时pcur进⼊while,此时if(62),不进⼊if语句,然后执
⾏下⾯语句, ⽬前pcur和ppre指向的都是头指针,但还是多运⾏了⼀次ppre的赋值,然后pcur指向下⼀个结点,
再次进⼊while,if(65),不进⼊if,此时ppre指向5,然后pcur指向8,然后再进⼊while,然后if(68),此时pnew插⼊
在ppre和pcur之间.然后break.
如果插⼊10,则if(108),此时ppre指向尾结点,pcur-pNext为NULL,也就是此时pcur=NULL,再次进⼊
whil(NULL),则退出进⾏到下⼀过程
10. 实在找不到⽐插⼊值⼤的,就插到末尾,尾插法
11. 顺序,逆序插⼊, ⾃⼰画图⽐划⼀下就⾏
2.删除
删除不需要申请空间,需要释放空间
⽅法
1. 先判断链表是否为空,为空的话直接打印链表为空
2. 不为空的话,开始从链表中查找删除值
3. 先⽐较链表的第⼀个结点,是该结点.
4. 如果该链表只有⼀个元素,那么删除该链表后,尾指针=NULL.
5. 如果链表有很多元素,将第⼆个结点赋为头节点,free()第⼀个结点.
6. 如果不是第⼀个结点,⽽是中间结点,且找到了该结点,那么将该结点的pNext赋给前⼀结点的pNext,然后
free()该结点
7. 如果第⼆个节点不是,则继续遍历,ppre=pcur;pcur=pcur-pNext;
8. 如果是最后⼀个节点,则此时:pcur-pNext = NULL; ppre-pNext = pcu
原创力文档

文档评论(0)