单链表常规操作
1 | c复制代码/********************* 单链表的常规操作 ****************************/ |
定义单链表结构体
单链表是由多个结点链接组成,它的每个结点包含两个域,一个数据域和一个链接域(地址域)。
- 数据域
data
用来存放具体的数据。 - 地址域
next
用来存放下一个节点的位置。
1 | c复制代码#include "stdio.h" |
构造单链表
头插法实现
1 | c复制代码/* |
头插法构造单链表时一直往单链表的头部插入结点。
尾插法实现
1 | c复制代码/* |
尾插法构造单链表时一直往单链表的尾部插入结点。
单链表的头尾插法详解
为了不让文章篇幅过长,关于单链表头尾插法的更多具体内容请观看我的另一篇博客 单链表的头尾插法详解
单链表判空
1 | c复制代码/* |
计算单链表长度
1 | c复制代码/* |
遍历单链表
1 | c复制代码/* |
单链表头、尾插法构造效果
1 | c复制代码int main(int argc, char const *argv[]) |
因为数组是在连续的地址上存储元素,所以可以动态的计算数组的长度,方便遍历。
输入结果如下:
1 | C复制代码头插法构造单链表 |
单链表指定位置插入结点
代码实现
1 | c复制代码/* |
详细图解
假设原单链表为:head --> 2 --> 6
,要插入的结点值为 4,插入位置为 2。
只需找要插入位置的前一个结点就行,因为插入位置的前一个结点的地址域保存着要插入位置的结点。
此时找到的结点是 new_code1
,而 new_code1 -> next
就是结点 new_code2
。
所以我们只要
1 | c复制代码new_code3 -> next = new_code1 -> next; |
先让待插入结点的地址域指向插入位置的结点
后让插入位置的前一个结点的地址域指向待插入结点。
1, 2, 3代表单链表结点位置
①,②,③代表插入操作的执行步骤顺序
注意:千万不能先让插入位置的前一个结点的地址域指向待插入结点,后让待插入结点的地址域指向插入位置的结点
1 | c复制代码new_code1 -> next = new_code3; |
单链表指定位置删除结点
代码实现
1 | c复制代码/* |
详细图解
假设原单链表为:head --> 2 --> 4 --> 6
,删除第 2 个结点。
还是跟插入一样只需找要删除位置的前一个结点就行。
此时找到的结点是 new_code1
,而 new_code1 -> next
就是结点 new_code2
,就是要删除的结点。
1 | c复制代码r = new_code1 - > next; |
先让变量 r
等于要删除的结点 ,
r = new_code1 - > next; --> r = new_code2;
后让删除位置的前一个结点的地址域指向要删除结点的后一个结点。
1 | c复制代码new_code1 -> next = r -> next; // 此时r -> next 等于 new_code2 |
最后释放删除结点空间 free(r)
删除第二个位置节点后的单链表:head --> 2 --> 6
按址求值
1 | c复制代码/* |
按值求址
1 | c复制代码/* |
单链表去重
1 | c复制代码/* |
原理就是每次拿没有比较过的结点跟单例表中的每一个结点进行比较,遇到相同的就删除其中一个结点。
例如:单链表序列为 2 4 2 8 8 6 6 8 12
1 | c复制代码首先拿第一个结点 2 跟单链表的其他结点比较 |
看看去重效果
1 | c复制代码去重前的单链表 |
源代码
源代码已上传到 GitHub Data-Structure-of-C,欢迎大家来访。
✍ 码字不易,万水千山总是情,点赞再走行不行,还望各位大侠多多支持❤️
本文转载自: 掘金