上一篇靜態鏈表的博客轉載部分, 原稿則是出自<大話數據結構>一書, 有興趣的可以去參考這本書,很適合初學者進行學習。因爲在實現上不理解在初始化靜態鏈表的時候初始化最後一個cur爲0,大家都知道靜態鏈表實際上是用首尾的兩個元素進行了兩個類似鏈表的隊列維護。如果只是初始化了一個0(space[MAX_SIZE-1].cur = 0 ;這一行),ps:0的意思是結束標誌,最後這個0是鏈表隊列的結束標誌,那空閒鏈表的隊列結束改如何辦?
舉個例子:
假設MAX_SIZE = 3;
那麼初始化之後 數組的cur情況就是 space[0].cur=1, space[1].cur=2,space[2].cur=0;
當插入一個節點後則數組的cur情況就變成了 space[0].cur=2, space[1].cur=0, space[2].cur=1; 因爲只有一個空間所以肯定是space[1]被存放新節點, 然而此時我們會發現空間已經用盡了,但是這時候你再去嘗試malloc,即去添加下的節點插入。此時因爲space[0]是維護空閒隊列,但是此時space[0].cur == 2,按道理來講它應該是0纔對。這樣2就被當成空閒節點進行了操作,更可氣的是,space[2]被覆蓋後會這樣,space[2].cur=2 , so, 不多說了.........................
以下部分是自己的代碼實現,原因是覺得原文中有部分處理的不合理的部分做了相關 修改,有不妥的地方煩請指點。
#include <iostream>
#define MaxSize 10
typedef int DataType;
enum{OK, ERROR, FAILED};
typedef struct Node
{
DataType data;
int cur;
}StaticLinkList[MaxSize];
// 初始化靜態鏈表
int InitStaticLinkList(StaticLinkList list)
{
if (MaxSize <= 2)
return ERROR;
for (int i = 0; i < MaxSize-2; i++)
list[i].cur = i+1;
list[MaxSize-1].cur = 0;
list[MaxSize-2].cur = 0;
}
// 爲需要添加的節點申請位置
int mallocSpace(StaticLinkList list)
{
int index = list[0].cur;
if (index)
list[0].cur = list[index].cur;
return index;
}
// 取得鏈表長度
int Length(StaticLinkList list)
{
int len = 0;
int key = list[MaxSize-1].cur;
while(key)
{
len++;
key = list[key].cur;
}
return len;
}
// 在第pos個節點前插入節點val
int Push(StaticLinkList list, int pos, DataType val)
{
if (pos < 1 || pos > Length(list)+1)
{
std::cout << "The pos error and push failed~" << std::endl;
return ERROR;
}
int index = mallocSpace(list);
if (!index)
{
std::cout << "Push malloc space failed ~" << std::endl;
return FAILED;
}
int key = MaxSize-1;
list[index].data = val;
for (int i = 0; i < pos-1; i++)
key = list[key].cur;
list[index].cur = list[key].cur;
list[key].cur = index;
return OK;
}
// 歸還釋放的節點信息
void freeSpace(StaticLinkList list, int idx)
{
list[idx].cur = list[0].cur;
list[0].cur = idx;
}
void Print(StaticLinkList list)
{
int key = list[MaxSize-1].cur;
std::cout << "cur static linklist length " << Length(list) << std::endl;
while(key)
{
std::cout << list[key].data << " ";
key = list[key].cur;
}
std::cout << std::endl;
}
// 刪除第pos個節點
int Pop(StaticLinkList list, int pos)
{
if (pos < 1 || pos > Length(list))
{
std::cout << "The pos error and push failed~" << std::endl;
return ERROR;
}
int key = MaxSize-1;
for (int i = 0; i < pos-1; i++)
{
key = list[key].cur;
}
int delIdx = list[key].cur;
list[key].cur = list[delIdx].cur;
freeSpace(list, delIdx);
return OK;
}
space[0].cur = 1 | space[1].cur=2 | space[2].cur = 0 |
space[0].cur = 1 |