本文实例为大家分享了C++实现静态链表的具体代码,供大家参考,具体内容如下
一、动态链表和静态链表区别:
(1)动态链表:

(2)静态链表: 应用:二叉树

二、思路:
1.结点设置:T data;
int link;
2.链表要用一个avil来保存可分配空间的首地址;
3.初始化:引入头结点:elem[0];
头结点先指向空NULL, 用-1表示;
avil存储空分配的空间的首地址1;
然后让其它可分配空间的结点的link指向坐标大一的结点;
三、实现程序:
?| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
#ifndef StaticList_h
#define StaticList_h
const int maxSize = 100; // 静态链表大小
template <class T>
struct SLinkNode {
T data; // 结点数据
int link; // 结点链接指针
};
template <class T>
class StaticList {
public:
void InitList(); // 初始化
int Length(); // 计算静态链表的长度
int Search(T x); // 在静态链表中查找具有给定值的结点
int Locate(int i); // 在静态链表中查找第i个结点
bool Append(T x); // 在静态链表的表尾追加一个新结点
bool Insert(int i, T x); // 在静态链表第i个结点后插入新结点
bool Remove(int i); // 在静态链表中释放第i个结点
bool isEmpty(); // 判链表空否?
private:
SLinkNode<T> elem[maxSize];
int avil; // 当前可分配空间首地址
};
template <class T>
void StaticList<T>::InitList() {
// 初始化
elem[0].link = -1;
avil = 1;
// 当前可分配空间从1开始建立带表头结点的空链表
for(int i = 1; i < maxSize - 1; i++)
elem[i].link = i + 1; // 构成空闲链接表
elem[maxSize-1].link = -1;
}
template <class T>
int StaticList<T>::Length() {
// 计算静态链表的长度
int p = elem[0].link;
int i = 0;
while(p != -1) {
p = elem[p].link;
i++;
}
return i;
}
template <class T>
int StaticList<T>::Search(T x) {
// 在静态链表中查找具有给定值的结点
int p = elem[0].link; // 指针p指向链表第一个结点
while(p != -1) { // 逐个结点检测查找给定的值
if(elem[p].data == x)
break;
else
p = elem[p].link;
}
return p;
}
template <class T>
int StaticList<T>::Locate(int i) {
// 在静态链表中查找第i个结点
if(i < 0) // 参数不合理
return -1;
if(i == 0)
return 0;
int j = 1, p = elem[0].link;
while(p != -1 && j < i) { // 循链查找第i号结点
p = elem[p].link;
j++;
}
return p;
}
template <class T>
bool StaticList<T>::Append(T x) {
// 在静态链表的表尾追加一个新结点
if(avil == -1) // 没有分配到存储空间
return false;
int q = avil; // 分配结点
avil = elem[avil].link; // 指向下一个可分配的结点
elem[q].data = x;
elem[q].link = -1;
int p = 0;
// 查找表尾
while(elem[p].link != -1)
p = elem[p].link;
elem[p].link = q; // 追加
return true;
}
template <class T>
bool StaticList<T>::Insert(int i, T x) {
// 在静态链表第i个结点后插入新结点
int p = Locate(i);
if(p == -1) // 找不到结点
return false;
int q = avil; // 分配结点
avil = elem[avil].link;
elem[q].data = x;
elem[q].link = elem[p].link; // 链入
elem[p].link = q;
return true;
}
template <class T>
bool StaticList<T>::Remove(int i) {
// 在静态链表中释放第i个结点
int p = Locate(i-1);
if(p == -1) // 找不到结点
return false;
int q = elem[p].link; // 第i号结点
elem[p].link = elem[q].link;
elem[q].link = avil; // 释放,让q的link指向原可分配的结点
avil = q; // avil指向q
return true;
}
template <class T>
bool StaticList<T>::isEmpty() {
// 判链表空否?
if(elem[0].link == -1)
return true;
return false;
}
#endif /* StaticList_h */
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/chuanzhouxiao/article/details/85992920








发表评论
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。