静态链表(
StaticLinkedList
)是利用一组地址连续的内存空间来描述线性链表,
把数组元素作为存储结点,数组元素类型包含数值域
data
和游标指示器
cur
。游 标定
义为整型,指示结点在数组中的相对位置。通常下标为零的元素被看成是头 结点,
其游标指示器指示线性链表的第一个结点。这种存储结构同样具有链式存 储结构
的主要优点,即在插入和删除元素时只需要修改游标而不用移动元素,但 也有一些
缺点,例如要预先分配一个较大的空间。静态链表描述如下:
#defineMAXSIZE1000typedefstruct{ ElemTypedata;
intcur;
}component,List_St[MAXSIZE];
在静态链表中,福入、删除元素的算法为修改游标,与单链表中要通过修改指 针实
现插入、删除操作不同的是,
malloc
和
free
两个函数使用的是静态链表本 身的已声明
的空间,即静态链表中未使用的局部,静态链表的这个局部称为''备 用链表〃。
设
S
为
List_St
型变量,如图
2.8, S[l]
为线性表的头结点(“〃为该结点的游标, 即头
指针),
i=S[l].cu
「为第一个结点的位置,
S[i].data
存储线性表的第一个元 素,
S[i].cur
指示第二个结点的位置。一般地,假设
i
指示第
k
个结点位置,那么
S[i].data
为第
k
个结
点的值,
S[i],cu
「为下一结点(第
k+1
个结点)的位置。对于备用链 表(也带有头结
点,通常为
S[0]
)
,
我们可以通过
S[O].cur
指向备用链表的第 一个结点,如图
2.8,
游标
指示器指向
S[8],
那么
S[8]
是备用链表的第一个结点, 而后通过每个结点的游标将备
用链表的结点连接起来。下面我们将给出几个典型 的静态链表操作的算法。
1头指针
缶刖信我的 第一个结点
<!~[if!supportLineBreakNewLine]~>
<!~[endif]~>
将整个数组空间初始化成一个空闲链表
voidInitSpace_St
(
List_St&S
)
{
〃将一维数组
S
中各分量链成一个备用链表
//S[O].cur
指向备用链表的第一个结
点
〃。为空闲链表头指针
for(i=0;i<MAXSIZE-l;++i)S[i]. cur=i+l;
S[MAXSIZE-1].cur=O;
}//InitSpace_St
算法
2~18
空闲链表的初始化算法