1. 程式人生 > >資料結構3----線性表中鏈式結構的其他幾種實現(霜之小刀)

資料結構3----線性表中鏈式結構的其他幾種實現(霜之小刀)

歡迎轉載和引用,若有問題請聯絡
若有問題,請聯絡
Email : [email protected]
QQ:2279557541

前言

  鏈式結構除了上一篇結構中所講的單項鍊表外, 還有另外幾種。按照<大話資料結構>中所說
包括

  • 靜態列表
  • 迴圈連結串列
  • 雙向連結串列

    而在我看來,這幾種連結串列基本沒法獨立成一種資料結構,只是對前面的擴充套件而已,有些甚至都意義不大,比如靜態連結串列。
    下面我來一個一個的介紹

靜態連結串列

  首先,靜態的意思就是連結串列的大小是固定的,連結串列的意思是每一項資料間是需要索引聯絡的
  所以得靜態連結串列的意思就是固定大小的,由索引相互聯絡的資料結構。
  《大話資料結構》住列舉的例子是這樣的:
  在連續的記憶體空間內,以陣列的形式實現,陣列中每個資料的包含要儲存的資料和索引。
 程式碼簡單描述下:
 

    template<class DataType, int max_size>
    class StaticLink
    {
    public:
        struct LinkStu
        {
            DataType m_data;  //儲存資料
            int m_next_idx;   //指向下一個資料元素的陣列下標索引
        };
    private:
        LinkStu m_item_list[max_size]; //用於儲存整個靜態連結串列
        unsigned int
m_size; //整個陣列的大小 };

  在<大話資料結構>這本書中,對這個結構講的比較詳細,由於c和c++還是有些區別的,所以這裡的實現看起來更加的簡潔,而這種結構的示意圖如下所示。

這裡寫圖片描述

  下面來說以下他的新增和刪除操作
  舉個例項
  下圖描述的是一個普通的靜態連結串列的狀態
  這裡寫圖片描述

  然後我們往裡面新增一個數據,舉個特殊的例子,在資料3和資料4之間新增一個數據5
  這裡寫圖片描述
  發現只需要修改其前面一個的索引和後面所有資料的索引即可。
  而刪除一個數據同新增一樣,只不過是個逆過程罷了。

這種結構的意義是什麼呢?書上說的是,插入一個數據只需要修改索引,將索引一個個修改完就好,避免了資料的拷貝。這種看法我是不認同的,因為如果我們把上一章中順序儲存結構儲存的變數型別改為指標,那麼其拷貝的工作量同修改索引基本是一樣的。那麼書中的意思我之能理解為也許是對沒有指標的程式語言說的。

迴圈連結串列

雙向連結串列

這兩種連結串列很常見,其實意思和他字面的意思基本一致。
迴圈連結串列指的是連結串列尾索引到連結串列頭構成的一個環狀的連結串列
雙向連結串列指的是,每個資料節點除了有向後的索引外再加一個向前的索引。
具體的示意圖我就不畫了。

其他型別的線性表

  之所以在文章的開頭我說這幾種連結串列只是對前面連結串列的擴充套件,其實更主要的是,按照這個擴充套件我們還能擴展出很多型別的線性表
  比如

  • 靜態迴圈連結串列
  • 靜態雙向連結串列
  • 迴圈雙向連結串列
    等等各種組合,一個一個講意義不大,說者無味,聽者無趣~

參考內容 《大話資料結構》 陳杰