静态链表的实现 部分完善
2014-08-13 16:27
120 查看
上一篇静态链表的博客转载部分, 原稿则是出自<大话数据结构>一书, 有兴趣的可以去参考这本书,很适合初学者进行学习。因为在实现上不理解在初始化静态链表的时候初始化最后一个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, 不多说了.........................
以下部分是自己的代码实现,原因是觉得原文中有部分处理的不合理的部分做了相关 修改,有不妥的地方烦请指点。
= 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 |
相关文章推荐
- 利用C++模板,代替虚函数,实现类的静态多态性(加入性能测试部分)
- java双向链表的实现(部分功能)
- java实现链表指定值得删除,查找第二部分代码
- 含有头结点的单链表,实现部分功能,希望大家能够给予指点
- C实现 LeetCode->Rotate List(双指针大法)(单链表 部分旋转)
- 单链表的顺序实现例程[静态分配存储空间]
- C语言实现单链表的基本操作及其部分面试题
- RSA算法(部分实现,逐步完善)
- 紧凑的多重数组的静态双向链表实现
- 数据结构(12)--二叉树的静态链表存储和遍历的实现
- 链表类(实现IEnumerable)【附部分讲解】
- 利用C++模板,代替虚函数,实现类的静态多态性(加入性能测试部分)
- 静态链表。实现。
- javascript实现数据结构与算法系列:线性表的静态单链表存储结构
- 利用C++模板,代替虚函数,实现类的静态多态性(加入性能测试部分)
- QQ 静态截图完善实现之改造 CRectTracker 类
- 相对静态的链表实现
- 静态链表 C实现
- 有序链表的部分实现
- (转)java实现基本数据结构(堆,栈,链表)——推荐后面的链表扩展部分