1. 程式人生 > >C++ 靜態連結串列

C++ 靜態連結串列

一、動態連結串列和靜態連結串列區別:

 (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 */