(當然實際儲存並不這樣擺放的,只是便於理解)
這是乙個節點的基本結構:
prev:是乙個指向前面乙個節點的指標。
next: 是乙個指向後面乙個節點的指標。
data: 任意t型別的資料。
圖例:可以看到
中間節點的prev存放著head這個節點的位址
中間節點的next存放著tali這個節點的位址
分為三部分:
解釋:因為鍊錶操作物件是乙個個節點node的物件, 所以需要創造head與tail節點連成鏈,再把其餘的節點插入進來3.1 節點
templatestruct node
};
3.2迭代器templateclass iterator
iterator(node* c)
iterator(const iterator& itr) :current(itr.current) {}
//過載函式
iterator& operator ++() //字首++
iterator& operator ++(int n)
;//字尾++
iterator& operator --() //字首--
iterator& operator --(int n) //字尾--
t& operator *()
const t& operator *() const
//判斷
bool operator ==(const iterator& itr)
};
解釋說明
2.而我們用*,我們希望取出來的是data,所以我們想要這個*current=current->data
3.3鍊錶(重點)
這是全部的** 看著很頭暈。 別著急 可以先不看 後面我會放詳細解釋
templateclass list
; ~list()
; list(const list& l)
void clear()
iterator begin()
const_iterator begin() const
iterator end()
const_iterator end()const
t& front()
const t& front()const
t& back()
const t& back()const
list& operator =(const list& l) }
void push_front(const t& item)
void push_back(t& item)
void pop_front()
void pop_back()
int size()const
bool empty()
iterator insert(const iterator itr, const t& item)
iterator erase(iterator itr)
};
我們先講最難的,因為前面基本的像建構函式需要用到這幾個難的函式,所以我們要先了解
1.插入。 itr.current是當前指向的節點的位址 ,我們想把某乙個節點插入到itr.current 指向的節點的前面位置 ,item是要插入到這個某個節點data裡的資料
iterator insert(const iterator itr, const t& item)
如圖:
我們要把 newnode 插入n前面去
2.消除。我們要清除itr的current指向的節點,並重新連線前面,返回值是下乙個節點就是(itr變了 向後移了一位)劃重點:itr變了 向後移了一位,因為它原來指向的被我們刪了
iterator erase(iterator itr)
3.比較簡單的函式名字begin() ; // 第乙個裝有資料的節點的位址(head->next)
end(); //最後乙個裝有資料節點的下乙個節點(tail)
front();//鍊錶中第乙個資料
back();//鍊錶中最後的乙個資料
push_front();//首插
push_back();//尾插
pop_front();//首刪
pop_back();//尾刪
4.前面的建構函式(都很簡單 注釋我寫在前面好了)
~list()
;void clear()
#include #include"list.h" //使用者標頭檔案
using namespace std;
template//在指定範圍內輸出元素
void display(iterator first, iterator last)
int main()
display(l.begin(), l.end());
l.erase(l.begin());
display(l.begin(), l.end());
listl2;
l2 = l;
display(l2.begin(), l2.end());
for (int i = 0; i < 20; i++)
display(l2.begin(), l2.end());
l.erase(l2.begin());
display(l2.begin(), l2.end());
const listl3(l2);
display(l2.begin(), l2.end());
return 0;
}
結果:
雙向迴圈鍊錶模板類 C
雙向鍊錶又稱為雙鏈表,使用雙向鍊錶的目的是為了解決在鍊錶中訪問直接前驅和後繼的問題。其設定前驅後繼指標的目的,就是為了節省其時間開銷,也就是用空間換時間。在雙向鍊錶的每個節點中應有兩個鏈結指標作為它的資料成員 pred指向其前驅節點,next指向其後繼節點。再加上資料域,因此每個雙向鍊錶至少包括三個...
C 實現簡單的雙向鍊錶
vs2013下編譯執行,實現了雙向鍊錶類list 的 建構函式,拷貝構造 析構函式 賦值運算子過載 清空 頭插 頭刪 尾插 尾刪 插入 刪除 逆序和刪除鍊錶中重複的資料值函式等。直接貼 dulist.h 類宣告 定義 成員函式定義。pragma once 雙向鍊錶 include includeus...
乙個簡單的雙向鍊錶(C 實現)
直接上 親測有用。ifndef dlink h define dlink h phead index0 index1 index2 phead phead index0 index1 index2 phead phead 不儲存資料。index是從0開始的。count index 1 templat...