內建迭代器的雙向迴圈鍊錶

2021-04-20 08:21:05 字數 2200 閱讀 3204

有些日子沒有寫文章了.

最近重新看了一下資料結構和演算法設計.寫了個雙向迴圈鍊錶,這玩意兒倒不難.

既然要適應多種型別的需求,當然要用類模板了...

#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...