带头尾节点的双向链表
2015-11-29 16:47
316 查看
#include<iostream> #include<assert.h> using namespace std; typedef int DataType; //双向链表,无头节点 struct LinkNode { //struct默认是公有访问限定符 public: LinkNode(const DataType& x) :_data(x) , _prev(NULL) , _next(NULL) {} ~LinkNode() { } public: DataType _data; LinkNode* _prev; LinkNode* _next; }; class List { public: List() :_head(NULL) , _tail(NULL) { } ~List() { } void PushBack(const DataType& x) { LinkNode* tmp = new LinkNode(x); if (NULL == _tail) { _head = _tail=tmp; } else { tmp->_prev = _tail; _tail->_next = tmp; _tail = _tail->_next; } } void PopBack() { LinkNode* cur = _head; if (_tail == NULL) { return; } else if (_head == _tail) { delete _head; _head = _tail = NULL; } else { LinkNode* del = _tail; _tail->_prev->_next = NULL; _tail = _tail->_prev; delete del; } } void PushFront(const DataType& x) { LinkNode* tmp = new LinkNode(x); //如果没有节点 if (NULL== _tail) { _tail=_head = tmp; } else { tmp->_next = _head; _head->_prev = tmp; _head = tmp; } } void PopFront() { if (_head == NULL) return; else if (_head==_tail) { free(_head); _head = _tail=NULL; } else { LinkNode* del = _head; _head = _head->_next; _head->_prev = NULL; delete del; } } LinkNode* Find(const DataType& x) { LinkNode* cur = _head; while (cur) { if (cur->_data == x) return cur; cur = cur->_next; } return NULL; } void Erase(LinkNode* pos) { assert(pos); //处理pos是头,尾或头和尾 LinkNode* del = NULL; if (pos == _head) { del = pos; _head = _head->_next; _head->_prev = NULL; } if (pos==_tail) { del = pos; _tail = _tail->_prev; _tail->_next = NULL; } if (del == NULL) { LinkNode* prev = pos->_prev; LinkNode* next = pos->_next; prev->_next = next; next->_prev = prev; } delete del; } void Insert(LinkNode* pos, const DataType& x) { assert(pos); LinkNode* tmp = new LinkNode(x); if (pos == _tail) { _tail->_next = tmp; tmp->_prev = _tail; _tail = tmp; } else { LinkNode* next = pos->_next; tmp->_next = next; next->_prev = tmp; pos->_next = tmp; tmp->_prev = pos; } } void DisPlay() { LinkNode* cur = _head; while (cur) { cout << (cur->_data) << "->"; cur = cur->_next; } cout << "NULL" << endl; } private: LinkNode* _head; LinkNode* _tail; }; void Test1() { List l1; l1.PushBack(1); l1.PushBack(2); l1.PushBack(3); l1.PushBack(4); l1.PushBack(5); l1.PushBack(6); l1.DisPlay(); l1.PopBack(); l1.DisPlay(); l1.PopBack(); l1.PopBack(); l1.PopBack(); l1.PopBack(); l1.PopBack(); l1.PopBack(); l1.PopBack(); l1.PopBack(); l1.DisPlay(); } void Test2() { List l2; l2.PushFront(1); l2.PushFront(2); l2.PushFront(3); l2.PushFront(4); l2.PushFront(5); l2.PushFront(6); l2.DisPlay(); l2.PopFront(); l2.PopFront(); l2.PopFront(); l2.PopFront(); l2.DisPlay(); l2.PopFront(); l2.PopFront(); l2.PopFront(); l2.PopFront(); l2.DisPlay(); } void Test3() { List l2; l2.PushFront(1); l2.PushFront(2); l2.PushFront(3); l2.PushFront(4); l2.PushFront(5); l2.PushFront(6); l2.DisPlay(); LinkNode* ret = l2.Find(6); //l2.Erase(ret); l2.Insert(ret, 7); l2.DisPlay(); } int main() { Test3(); system("pause"); return 0; }
相关文章推荐
- 按钮点击一个,其它都取消选中状态的iOS开发,
- 数据结构 单链表插入删除操作(c语言实现)
- Go 语言切片(Slice)
- 斐波那契数列(Java)
- idea 自定义工具栏
- POJ 题目分类
- [转载] 循环队列的定义、入队、出队等操作 C++代码实现
- Go 语言结构体
- 给定两个整型变量的值,将两个值的内容进行交换
- git常用命令总结
- 从零开始写javaweb框架笔记3-编写一个简单的web应用
- Go 语言指针
- 内存溢出的解决方案
- 内存溢出的解决方案
- Android自带的Theme主题图解
- bs交互js的模态对话框
- 内存溢出的解决方案
- Microsoft Word 插件开发——Word外接应用程序开发
- ARP地址解析协议
- 扬州工业职业技术学院