国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

利用C++實現雙鏈表基本接口示例代碼

2020-01-26 13:59:10
字體:
來源:轉載
供稿:網友

鏈表

鏈表是一種物理存儲單元上非連續、非順序的存儲結構,數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的。鏈表由一系列結點(鏈表中每一個元素稱為結點)組成,結點可以在運行時動態生成。每個結點包括兩個部分:一個是存儲數據元素的數據域,另一個是存儲下一個結點地址的指針域。 相比于線性表順序結構,鏈表比較方便插入和刪除操作。

本文主要給大家介紹了關于C++實現雙鏈表基本接口的相關內容,分享出來供大家參考學習,話不多說,來一起看看詳細的介紹吧。

首先先簡單通過圖示區分單鏈表和雙鏈表的結構差異:

單鏈表的基本接口實現可參考:單鏈表簡單實現

接下來就是雙鏈表的基本接口實現:

#include <iostream>#include <assert.h>using namespace std;typedef int DataType;struct ListNode{ ListNode* _next; ListNode* _prev; DataType _data; ListNode(DataType x)  :_next(NULL)  , _prev(NULL)  , _data(x) {}};typedef ListNode Node;class List{public: List()  :_head(NULL)  ,_tail(NULL) {} List(const List& l)  :_head(NULL)  ,_tail(NULL) {  Copy(l); } void Copy(const List& l) {  Node* cur = l._head;  while (cur)  {   PushBack(cur->_data);   cur = cur->_next;  } } List& operator=(const List& l) {  Destory();  Copy(l);  return *this; } ~List() {  Destory(); } void Destory() {  if (_head)  {   Node* cur = _head;   while (_head)   {    cur = _head;    _head = _head->_next;    delete cur;   }   _head = _tail = NULL;  } } void PushBack(DataType x) {  if (_head == NULL)  {   Node* tmp = new Node(x);   tmp->_next = tmp->_prev = NULL;   _head = _tail = tmp;  }  else  {   Node* tmp = new Node(x);   _tail->_next = tmp;   tmp->_prev = _tail;   _tail = tmp;  } } void PopBack() {  if (_head == NULL)  {   return;  }  else if (_head->_next == NULL)  {   delete _head;   _head = _tail = NULL;  }  else  {   Node* tmp = _tail;   _tail = _tail->_prev;   _tail->_next = NULL;   delete tmp;  } } void PushFront(DataType x) {  if (_head == NULL)  {   _head = _tail = new Node(x);  }  else  {   Node* tmp = new Node(x);   tmp->_next = _head;   _head->_prev = tmp;   _head = _head->_prev;  } } void PopFront() {  if (_head == NULL)  {   return;  }  else if (_head->_next == NULL)  {   delete _head;   _head = _tail = NULL;  }  else  {   Node* tmp = _head;   _head = _head->_next;   delete tmp;   _head->_prev = NULL;  } } Node* Find(DataType x) {  Node* cur = _head;  while (cur)  {   if (cur->_data == x)    return cur;   cur = cur->_next;  }  return NULL; } // 在pos的前面插入x void Insert(Node* pos, DataType x) {  assert(pos);  if ((pos == 0) || (pos->_prev == NULL))  {   PushFront(x);  }  else  {   Node* font = pos->_prev;   Node* tmp = new Node(x);   tmp->_prev = font;   tmp->_next = pos;   font->_next = tmp;   pos->_prev = tmp;  } } //刪除pos位置的元素 void Erase(Node* pos) {  assert(pos);  if ((pos == 0) || (pos->_prev == NULL))  {   PopFront();  }  else if (pos->_next == NULL)  {   PopBack();  }  else  {   Node* font = pos->_prev;   Node* last = pos->_next;   font->_next = last;   last->_prev = font;   delete pos;  } } //逆序整個雙鏈表 void Reverse() {  Node* cur = _head;  while (cur)  {   swap(cur->_next,cur->_prev);   cur = cur->_prev;  }  swap(_head, _tail); } void Print() {  Node* cur = _head;  while (cur)  {   cout << cur->_data << "->";   cur = cur->_next;  }  cout << "NULL" << endl; }private: Node* _head; Node* _tail;};

注:在一些操作實現時,一定要要考慮清楚各種情況,再進行情況的分類盡量提高代碼的復用程度。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對武林網的支持

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 西林县| 临邑县| 郓城县| 博罗县| 拉萨市| 平远县| 沙湾县| 昆山市| 仪陇县| 涪陵区| 昌宁县| 松潘县| 浦城县| 伽师县| 洞口县| 永城市| 新宾| 东海县| 泗洪县| 平潭县| 临夏县| 兴城市| 祁东县| 巴林左旗| 克拉玛依市| 东乌珠穆沁旗| 新余市| 德保县| 彭阳县| 察哈| 额尔古纳市| 茶陵县| 张北县| 临猗县| 福安市| 花莲县| 蕲春县| 滨州市| 兴隆县| 林芝县| 定日县|