链式存储结构的线性表——链表
链表
基本概念
-
结点包括数据域和指针域
-
链表是由n个结点链结成
-
头指针——链表中第一个结点的存储位置
-
最后一个结点的指针为空
-
头结点——在单链表中的第一个结点请附设的一个结点
相较于顺序表的优点:
-
不用定义时规定长度
-
存储的元素个数不受限制
-
插入和删除时,不用移动其他元素
单链表
基本概念
-
链表的每一个结点中包含一个指针域
单链表的读取数据元素
获取第i个结点的数据
-
声明一个结点指针p指向链表第一个结点a_1,初始化j从1开始
-
当j < i 时,遍历链表,让p的指针向后移动,不断指向下一个结点,j累加1
-
如果当链表末尾p为空,则说明第i个元素不存在;否则查找成功,返回结点p的数据
单链表的插入数据元素
在第i个结点之后插入数据元素
-
创建一个空节点,分配内存空间,设置元素数据
-
获取第i个结点,设置新结点的后继结点为该结点的后继结点
-
设置第i个结点的后继点为新结点
提示:
-
插入操作最后最好有插入成功或失败的返回值
-
如果有头结点,并且记录了链表长度,则最后长度也要加1
-
有头结点的单链表插入操作才能统一
单链表删除数据元素
删除第i个结点及其数据元素
-
获取第i个结点,如果该结点不是第一个结点,则获取第i-1个结点
-
将第i-1个结点的后缀结点设为第i个结点的后缀结点
-
删除第i个结点,释放内存空间,记录并返回删除的数据元素的值
-
最后 整体-1
删除单链表整张表
销毁单链表,释放内存空间
-
声明结点p和q
-
将第一个结点赋值给p
-
循环将下一个结点赋值给q,释放p,将q赋值给p
void clearList(LinkList *L){ LinkList p,q; p = (*L)->next;//p为第一个结点 while(p){ q = p->next; free(p); p = q; } (*L)->next = NULL; }
单链表VS顺序表