今天總結線性表中的雙向迴圈鍊錶。
什麼是雙向迴圈鍊錶?
看名字估計也就知道了,首相他是乙個迴圈鍊錶,也就是最後乙個結點的指標域不為空,而是指向頭結點,其次與單向迴圈鍊錶相比,它是雙向的。所謂雙向,就是給每個結點再增加乙個指標域,這個指標域指向前乙個結點。
為什麼要用雙向迴圈鍊錶?
無論單鏈表還是單向迴圈鍊錶,都只有乙個指標域,它們都是直接指向後繼結點的,如果要查詢當前結點的後繼結點,會很方便。但是如果給定乙個結點,要得到它的前繼結點,就會很麻煩,必須從第乙個元素開始遍歷,然後判斷當某個結點的指標域指向的是當前結點時,就判斷該結點為當前結點的前繼結點,時間複雜度為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 實現了線性鍊錶建立,初始化,刪除,插入,清空,遍歷,有序鍊錶合併等操作。煉表頭 頭指標 頭結點 煉表頭 指的是線性表第乙個元素所在結點 頭指標 ...