第三章 线性表---链式存储结构(静态链表)
用数组描述的链表叫做静态链表(也叫游标实现法)
数组的元素由两个数据域组成,data和cur,也就是说,数组的每个下标都对应一个data和一个cur,数据域data,用来存放数据元素,游标cur相当于单链表中的next指针,存放该元素的后继在数组中的下标
![第三章 线性表---链式存储结构(静态链表) - 影魔 - 影魔的博客](http://dl2.iteye.com/upload/attachment/0111/4046/3aa2b1ea-fb49-383c-9249-d6eac4cfc2b9.png)
![第三章 线性表---链式存储结构(静态链表) - 影魔 - 影魔的博客](http://dl2.iteye.com/upload/attachment/0111/4048/c07300dc-b12b-30c0-8f5e-7a17dece479d.png)
我们对数组的第一个和最后一个元素作为特殊元素处理,不存数据。我们通常把未被使用的数组元素称为备用链表,而数组第一个元素,即下标为0的元素的cur就存放备用链表的第一个结点的下标,而数组的最后一个元素的cur则存放第一个有数值的元素的下标,相当于单链表中的头结点的作用,当整个链表为空时,则为02。
![第三章 线性表---链式存储结构(静态链表) - 影魔 - 影魔的博客](http://dl2.iteye.com/upload/attachment/0111/4050/d1e8ceb4-5d96-3680-a59a-1649bc76a753.png)
实例演示:
![第三章 线性表---链式存储结构(静态链表) - 影魔 - 影魔的博客](http://dl2.iteye.com/upload/attachment/0111/4052/d1b6975a-4c1b-3ae1-9c84-6f8a163f359d.png)
上图中,在乙和丁之间插入丙。
(1)动态链表中,结点的申请使用的是malloc()函数。在静态链表中,操作的是数组,因此必须自己实现这样的函数,用来做插入操作。
解决办法:将所有未被使用过的及已被删除的分量用游标链成一个备用链表。每当插入时,从备用链表上取得第一个结点作为待插入的新结点。
(2)插入的算法如下:
三、删除
例子:上图中,删除甲。
(1)动态链表中,结点的申请使用的是free()函数。在静态链表中,操作的是数组,因此必须自己实现这样的函数,用来做删除操作。
其中,j=L[999].cur=1, L[k].cur=L[j].cur,即:L[999].cur=L[1].cur=2。意思是:甲已删除,现在乙是第一个元素。
代码中的:Free_SSL(L,j);如下。
代码中,space[1].cur=space[0].cur=8,意思是:把8给“甲”所在下标为1的分量的cur。space[0].cur=k=1,意思是:让删除的位置成为第一个优先空位,把它存入第一个元素(下标为0)处的cur中。
![第三章 线性表---链式存储结构(静态链表) - 影魔 - 影魔的博客](http://dl2.iteye.com/upload/attachment/0111/4054/f938fbe4-bbc4-31a0-9681-3cfe5ae92b43.png)
(1)动态链表中,结点的申请使用的是malloc()函数。在静态链表中,操作的是数组,因此必须自己实现这样的函数,用来做插入操作。
解决办法:将所有未被使用过的及已被删除的分量用游标链成一个备用链表。每当插入时,从备用链表上取得第一个结点作为待插入的新结点。
![第三章 线性表---链式存储结构(静态链表) - 影魔 - 影魔的博客](http://dl2.iteye.com/upload/attachment/0111/4056/56bbc603-8a2f-31f5-a970-0e614555f40e.png)
![第三章 线性表---链式存储结构(静态链表) - 影魔 - 影魔的博客](http://dl2.iteye.com/upload/attachment/0111/4058/07c413d3-e5cb-3872-89c9-7a2806d39b2b.png)
(2)插入的算法如下:
![第三章 线性表---链式存储结构(静态链表) - 影魔 - 影魔的博客](http://dl2.iteye.com/upload/attachment/0111/4060/5078f82e-a061-34ba-a640-9eac4865a0ca.png)
![第三章 线性表---链式存储结构(静态链表) - 影魔 - 影魔的博客](http://dl2.iteye.com/upload/attachment/0111/4062/4dde1d0f-b3e5-3492-800a-54f1898ec5a3.png)
三、删除
例子:上图中,删除甲。
![第三章 线性表---链式存储结构(静态链表) - 影魔 - 影魔的博客](http://dl2.iteye.com/upload/attachment/0111/4064/63e01133-2e0d-3c48-bfac-21a2a42f7aad.png)
(1)动态链表中,结点的申请使用的是free()函数。在静态链表中,操作的是数组,因此必须自己实现这样的函数,用来做删除操作。
![第三章 线性表---链式存储结构(静态链表) - 影魔 - 影魔的博客](http://dl2.iteye.com/upload/attachment/0111/4066/b6c7fc5c-6097-34fd-bd50-feeeb00c6970.png)
![第三章 线性表---链式存储结构(静态链表) - 影魔 - 影魔的博客](http://dl2.iteye.com/upload/attachment/0111/4068/4b80467a-1cd8-31e5-b0fd-89582593bd42.png)
其中,j=L[999].cur=1, L[k].cur=L[j].cur,即:L[999].cur=L[1].cur=2。意思是:甲已删除,现在乙是第一个元素。
代码中的:Free_SSL(L,j);如下。
![第三章 线性表---链式存储结构(静态链表) - 影魔 - 影魔的博客](http://dl2.iteye.com/upload/attachment/0111/4070/a66daffd-61fa-3153-9ee2-dca4b24ccf31.png)
代码中,space[1].cur=space[0].cur=8,意思是:把8给“甲”所在下标为1的分量的cur。space[0].cur=k=1,意思是:让删除的位置成为第一个优先空位,把它存入第一个元素(下标为0)处的cur中。
![第三章 线性表---链式存储结构(静态链表) - 影魔 - 影魔的博客](http://dl2.iteye.com/upload/attachment/0111/4064/63e01133-2e0d-3c48-bfac-21a2a42f7aad.png)
静态链表的优缺点
优点:
# 在插入和删除操作时,只需要修改游标,不需要移动元素,从而改进了顺序存储结构中的插入和删除操作需要移动大量元素的缺点
缺点:
# 没有解决连续存储分配带来的表长难以确定的问题
# 失去了顺序存储结构随机存取的特性