静态链表简单来说是指用数组型描述的链表
数组中为了达到和指针一样的效果,用到了游标 cur ,例如: S[0].cur 是指头节点的第一个元素 或者 i = s [0].sur 和 p = p -> next 相似的效果。
在静态链表中实现LocatElem 函数的效果 算法可以表示为:
// 2020.7.25 飞飞飞 LocalElem_LC() 函数
int LocalElem_LC (SLinkList &S , ElemYype &e){
//在S的链表中 找到第一个和e相等的数组位序
i = S[0].cur ;
while (i && S[i].data != e)
i = S [i].cur ; //p = p -> next
return i ;
}
由于静态链表和单链表的不同,需要用户自己实现 malloc 和 free 函数
例如,以集合运算(A - B)U(B - A)的算法的实现:
1. 定义一个 InitSpace_LC() 数组成静态链表函数
// 2020.7.25 飞飞飞 InitSpace_LC() 数组成静态链表函数
void InitSpace_LC (SlinkList &space){
for (i =0 ; i < MAXSIZE - 1 ; i ++){
space[i].cur = i + 1 ;
}
space[MAXSIZE - 1].cur = 0 ; //空指针
}
2. 定义一个 Molloc_LC() 开辟静态链表结点函数
int Molloc_LC (SlinkList & space){
i = space [0].cur ;
if(space[0].cur){
space[0].cur = space[i].cur ;
}
return i ;
}
3.实现(A - B)U(B - A)算法函数
// 2020.7.25 飞飞飞 different() 实现(A - B)U(B - A)算法函数
void different(SlinkList &sapce , int &S){
//实现 (A - B)U(B - A) 的算法函数
InitSpace_LC(space) ; //初始化备用空间
Molloc_LC (space) ; //初始化备用空间的结点
S = Molloc_LC(space) ; //S 指向头节点
r = S ;
scanf(m , n) ;//A B 集合分别的数量
for(j =0 ; j < m - 1 ;j ++){
i = Molloc_LC (space) ;
scanf(space[i].data) ;
space[r].cur = i ;
r = i ;
} space[r].cur = 0 ;//尾结点的cur空 ,以上是实现把A放到 space 静态链表里
for(j = 0 ; j < n -1 ; j ++){
scanf(b); //B element
p = S ;
k = space[S].cur ; //定义类似指针 方便找到相同的元素进行删除操作
while (space[k].data != b && k != space[r].cur){
p = k ;
k = space[k].cur ; //利用双重循环查找 ,时间复杂度 O(m*n)
}
if(k == space[r].cur){
i = Molloc_LC (space) ; //找到底没有找到一样的,开辟结点。定义数据域
space[i].data = b ;
space[i].cur = space[r].cur ; //放到space静态链表的后面
space[r].cur = i ;
r = i ; //重新定义尾节点的指针
}
else
{
space[p].cur = space[k].cur ; //找到了结点一样,删除
if(r == k)
p = space[r].cur ;
r = p ; //尾节点的指针
}
}
}
以上没有定义Free函数 需要定义后在删除的后面添加