静态链表
对于没有指针的语言,通过数组表示链表,数组每个元素由data和cur组成。data保存数组元素数据,cur相当于next,用于保存下一个数组元素下标。
静态链表
静态链表结构的代码表示
#define MAX_SIZE 1000
typedef int ElemType;
typedef struct {
ElemType data;
int cur;
}Component, StaticLinkList[MAX_SIZE];
静态链表的初始化
void InitLinkList (StaticLinkList space) {
int i;
for(int i = 0; i < MAX_SIZE; i++){
space[i].cur = i + 1;
}
space[i - 1].cur = 0;//0表示无指向
}
静态链表的插入
需要模拟动态分配内存。
因此还需要准备一个备用链表,用于存放空的和已经删除的位置,每次需要插入时则选取备用列表的第一个位置所记录的位置进行插入。
模拟动态分配内存
int malloc_SLL(StaticLinkList space) {
int i = space[0].cur;//第一个元素的备用空闲的下标
if (space[0].cur)
{
space[0].cur = space[i].cur;//拿出她的下一个cur作为备用
}
return i;
}
插入
int ListLength(StaticLinkList array)
{
int i = array[MAX_SIZE - 1].cur;
int j = 0;
while (i)
{
i = array[i].cur;
++j;
}
return j;
}
void ListInsert(StaticLinkList L, int i, ElemType e){
int j, k, l;
k = MAX_SIZE - 1;
if (i<1 || i > ListLength(L) + 1)
exit(0);
j = malloc_SLL(L);
if (j) {
L[j].data = e;
for (l = 1; 1 <= i - 1; l++) {
k = L[k].cur;
}
L[j].cur = L[k].cur;
L[k].cur = j;
}
else
{
exit(0);
}
}
静态链表的删除
void ListDelete(StaticLinkList L, int i) {
int j, k;
if (i < 1 || i > ListLength(L))
{
exit(0);
}
k = MAX_SIZE - 1;
for (j = 1; j <- i-1; j++)
{
k = L[k].cur;
}
j = L[k].cur = L[j].cur;
Free_SSL(L, j);
}
void Free_SSL(StaticLinkList space, int k) {
space[k].cur = space[0].cur;
space[0].cur = k;
}