部落格介紹了c語言,以及c++的單向鍊錶。那麼我們今天介紹的雙向鍊錶,顧名思義,就是資料本身具備了左邊和右邊的雙向指標。雙向煉表相比較單向鍊錶,主要有下面幾個特點:
(1)在資料結構中具有雙向指標
(2)插入資料的時候需要考慮前後的方向的操作
(3)同樣,刪除資料的是有也需要考慮前後方向的操作
那麼,乙個非迴圈的雙向鍊錶操作應該是怎麼樣的呢?我們可以自己嘗試一下:
源**:
#include using namespace std;
typedef int datatype;
class linknode
~linknode()
protected:
datatype _data; // 資料
private:
linknode* _prev; // 前驅
linknode* _next; // 後繼
};class list
~list()
{} list(const list& l)
{} list& operator=(const list& l);
public:
void print()
cout<<"null"<_next=new linknode(x);
_tail->_next->_prev=_tail;
_tail=_tail->_next;
} }void popback()
if (_head == _tail)
else
}void pushfront(const datatype& x)
else
}void popfront()
if (_head == _tail)
if(_head != _tail) //鍊錶清空之後的判斷,否則出現記憶體訪問衝突
}//插入
void insert(linknode* pos, const datatype& x)
if(pos == _tail)
else
}//查詢
linknode* find(const datatype& x)
linknode* begin = _head;
while(begin != null)
else
}return null;
cout<<"沒有找到該節點"<_next;
_head->_prev=null;
delete _head->_prev;*/
}else
//del在中
else}}
} }void remove(datatype * x)
//逆置
void reverse() }
private:
linknode* _head;
linknode* _tail;
};void test1()
{ list l1;
l1.pushback(1);
l1.pushback(2);
l1.pushback(3);
l1.pushback(4);
l1.print();
linknode* ret = l1.find(4);
//cout<<"ret:"<_data<
C 雙向鍊錶
includeusing namespace std typedef int datatype class linknode friend class slist private datatype data linknode prev linknode next class slist void p...
C 雙向鍊錶
考慮順序表中總是可以很方便地找到表元素的前驅和後繼,但單鏈表只能找後繼。如要找前驅,必須從表頭開始搜尋。為了克服這一缺點,可採用雙向鍊錶 double linked list 雙向鍊錶經常採用帶頭結點的迴圈鍊錶方式,如下圖所示。檢視動畫演示 圖7.10 帶表頭結點的雙向迴圈鍊錶 假設 指標p指向雙向...
c 雙向鍊錶
雙向鍊錶的遍歷,新增 修改 刪除的操作思路 1 先找到雙向鍊錶的最後這個節點 2 temp.next new datanode 3 newdatanode.pre temp 1 因為是雙向鍊錶,因此,我們可以實現自我刪除某個節點 2 直接找到要刪除的這個節點,比如temp 3 temp.pre.ne...