静态链表
补充一下之前的理解,感觉怪怪的。
LinkList&La,表示La就是理解为头结点。
补充一下知识点:
pa?pa:pb;
if(pa)
pa->next = pa
else
pc->next = pb
需要重点理解的盖面:
1.备用链表
2.游标
//一维数组来描述线性链表:
//----------线性表的静态单链表存储结构-----
#define MAXSIZE 1000//链表的最大长度
typedef struct
{
ElemType data;
int cur;
}component,SLinkList[MAXSIZE];
假设S为SLinkList型变量
(1)S[0].cur 指示第一个结点在数组中的位置
(2)设i=S[0].cur,则S[i].data存储线性表中的第一个数据元素
(3)s[i].cur指示第二个结点在数组中的位置
一般情况:第i个分量表示链表的第k个节点。
S[i].cur指示第k+1个结点的位置。
静态链表中实现线性表的操作和动态链表相似
以整型游标i代替动态指针p。
i = S[i].cur的操作实为指针后移,类似于p=p->next
///////////////////////////////////////////////
//静态链表中实现定位函数的LocateElem如下算法所示:
int LocateElem_SL(SlinkList S,ELemType e)
{
//在静态单链性表L中查找第一个值为e的元素。
//若找到,则返回它在L中的位序,否则返回0。
i = S[0].cur; //i指示表中第一个结点
while(i&&s[i].data!=e)i=S[i].cur;
return i;
}//LocateElem_SL
静态链表的插入:
将所有未被使用过的以及被删除的分量用游标链成一个备用的链表
每当进行插入时便可从未被使用过的以及第一个结点作为待插入的新节点
反之在删除时将从链表中删除的结点连接到备用链表上。
运算集合(A-B)U(B-A)为例进行静态链表的算法
过程:假设由终端输入集合元素,
(1)先建立表示集合A的静态链表S
(2)而后在输入集合B的元素查找S表
(3)若存在和B相同的元素,则从S表中删除之,否则将此元素插入S表
为了安全,我们分为三个过程:
1_将整个数组空间初始化一个链表
2_从备用空间取得一个结点
3_将空闲结点链接到备用链表上,分表如算法所示
void InitSpace_SL(SLink &space)
{
//将一维数组space的各分量链成一个备用链表,space[0].cur为头指针
//"0"表示空指针
for(i=0;i<MAXSIZE-1;++i)space[i].cur = i+1; //是不是移动位置
space[MAXSIZE-1].cur = 0'
}// InitSpace_SL
int Malloc_SL(SLlink&space)
{
//若备用空间链表非空,则返回分配结点的下标,否则返回0
i = space[0].cur;//把第几个节点给i
if(space[0].cur) space[0].cur = space[i].cur;
return i;
}// Malloc_SL
int Free_SL(Slinklist &space ,int k)
{
//将下标为k的空闲结点回收到备用链表中
space[k].cur = space[0].cur;
space[0].cur = k;
}//Frel_SL