有些日子沒有寫文章了.
最近重新看了一下資料結構和演算法設計.寫了個雙向迴圈鍊錶,這玩意兒倒不難.
既然要適應多種型別的需求,當然要用類模板了...
#ifndef list_h
#define list_h
template
<
typename
t>
class
list
node(
const
t&e,node *p = null,node *n = null):prev(p),next(n),data(e){}
node *prev;
node *next;
t data;
};public
: // 迭代器
class
iterator
;public
:list()
~list();
public
:// 成員函式
private
:node *head;
// 頭指標
intthesize;
// 元素個數
};#endif
list類被宣告為乙個模板類.其節點資料結構巢狀在list種定義了.既然是雙向,需要兩個指標分別指向前和後,node * prev,*next; 節點種儲存的資料是型別t data;
list類有乙個成員變數node *head; 這個指標被初始化為指向自身.作為乙個鍊錶的頭結點(同時它又是尾節點),這樣做的好處是在插入和刪除元素的時候可以省去判斷很多特例.一旦這樣被初始化,任何時候插入和刪除都可以用一種形式邏輯完成....(自己在圖紙上畫畫,很快會明白的......發現寫stl的人就是牛叉..)
有了資料結構就應該寫它的功能了..
乙個鍊錶,最基礎的應該有插入,刪除的功能吧.
// 在itr處插入元素
template
list::iterator list::insert(iterator itr,const t&e)
// 刪除itr位置處的元素
template
list::iterator list::erase(iterator &itr)
鍊錶的邏輯在初學的時候容易讓人迷惑,但是"頓悟"之後,發現鍊錶的邏輯是相當簡單的.
在這兩個函式中,用到了iterator型別的引數.
iterator也是乙個list的巢狀型別定義. 它有乙個變數成員,node *cur; 是節點型別的指標,儲存當前指向的節點的位址.....有很多成員函式,都是操作符的過載.
class iterator
;node* operator->()
t &operator*()
iterator operator++()
iterator operator++(int)
bool operator==(const iterator&itr)
bool operator!=(const iterator&itr)
void operator=(const iterator&itr)
protected:
iterator(node *p)
node *cur;
};
我們要用它來遍歷鍊錶,實現插入和刪除等操作
有了這些過載的操作符,對鍊錶的操作就相當簡單了.比如要取得 某個元素 *itr就ok了.要向後遍歷,itr++,或者++itr.還有其他的向前遍歷--itr.itr--.....itr是類物件,但是有了操作符的過載,用起來就像是乙個指標一樣,特爽.
對於其他的函式 push_front() push_back begin,back的實現.有了上面的基礎就相當簡單了.
// 將節點加入鍊錶頭部,head的後面
template
void list::push_front(const t&e)
//將乙個元素加入到鍊錶的尾部
template
void list::push_back(const t&e)
iterator begin()const // 返回頭結點指標
iterator end()const // 返回尾結點後面的指標
t &front() // 返回第乙個節點的元素
t &back() // 返回最後乙個節點的元素
具體就不分析了...
程式設計群c,c++,mfc 58698324
雙向鍊錶和雙向迴圈鍊錶
和單向鍊錶相比,多了乙個前驅結點。如果他為空,那麼next和prior都指向自己。而對於雙迴圈鍊錶,只需要最後乙個元素的next指向head next,head next的prior指向最後乙個節點即可。新節點s插入鍊錶,s next給p結點,s prior給p prior,然後,p prior n...
迴圈鍊錶,雙向鍊錶
迴圈鍊錶 迴圈鍊錶與順序鍊錶之間的區別 迴圈鍊錶最後乙個資料的next指標域不為空,而是指向頭結點,其他基本操作大體相同,只是在判斷表結束的條件變為判斷節點的引用域是否為頭引用 雙向鍊錶 author neosong date oct 10,2017 4 43 01 pm program of in...
鍊錶 雙向迴圈鍊錶
雙向迴圈鍊錶與單鏈表一樣,都是邏輯連續 物理不連續的儲存方式,但它的效果要遠遠優於單鏈表,其結構如下 雙向迴圈鍊錶首先要有乙個頭節點,頭節點中不存放資料,真正的資料從頭節點的下乙個節點開始存放 然後每乙個節點都有兩個指標,分別指向前乙個節點和後乙個節點 最後頭尾相連,就成了雙向迴圈鍊錶。includ...