#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;
}