线性表的链式存储结构

1. 链式存储

用一组任意的存储单元存储线性表中的数据元素。用这种方法存储的线性表简称线性链表。存储链表中结点的一组任意的存储单元可以是连续的,也可以是不连续的,甚至是零散分布在内存中的任意位置上的。链表中结点的逻辑顺序和物理顺序不一定相同。为了正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其直接后继结点的地址,称为指针或链,这两部分组成了数据元素ai的存储映像链表是通过每个结点的指针域将线性表的n个结点按其逻辑次序链接在一起的。

2. 单链表

每一个结点只包含一个指针域的链表,称为单链表。为操作方便,总是在链表的第一个结点之前附设一个头结点(头指针)head指向第一个结点。头结点的数据域可以不存储任何信息因为最后一个数据元素没有直接后继,所以线性链表中最后一个结点的指针为空(NULL)。

3. 结点的实现  

结点是通过动态分配和释放来的实现,即需要时分配,不需要时释放。实现时是分别使用C语言提供的标准函数:malloc()realloc()sizeof(),free()。动态分配 p=(LNode*)malloc(sizeof(LNode));  函数malloc分配了一个类型为LNode的结点变量的空间,并将其首地址放入指针变量p中。动态释放 free(p) 系统回收由指针变量p所指向的内存区。p必须是最近一次调用malloc函数时的返回值。

4. 头指针和头结点异同

头指针:链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针;头指针具有标识作用,使用常用头指针冠以链表的名字;无论链表是否为空,头指针均不为空。头指针是链表的必要元素。

头结点:为了操作的统一和方便而设立,放在第一元素的结点之前,其数据域一般无意义;有了头结点,对在第一元素结点前插入结点和删除第一结点,其操作与其它结点的操作就统一了;头结点不一定是链表必要要素。

5. 单链表的读取

(1) 按序号查找: 取单链表中的第i个元素。对于单链表,不能象顺序表中那样直接按序号i访问结点,而只能从链表的头结点出发,沿链域next逐个结点往下搜索,直到搜索到第i个结点为止。因此链表不是随机存取结构。设单链表的长度为n,要查找表中第i个结点,仅当1in时,i的值是合法的。

(2) 按值查找: 按值查找是在链表中,查找是否有结点值等于给定值key的结点。若有,则返回首次找到的值为key的结点的存储位置;否则返回NULL。查找时从开始结点出发,沿链表逐个将结点的值和给定值key作比较。

6. 单链表的插入

要想将结点s插入到aiai+1之间,不需要移动数据元素,只需要在aiai+1之间插入一个新的结点,也就是我们要插入的结点s。关键就是要修改结点p的指针域,使得结点s称为其后继。

7. 单链表的删除

删除操作和插入类似,在删除一个结点时,不需要移动元素,仅需要修改相应的指针链接,改变其前驱和后继的关系即可。

8. 顺序存储与链式存储中插入删除

无论是单链表的插入操作还是删除操作,都是由两部分组成的:一是遍历查找第i个元素,二是实现插入或删除操作。就整个算法而言,他们的时间复杂度都是O(n),这样来看的话,再不知道要找的第i个元素所处的位置时,单链表的插入删除操作和顺序存储是没有什么优越性的。但是,如果知道要插入或者删除的元素的位置时,链式存储就表现出它的优越性了。假如我们要在a10a11之间插入10个元素,那么顺序存储每插入一个元素后面的元素就要移动一次位置,每次都是O(n)。而链式存储,只需要第一次时找到要插入的那个位置,后面的就只是赋值移动指针而已,时间复杂度为O(1)。因此:对于插入或者删除操作越频繁的操作,单链表的效率优势就越是明显。

9. 创建单链表的过程就是一个动态生成链表的过程。即从“空表”的初始状态开始,依次建立各元素结点,并逐个插入链表。

单链表整表创建的算法思路:

(1)声明一指针p和计数器变量i

(2)初始化一空链表L

(3)L的头结点的指针指向NULL,即建立一个带头结点的单链表;

(4)循环: --生成一新结点赋值给p--随机生成一数字赋值给p的数据域p->data--p插入到头结点与前一新结点之间

10. 单链表整表删除的算法思路:

(1)声明一指针pq

(2)将第一个结点赋值给p

(3)循环: --将下一节点赋值给q--释放p--q赋值给p

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值