《大話數據結構》之靜態鏈表

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


發佈了53 篇原創文章 · 獲贊 10 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章