#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int ElemType;
#define MAXSIZE 1000
typedef struct
{
ElemType data;
int cur;
}Component;
Component StaticLinkList[MAXSIZE];
//将一维数组space中各分量链成一备用链表
Status InitList(StaticLinkList space)
{
int i;
for(i=0;i<MAXSIZE-1;i++)
{
space[i].cur = i+1;
}
space[MAXSIZE-1].cur = 0;
return OK;
}
//获取备用链表的首位下标,并调整备用链表的位置
int Malloc_SLL(StaticLinkList space)
{
int i = space[0].cur;
if(space[0].cur)
{
space[0].cur = space[i].cur;
}
return i;
}
//将数值e插入链表L的第i位之前
//当插入首元素时,i的值为1,非空链表的最后一个元素时0号元素
Status ListInsert(StaticLinkList L,int i,ElemType e)
{
int j,k,l;
k = MAXSIZE - 1;
if(i < 1 || i > ListLength(L) + 1)
{
return ERROR;
}
j = Malloc_SSL(L);
if(j)
{
L[j].data = e;
//L[MAXSIZE-1].cur存放的是第一个有数值的下标
for(l = 1;l<=i-1;l++)
{
k = L[k].cur;
}
L[j].cur = L[k].cur;//此时k=i-1
L[k].cur = j;
return OK;
}
return ERROR;
}
//删除L中第i个数据元素e
Status ListDelete(StaticLinkList L,int i)
{
int j,k;
if(i<1 || i>ListLength(L))
{
return ERROR;
}
k = MAXSIZE - 1;
for(j=1;j<=i-1;j++)
{
k = L[k].cur;
}
j = L[k].cur;
L[k].cur = L[j].cur;
Free_SSL(L,j);
return OK;
}
//将下标为k的空闲节点回收到备用链表,插在备用链表表头
void Free_SSL(StaticLinkList space,int k)
{
space[k].cur = space[0].cur;
space[0].cur = k;
}
int ListLength(StaticLinkList L)
{
int j = 0;
int i = L[MAXSIZE-1].cur;
while(i)
{
i = L[i].cur;
j++;
}
return j;
}
个人认为上述代码实现并不好,我理解下来,整个静态链表的逻辑结构图是这样的
下面是我修改后的代码
/*
个人认为如下方法更好,将有数据的链表和空闲链表分开,互不影响
初始化是有数据的链表只是单个节点
分配节点后初始化节点的cur,避免初始化的影响
*/
Status InitList(StaticLinkList space)
{
int i;
for(i=0;i<MAXSIZE-2;i++)
{
space[i].cur = i+1;
}
space[MAXSIZE-2].cur = -1;
space[MAXSIZE-1].cur = -1;
return OK;
}
int Malloc_SLL(StaticLinkList space)
{
int i = space[0].cur;
if(space[0].cur)
{
space[0].cur = space[i].cur;
}
//初始化新增节点
space[i].cur = -1;
return i;
}
int ListLength(StaticLinkList L)
{
int j = 0;
int i = L[MAXSIZE-1].cur;
while(-1 != i)
{
i = L[i].cur;
j++;
}
return j;
}