静态链表
//静态表
/*space[0].cur为头指针,“0表示空指针”*/
typedef struct
{
ElemType data;
int cur;
} Component,StaticLinkList[MAXSIZE];
Status InitList(StaticLinkList space)
{
int i;
for (i = 0; i < MAXSIZE - 1; i++)
{
space[0].cur = i + 1;
}
space[MAXSIZE - 1].cur = 0;
return OK;
}
int Malloc_SLL(StaticLinkList space)
{/*第一个元素的cur存放的是备用链表的第一个结点的下标*/
int i = space[0].cur;//当前数组第一个元素的cur存的值
/*就是要返回的第一个备用空闲的下标*/
if (space[0].cur)
{
space[0].cur = space[i].cur;/*由于要拿出一个分量使用,
所以我们就得把它的下一个分量用来做备用*/
}
return i;/*它返回的就是第一个空闲的下标*/
}
int Free_SSL(StaticLinkList space,int k)
{//将下标为k的空间结点收回到备用结点
/*space[k].cur = space[0].cur;
space[0].cur = k*/;
space[k].cur = space[0].cur;/*把第一个元素的cur值赋给要删除的分量cur*/
space[0].cur = k;/*把要删除的分量下标赋给第一个元素的cur*/
}
int ListLength(StaticLinkList space)
{
int i = 0;
int j = space[MAXSIZE - 1].cur;
while (j)
{
j = space[j].cur;
i++;
}
return i;
}
Status ListInsert(StaticLinkList L, int i, ElemType e)
{
int j, k, l;
k = MAXSIZE - 1;/*k首先是最后一个元素的下标,
最后一个元素的cur用来存放第一个插入元素的下标,相当于头结点*/
if (i<1 || i>ListLength(L) + 1)
return ERROR;
j = Malloc_SLL(L);/*获得空闲分量的下标*/
if (j)
{
L[j].data = e;/*将数据赋值给分量的data*/
for (l = 1; l < i - 1; l++)/*找到第i个元素之前的位置*/
k = L[k].cur;
L[j].cur = L[k].cur;/*把第i个元素之前的cur赋值给新的元素的cur*/
L[k].cur = j;/*把新元素的下标赋值给第i个元素之前元素的cur*/
return OK;
}
return ERROR;
}
Status ListDelete(StaticLinkList L, int i)
{/*删除在L中第i个数据元素e*/
int j, k;
if (i<1 || i>ListLength(L))
return ERROR;
k = MAXSIZE - 1;
for (j = 1; j <= i - 1; j++)/*找到第i个元素之前的那个元素*/
k = L[k].cur;
j = L[k].cur;
L[k].cur = L[j].cur;
Free_SSL(L, j);
return OK;
}