一、线性表的链式存储结构
1.顺序存储结构不足的解决办法
线性表的顺序存储结构,最大的缺点就是插入和删除时候需要移动大量元素,显然需要耗费时间。
2.线性表链式存储结构定义
线性表的链式存储存储结构的特点就是用一组任意存储单元存储线性表的数据元素,
这组存储单元可以是连续的,也可以是不连续的。
这就意味着,这些数据元素可以存在内存未被占用的任意位置。
以前在顺序结构中,每个数据元素只需要存储数据元素就可以了;
现在链式结构中,要存储数据元素(数据域)和存储它的后继元素的存储地址(指针域)。
3.头指针与头结点的异同
结点:一个数据元素,包含数据域和指针域。
头结点:单链表的第一个结点前附设一个结点,这个结点成为头结点。
头结点的数据域不存储任何信息。头结点的指针域指向第一个结点的指针。
是为了操作的统一和方便设立的(对第一元素的插入删除与其他结点就可以相同了)
不一定时链表必须要素。
头指针:链表中第一个结点的存储位置叫做头指针。
整个链表的存取必须从头指针开始进行了,之后的每一个结点,其实就是上一个后继指针所指向的位置。
头指针具有标识作用,所以常常用头指针冠以链表的名字。
不论链表是否为空,头指针都不为空。
头指针是链表的必须要素。
4.线性表链式存储结构代码描述
单链表中,常用C语言的可用结构指针来描述:
//线性表的单链表存储结构
typedef struct Node
{
ElemType data;
struct Node *next;
}Node;
typedef struct Node *LinkList;//定义LinkList
二、单链表
链表的每个结点中只包含一个指针域,就叫单链表。
1.单链表的读取
2.单链表的插入
这里用的C语言的malloc标准函数,它的作用就是生成一个新的结点,其类型和Node是一样的,其实质就是在内存中找一小块空地,准备用来存放e数据s结点。
3.单链表的删除
这段算法代码中,我们又用到了另一个C语言标准函数free。
它的作用就是让系统回收一个Node结点,释放内存。
单链表的插入和删除的时间复杂度都是O(1),。
4.单链表的整表创建
对于单链表而言,它所占用空间的大小和位置是不需要预先分配规定的,可以根据系统的情况和实际情况的需求生成。
所以创建单链表是一个动态生成链表的过程。
即从“空表”的初始状态起,依次建立各元素结点,并插入链表。
(1)头插法:
(2)尾插法:
5.单链表整表删除
就是在内存中将它释放掉,以便流出空间给其他程序或软件使用。
6.单链表结构与顺序存储结构优缺点
(1)存储分配方式
顺序存储结构用一段连续的存储单元依次存储线性表中的数据元素。
单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素
(2)时间性能
a.查找
顺序存储结构O(1)
单链表O(n)
b.插入和删除
顺序存储结构需要平均移动表长一半的元素,时间为O(n)
单链表使用指正,时间为O(1)
。
(3)空间性能
顺序处处结构需要分配存储空间,分大了浪费,分小了发生上溢
单链表不需要给定分配,元素个数也不受限制