C++ 靜態連結串列
阿新 • • 發佈:2019-01-07
一、動態連結串列和靜態連結串列區別:
(1)動態連結串列:
(2)靜態連結串列: 應用:二叉樹
二、思路:
1.結點設定:T data;
int link;
2.連結串列要用一個avil來儲存可分配空間的首地址;
3.初始化:引入頭結點:elem[0];
頭結點先指向空NULL, 用-1表示;
avil儲存空分配的空間的首地址1;
然後讓其它可分配空間的結點的link指向座標大一的結點;
三、實現程式:
#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 */