日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构基础(12) --双向循环链表的设计与实现

發布時間:2025/3/17 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构基础(12) --双向循环链表的设计与实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

雙向鏈表的操作特點:

? ? (1)?“查詢”?和單鏈表相同;

? ? (2)“插入”?和“刪除”時需要同時修改兩個方向上的指針。

? ?但是對于雙向循環鏈表則在表尾插入非常的迅速,?只需O(1)的時間,因為有指向前面的指針,?因此雙向循環鏈表會很容易的找到位于表尾的元素,因此雙向循環鏈表比較適用于頻繁在表尾插入的情況.



空鏈表:


雙向循環鏈表節點構造:

class DoubleListNode { private:Type data;DoubleListNode *prev; //前向指針域DoubleListNode *next; //后項指針域 };

因為需要將其用于DoubleList,因此需要將其改造如下:

template <typename Type> class DoubleListNode {//友元聲明friend class DoubleList<Type>;friend class ListIterator<Type>;template <typename T>friend ostream &operator<<(ostream &os, const DoubleList<T> &list); private:DoubleListNode(const Type &dataValue):data(dataValue),prev(NULL),next(NULL) {}Type data;DoubleListNode *prev; //前向指針域DoubleListNode *next; //后項指針域 };

雙向循環鏈表構造:

template <typename Type> class DoubleList {friend class ListIterator<Type>;template <typename T>friend ostream &operator<<(ostream &os, const DoubleList<T> &list); public:DoubleList();~DoubleList();void push_back(const Type &data);void push_front(const Type &data);void insert(int position, const Type &data);void pop_front();void pop_back();void remove(const Type &removeData);bool search(const Type &searchData) const;bool isEmpty() const{return (first->next == first);}private://將節點x插入到節點previous后面void insertPrivate(DoubleListNode<Type> *previous,DoubleListNode<Type> *x);void removePrivate(DoubleListNode<Type> *x);private:DoubleListNode<Type> *first; };

鏈表的構造與析構:

//構造鏈表 template <typename Type> DoubleList<Type>::DoubleList() {first = new DoubleListNode<Type>(0);first->next = first;first->prev = first; } //析構鏈表 template <typename Type> DoubleList<Type>::~DoubleList() {DoubleListNode<Type> *deleteNode = NULL;//保存鏈表尾元素DoubleListNode<Type> *tmp = first;//first首先指向第一個真實的元素first = first->next;//一路到達鏈表結尾while (first != tmp){deleteNode = first;first = first -> next;delete deleteNode;}// 釋放掉鏈表的空節點(表頭)delete tmp; }

鏈表元素插入與刪除的兩大主力:

//同為private成員 //插入節點 template <typename Type> void DoubleList<Type>::insertPrivate(DoubleListNode<Type> *previous,DoubleListNode<Type> *x) {x->prev = previous;x->next = previous->next;previous->next->prev = x;previous->next = x; }
//刪除節點 template <typename Type> void DoubleList<Type>::removePrivate(DoubleListNode<Type> *x){if (x == first)throw std::range_error("permission denied to delete first pointer");x->prev->next = x->next;x->next->prev = x->prev;delete x; }

提供給客戶的插入:

//插入到表尾 template <typename Type> void DoubleList<Type>::push_back(const Type &data) {DoubleListNode<Type> *newNode = new DoubleListNode<Type>(data);//找到first的前一個節點DoubleListNode<Type> *previous = first->prev;//插入insertPrivate(previous, newNode); } //插入到表頭 template <typename Type> void DoubleList<Type>::push_front(const Type &data) {DoubleListNode<Type> *newNode = new DoubleListNode<Type>(data);//插入到first之后insertPrivate(first, newNode); }//插入到任意位置(依position指定) template <typename Type> void DoubleList<Type>::insert(int position, const Type &data) {if (position == 1)return push_front(data);int count = 1;//previous 代表著要插入位置之前的一個位置DoubleListNode<Type> *previous = first->next;//如果position過大, 則previous查找到first就會停止//此時應該將該元素插入到鏈表結尾while (count < position-1 && previous != first){++ count;previous = previous->next;}//如果查找到了鏈表結尾或此時鏈表為空, 因此插入到表尾if (previous == first)return push_back(data);//如果找到了合適的插入位置DoubleListNode<Type> *newNode = new DoubleListNode<Type>(data);insertPrivate(previous, newNode); }

提供給客戶的刪除:

//刪除表尾元素 template <typename Type> void DoubleList<Type>::pop_back() {removePrivate(first->prev); } //刪除表頭元素 template <typename Type> void DoubleList<Type>::pop_front() {removePrivate(first->next); }//刪除元素值為removeData的所有元素 template <typename Type> void DoubleList<Type>::remove(const Type &removeData) {if (isEmpty())throw std::range_error("link list is empty");for( DoubleListNode<Type> *searchNode = first->next;searchNode != first;searchNode = searchNode->next){if (searchNode->data == removeData)removePrivate(searchNode);} }

查看是否存在于鏈表中:

template <typename Type> bool DoubleList<Type>::search(const Type &searchData) const {DoubleListNode<Type> *searchNode = first->next;while (searchNode != first){if (searchNode->data == searchData)return true;searchNode = searchNode->next;}return false; }

輸出鏈表所有元素(測試用):

template <typename Type> ostream &operator<<(ostream &os, const DoubleList<Type> &list) {for (DoubleListNode<Type> *currentNode = (list.first)->next;currentNode != list.first;currentNode = currentNode->next)os << currentNode->data << ' ';return os; }

雙向循環鏈表迭代器的設計與實現:

//除了添加了operator--, 幾乎沒做任何改變 template <typename Type> class ListIterator { public:ListIterator(const DoubleList<Type> &_list):list(_list),currentNode((_list.first)->next) {}//重載 *operatorconst Type &operator*() const throw (std::out_of_range);Type &operator*() throw (std::out_of_range);//重載 ->operatorconst DoubleListNode<Type> *operator->() const throw (std::out_of_range);DoubleListNode<Type> *operator->() throw (std::out_of_range);//重載 ++operatorListIterator &operator++() throw (std::out_of_range);//注意:此處返回的是值,而不是referenceListIterator operator++(int) throw (std::out_of_range);//重載 --operator,// 其實這個版本的--operator是不完美的,// 因為他沒有做任何的判錯控制ListIterator &operator--();//注意:此處返回的是值,而不是referenceListIterator operator--(int);bool isEmpty() const{return (currentNode == list.first);}private:const DoubleList<Type> &list;DoubleListNode<Type> *currentNode; }; template <typename Type> const Type &ListIterator<Type>::operator*() const throw (std::out_of_range) {if (isEmpty())throw std::out_of_range("iterator is out of range");// 返回當前指針指向的內容return currentNode->data; } template <typename Type> Type &ListIterator<Type>::operator*() throw (std::out_of_range) {returnconst_cast<Type &>(static_cast<const ListIterator<Type> &>(*this).operator*()); } template <typename Type> const DoubleListNode<Type> *ListIterator<Type>::operator->() const throw (std::out_of_range) {if (isEmpty())throw std::out_of_range("iterator is out of range");//直接返回指針return currentNode; }template <typename Type> DoubleListNode<Type> *ListIterator<Type>::operator->() throw (std::out_of_range) {returnconst_cast<DoubleListNode<Type> *> (static_cast<const ListIterator<Type> >(*this).operator->()); } template <typename Type> ListIterator<Type> &ListIterator<Type>::operator++() throw (std::out_of_range) {if (isEmpty())throw std::out_of_range("iterator is out of range");//指針前移currentNode = currentNode->next;return *this; } template <typename Type> ListIterator<Type> ListIterator<Type>::operator++(int) throw (std::out_of_range) {ListIterator tmp(*this);++ (*this); //調用前向++版本return tmp; } template <typename Type> ListIterator<Type> &ListIterator<Type>::operator--() {//指針前移currentNode = currentNode->prev;return *this; } template <typename Type> ListIterator<Type> ListIterator<Type>::operator--(int) {ListIterator<Type> tmp(*this);-- (*this);return tmp; }

測試代碼:

int main() {cout << "-------- 1 --------" << endl;DoubleList<int> myList;for (int i = 0; i < 3; ++i)myList.push_back(i+1);for (int i = 0; i < 5; ++i)myList.push_front(10+i);for (int i = 0; i < 3; ++i)myList.push_back(i+1);ListIterator<int> iter(myList), iter2(myList);while (!iter.isEmpty()){cout << *iter << ' ';++ iter;++ iter2;}cout << endl;-- iter2;while (!iter2.isEmpty()){cout << *iter2 << ' ';iter2 --;}cout << endl;cout << "-------- 2 --------" << endl;cout << myList << endl;cout << "Test insert..." << endl;myList.insert(1, 14);myList.insert(2, 13);myList.insert(2, 13);myList.insert(88, 88);cout << myList << endl;myList.pop_back();myList.pop_front();cout << myList << endl;for (int i = 0; i < 5; ++i){if (myList.search(i))cout << i << ": Have found!" << endl;elsecout << i << ": Not in the list!" << endl;}cout << "Test remove..." << endl;cout << myList << endl;int value;while (cin >> value){try{myList.remove(value);}catch (const std::exception &e){cerr << e.what() << endl;}cout << myList << endl;if (myList.isEmpty()){cout << "empty" << endl;}else{cout << "not empty" << endl;}}return 0; }

總結

以上是生活随笔為你收集整理的数据结构基础(12) --双向循环链表的设计与实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 狂野欧美性猛交blacked | 黄页视频在线观看 | 欧美日本一本 | 久久人人爽人人爽人人片av免费 | 精品福利影院 | 乱老熟女一区二区三区 | 黄色小视频免费看 | 无码一区二区精品 | 亚洲欧美中文字幕5发布 | 亚洲天堂av在线免费观看 | 一级中文字幕 | 国产视频一二 | 精品96久久久久久中文字幕无 | av成人资源 | 欧美日韩在线视频观看 | 欧美三级韩国三级日本三斤 | 久久精品偷拍视频 | 日韩有码第一页 | 在线视频中文字幕 | 久久精品国产精品亚洲 | 特一级黄色 | 禁断介护老人中文字幕 | 131美女爱做视频 | 国产又黄又粗又猛又爽 | 樱桃国产成人精品视频 | 91免费短视频 | 色综合成人 | 国产主播在线看 | 色吧av色av| 亚洲综合国产 | 91自啪| 青青视频在线播放 | 亚洲xxxxx| 一本高清dvd在线播放 | 看黄网站在线观看 | 99久久久成人国产精品 | 中文字幕一区二区三区在线观看 | 国产成人精品免高潮在线观看 | 欧美精品久久天天躁 | 国产av电影一区 | 国模av在线 | 天天婷婷| 日韩国产第一页 | 人成网站在线观看 | 亚洲av无码国产精品久久 | 成年人免费网站在线观看 | www.黄在线观看 | 乱色精品无码一区二区国产盗 | 日韩欧美成人一区 | 深夜视频在线观看免费 | 成人自拍视频在线观看 | www.天天射 | 91精品国产综合久 | 热久久最新| 亚洲 欧美 中文字幕 | 亚洲一区中文字幕在线观看 | 大香依人 | 99久久99久久精品国产片果冻 | 久久久亚洲成人 | 漂亮少妇高潮午夜精品 | 伊人免费视频二 | 波多野结衣a v在线 欧洲免费av | 日韩毛片在线免费观看 | 国产精品一区二区入口九绯色 | 二区在线视频 | 国产少女免费观看高清 | 一区二区在线观看免费 | 欧日韩精品| 美女狠狠干 | av在线不卡观看 | 午夜电影福利网 | 视频一区二区在线播放 | 蜜臀视频一区二区 | 777色| 91免费版视频 | 狠狠爱夜夜爱 | 色老头在线一区二区三区 | 久久人| 乱人伦av| 国产婷婷色综合av蜜臀av | 国内久久精品视频 | 国产精品人妻 | 亚洲国产精品成人久久蜜臀 | 免费毛片在线 | 亚洲欧洲av| 国产日韩欧美二区 | 香蕉视频免费在线播放 | 韩日一区二区 | 欧美cccc极品丰满hd | 欧美日韩久 | 好色999 | 91精品看片 | 婷婷成人综合网 | 激情伦成人综合小说 | 美女啪啪动态图 | 韩国av免费在线观看 | 久久精品人妻一区二区 | 亚洲精品天堂成人片av在线播放 | av小说天堂网 |