C++實(shí)現(xiàn)靜態(tài)鏈表
本文實(shí)例為大家分享了C++實(shí)現(xiàn)靜態(tài)鏈表的具體代碼,供大家參考,具體內(nèi)容如下
一、動態(tài)鏈表和靜態(tài)鏈表區(qū)別:
(1)動態(tài)鏈表:
![]()
(2)靜態(tài)鏈表: 應(yīng)用:二叉樹

二、思路:
1.結(jié)點(diǎn)設(shè)置:T data;
int link;
2.鏈表要用一個(gè)avil來保存可分配空間的首地址;
3.初始化:引入頭結(jié)點(diǎn):elem[0];
頭結(jié)點(diǎn)先指向空NULL, 用-1表示;
avil存儲空分配的空間的首地址1;
然后讓其它可分配空間的結(jié)點(diǎn)的link指向坐標(biāo)大一的結(jié)點(diǎn);
三、實(shí)現(xiàn)程序:
#ifndef StaticList_h
#define StaticList_h
const int maxSize = 100; // 靜態(tài)鏈表大小
template <class T>
struct SLinkNode {
T data; // 結(jié)點(diǎn)數(shù)據(jù)
int link; // 結(jié)點(diǎn)鏈接指針
};
template <class T>
class StaticList {
public:
void InitList(); // 初始化
int Length(); // 計(jì)算靜態(tài)鏈表的長度
int Search(T x); // 在靜態(tài)鏈表中查找具有給定值的結(jié)點(diǎn)
int Locate(int i); // 在靜態(tài)鏈表中查找第i個(gè)結(jié)點(diǎn)
bool Append(T x); // 在靜態(tài)鏈表的表尾追加一個(gè)新結(jié)點(diǎn)
bool Insert(int i, T x); // 在靜態(tài)鏈表第i個(gè)結(jié)點(diǎn)后插入新結(jié)點(diǎn)
bool Remove(int i); // 在靜態(tài)鏈表中釋放第i個(gè)結(jié)點(diǎn)
bool isEmpty(); // 判鏈表空否?
private:
SLinkNode<T> elem[maxSize];
int avil; // 當(dāng)前可分配空間首地址
};
template <class T>
void StaticList<T>::InitList() {
// 初始化
elem[0].link = -1;
avil = 1;
// 當(dāng)前可分配空間從1開始建立帶表頭結(jié)點(diǎn)的空鏈表
for(int i = 1; i < maxSize - 1; i++)
elem[i].link = i + 1; // 構(gòu)成空閑鏈接表
elem[maxSize-1].link = -1;
}
template <class T>
int StaticList<T>::Length() {
// 計(jì)算靜態(tài)鏈表的長度
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) {
// 在靜態(tài)鏈表中查找具有給定值的結(jié)點(diǎn)
int p = elem[0].link; // 指針p指向鏈表第一個(gè)結(jié)點(diǎn)
while(p != -1) { // 逐個(gè)結(jié)點(diǎn)檢測查找給定的值
if(elem[p].data == x)
break;
else
p = elem[p].link;
}
return p;
}
template <class T>
int StaticList<T>::Locate(int i) {
// 在靜態(tài)鏈表中查找第i個(gè)結(jié)點(diǎn)
if(i < 0) // 參數(shù)不合理
return -1;
if(i == 0)
return 0;
int j = 1, p = elem[0].link;
while(p != -1 && j < i) { // 循鏈查找第i號結(jié)點(diǎn)
p = elem[p].link;
j++;
}
return p;
}
template <class T>
bool StaticList<T>::Append(T x) {
// 在靜態(tài)鏈表的表尾追加一個(gè)新結(jié)點(diǎn)
if(avil == -1) // 沒有分配到存儲空間
return false;
int q = avil; // 分配結(jié)點(diǎn)
avil = elem[avil].link; // 指向下一個(gè)可分配的結(jié)點(diǎn)
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) {
// 在靜態(tài)鏈表第i個(gè)結(jié)點(diǎn)后插入新結(jié)點(diǎn)
int p = Locate(i);
if(p == -1) // 找不到結(jié)點(diǎn)
return false;
int q = avil; // 分配結(jié)點(diǎn)
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) {
// 在靜態(tài)鏈表中釋放第i個(gè)結(jié)點(diǎn)
int p = Locate(i-1);
if(p == -1) // 找不到結(jié)點(diǎn)
return false;
int q = elem[p].link; // 第i號結(jié)點(diǎn)
elem[p].link = elem[q].link;
elem[q].link = avil; // 釋放,讓q的link指向原可分配的結(jié)點(diǎn)
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 */
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語言中輸入函數(shù)(scanf()、fgets()和gets())的區(qū)別詳解
這篇文章主要給大家介紹了關(guān)于C語言中三種輸入函數(shù)(scanf()、fgets()和gets())區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11
淺理解C++ 人臉識別系統(tǒng)的實(shí)現(xiàn)
這篇文章主要介紹了淺理解C++ 人臉識別系統(tǒng)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
C++中sort()函數(shù)和priority_queue容器中比較函數(shù)的區(qū)別詳析
C++中sort()和priority_queue都能自定義比較函數(shù),其中sort()自定義的比較函數(shù)比較好理解,priority_queue中自定義的比較函數(shù)的效果和sort()是相反的,這篇文章主要給大家介紹了關(guān)于C++中sort()函數(shù)和priority_queue容器中比較函數(shù)的區(qū)別的相關(guān)資料,需要的朋友可以參考下2023-03-03

