list的模擬實現

2021-09-12 09:10:29 字數 2097 閱讀 9612

list是stl標準模板庫中的乙個容器,它實質上是乙個帶頭雙向迴圈鍊錶。

這樣的好處是:插入/刪除資料時,不用判斷鍊錶是否為空,並且遍歷的時候找尾也很容易,只需要用_head->_prev就能實現。

迭代器的作用就是為了讓容器的訪問像指標一樣可以實現++,-- ,解引用,->,以及過載  !=,==的比較符。

迭代器有兩種實現方式:

1.原生態指標,如vector

2.將原生態指標進行封裝,因迭代器的使用形式與指標完全相同, 因此,在自定義的類中必須實現以下方法:

1)指標可以解引用,迭代器的類中必須過載operator*()

2)指標可以通過->訪問其所指空間成員,迭代器類中必須過載oprator->()

3)指標可以++向後移動,迭代器類中必須過載operator++()與operator++(int)

4)迭代器需要進行是否相等的比較,因此還需要過載operator==()與operator!=()

模擬實現list ,首先需要構造結點和迭代器,然後建立list鍊錶結構及其相關介面

list.h 

#includeusing std::cout;

using std::endl;

namespace ty

}; //建立迭代器

//typedef __listiteratoriterator;

//typedef __listiteratorconst_iterator;

templatestruct __listiterator

__listiterator(node* node)//帶參構造迭代器

:_node(node)

{}ref operator*()

ptr operator->()

//前置++

self& operator++()

//前置--

self& operator--()

//後置++

self operator++(int)

self operator--(int)

bool operator==(const self& self)

bool operator!=(const self& self)

};templateclass list

iterator end()

const_iterator cbegin()const

const_iterator cend()const

list()//建構函式

list(const list& l)

list& operator=(const list& l)

return *this;

} ~list()

void pushback(const t& x)

void popback()

node* tail = _head->_prev;

node* prev = tail->_prev;

prev->_next = _head;

_head->_prev = prev;

delete tail;

} void pushfront(const t& x)

void popfront()

iterator insert(iterator pos, const t& x)

iterator erase(iterator pos)

void swap(list& l)

void clear()

_head->_next = _head;

_head->_prev = _head;

} size_t size()const

return count;

} bool empty()const

t& front()

const t& front()const

t& back()

const t& back()const

private:

node* _head;

};}

注意:list中第乙個元素是_head->_next,end()返回的是_head,但_head並不儲存元素

模擬實現 list

鍊錶前面我已經寫過了,不過寫的是單鏈表,而c 庫中的list是雙鏈表,那麼,我們就來模擬實現一下雙鏈表,這樣對於庫中的list也會有更加深刻的了解。那麼首先我們先來了解一下雙鏈表的結構,雙鏈表無非就是比單鏈表多了一條鏈,單鏈表只有一條指向下乙個節點的鏈,而雙鏈表會多一條指向前乙個節點的鏈。說白了就是...

模擬實現list

構造 介面 插入刪除 交換 清空 include using namespace std list的節點類 template class t struct listnode listnode ppre listnode pnext t val list的迭代器類 template classt,cl...

C 模擬實現List

雙向鍊錶 include includeusing namespace std typedef nodenode templatestruct node t data 鍊錶中的資料 node pnext 下乙個節點 node ppre 前乙個節點 templateclass list templat...