資料結構與演算法 線性表鏈式儲存(雙向迴圈鍊錶)

2021-07-02 07:51:26 字數 1739 閱讀 9676

今天總結線性表中的雙向迴圈鍊錶。

什麼是雙向迴圈鍊錶?

看名字估計也就知道了,首相他是乙個迴圈鍊錶,也就是最後乙個結點的指標域不為空,而是指向頭結點,其次與單向迴圈鍊錶相比,它是雙向的。所謂雙向,就是給每個結點再增加乙個指標域,這個指標域指向前乙個結點。

為什麼要用雙向迴圈鍊錶?

無論單鏈表還是單向迴圈鍊錶,都只有乙個指標域,它們都是直接指向後繼結點的,如果要查詢當前結點的後繼結點,會很方便。但是如果給定乙個結點,要得到它的前繼結點,就會很麻煩,必須從第乙個元素開始遍歷,然後判斷當某個結點的指標域指向的是當前結點時,就判斷該結點為當前結點的前繼結點,時間複雜度為o(n)。而如果給每個結點增加乙個指標域,指向其前繼結點,那麼給定乙個結點時,直接就可以得到它的前繼結點。

如何實現雙向迴圈鍊錶?

#include using namespace std;

template struct node ;

template //雙向迴圈鍊錶 模板類

class doublelinklist

~doublelinklist(); //析構函式 釋放節點空間

doublelinklist(t a,int n); //用陣列a初始化鍊錶

void insert(int i,t x); //插入元毒到指定位置

t delete(int i); //刪除指定位置的元素

node*getnode(int i); //返回指定位置的結點

int getlength(); //獲取鍊錶的長度

void printlinklist(); //遍歷鍊錶

};template //尾插法

doublelinklist::doublelinklist(t a,int n)

}template doublelinklist::~doublelinklist()

}template int doublelinklist::getlength()

return count;

}template void doublelinklist::printlinklist()

cout

return p;

}template t doublelinklist::delete(int i)

return 0;

}/**

插入操作實現

思路:1.獲取待插位置的前乙個結點

2.新建乙個結點,將待插結點元素儲存到其資料域中

3.將待插結點指向插入位置後面的那個結點,其pre指向前面的那個結點

4.將後面結點的pre指向待插結點,將前面結點指向待插結點

技巧:這裡可能結點指向操作的順序容易弄混,導致出錯.

我的辦法是,只要先把當前結點先分別指向後繼結點和前繼結點,然後再使前繼結點和後繼結點指向當前結點

就一句話,記住先處理當前結點的指標域,順序基本就不會錯了。

*/template void doublelinklist::insert(int i,t x)

}int main()

; doublelinklistlist(a,6);

cout<

執行結果:

資料結構和演算法 線性表(鏈式儲存)

線性表是最常見和常用的adt。假設線性表的元素為整數,請基於單鏈式儲存結構實現線性表adt。基本功能包括 1 建立線性表 輸入有兩行 第一行乙個整數,是輸入元素的結束標誌,例如0,則在輸入結束時輸入0,就表示輸入結束了。第二行是線性表的各個元素,最後乙個是結束標誌。2 插入 輸入兩個整數,即元素插入...

資料結構與演算法 線性表鏈式儲存(單鏈表)

今天總結單鏈表的實現.什麼是鍊錶?就是採去鏈式儲存結構的線性表,所謂鏈式儲存就好比火車的車廂一樣,一節一節的連線起來,成為乙個線性表。這種方式採用動態儲存分配方式,即程式在執行時根據實際需要申請記憶體空間,不需要時將記憶體空間釋放掉。鍊錶用一組任意的儲存單元存放線性表中的各個元素,這組儲存單元可以是...

資料結構 線性表鏈式儲存

對於線性鍊錶,有兩種表示方法,一種是包含頭節點的情況,如下圖 一種是不包含頭節點的情況,如下圖 本文中對線性鍊錶的表示,利用的是帶頭節點的定義方式。使用c 實現了線性鍊錶建立,初始化,刪除,插入,清空,遍歷,有序鍊錶合併等操作。煉表頭 頭指標 頭結點 煉表頭 指的是線性表第乙個元素所在結點 頭指標 ...