上一篇静态链表的博客转载部分, 原稿则是出自<大话数据结构>一书, 有兴趣的可以去参考这本书,很适合初学者进行学习。因为在实现上不理解在初始化静态链表的时候初始化最后一个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 |