C++实现双链表基本接口
来源:互联网 发布:shell脚本编程教程 编辑:程序博客网 时间:2024/06/06 19:23
首先先简单通过图示区分单链表和双链表的结构差异:
单链表的基本接口实现可参考:单链表简单实现
接下来就是双链表的基本接口实现:
#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;};
注:在一些操作实现时,一定要要考虑清楚各种情况,再进行情况的分类尽量提高代码的复用程度。
阅读全文
1 0
- C++实现双链表基本接口
- C基本库函数实现
- 接口实现方式(c#)
- 实现Icomparable接口(C#)
- 如何实现INotifyPropertyChanged接口(C#)
- c语言接口与实现
- Effective C++(五)接口实现
- c 接口学习与实现
- C语言简单实现接口
- C语言接口与实现[+]
- C/C++函数实现接口
- linux c copyFile接口实现
- 单链表基本实现(c++)
- 《C接口与实现》第 2 章 接口与实现
- 读书笔记--C语言接口与实现--接口与实现
- mysql的C语言的接口基本应用
- 实现Java与C语言接口
- 实现Java与C语言接口
- android UiAutomator长按实现控制按住控件时间的方法
- HDU 3714 Error Curves(三分)
- Spring ContextLoaderListener与DispatcherServlet所加载的applicationContext的区别
- php-china.org 的开源项目安装
- 《利用Python进行数据分析》学习笔记ch03(4)
- C++实现双链表基本接口
- OpenAirInterface USRP安装时You do not have write permissions at the install location问题解决方案
- 通过JPA来自动创建Model类与数据中表对应
- hdu 4506 快速幂
- cookie和session解析
- 第18章、java I/O系统
- java 实现wav头信息生成byts数组
- LOJ #115. 无源汇有上下界可行流
- matplotlib(刻度,刻度线长短位置相关设置)