【C++】双向链表的实现
2015-09-05 20:14
513 查看
该双向链表的头为指针都指向空
#include<iostream> using namespace std; typedef int DataType; class LinkNode { friend class List; friend void Test1(); friend void Test3(); friend void Test4(); public: LinkNode(const DataType& x) :_data(x) ,_prev(NULL) ,_next(NULL) {} private: DataType _data; LinkNode* _prev; LinkNode* _next; }; class List { public: List() :_head(NULL) ,_tail(NULL) {} ~List() {} List(const List& l) {} List& operator=(const List& l) {} public: void PushBack(const DataType& x) { //空链表 //1个及以上节点 if(_head == NULL) { _head = new LinkNode(x); _tail = _head; } else { LinkNode* tmp = new LinkNode(x); _tail->_next = tmp; tmp->_prev = _tail; _tail = tmp; } } void PopBack() { //空链表 //一个节点 //两个及以上节点 if(_head == NULL) { cout<<"您要删除的链表为空,请先创建链表"<<endl; return; } else if(_head == _tail) { delete _head; _head = NULL; _tail = NULL; } else { LinkNode* del = _tail; _tail = _tail->_prev ; _tail->_next = NULL; delete del; } } void PushFront(const DataType& x) { //空链表 //一个及以上节点 if(_head == NULL) { _head = new LinkNode(x); _tail = _head; } else { LinkNode* tmp = new LinkNode(x); tmp->_next = _head; _head->_prev = tmp; _head = tmp; } } void PopFront() { //链表为空 //一个节点 //两个及以上节点 if(_head == NULL) { cout<<"您要删除的链表为空,请先创建链表"<<endl; return; } else if(_head == _tail) { delete _head; _head = NULL; _tail = NULL; } else { LinkNode* del = _head; _head = _head->_next ; _head->_prev = NULL; delete del; } } void Print() { if(_head == NULL) { cout<<"您要输出的链表为空,请先创建链表"<<endl; return; } else { LinkNode* begin = _head; while(begin != _tail) { cout<<begin->_data<<"->"; begin = begin->_next ; } cout<<begin->_data<<endl; } } public: void Insert(LinkNode* pos, const DataType& x) { //位置无效 //尾节点之后插 //中间插 if(pos == NULL) { cout<<"找不到该位置,请重新选择位置插入"<<endl; return; } else if(pos == _tail) { LinkNode* tmp = new LinkNode(x); _tail->_next = tmp; tmp->_prev = _tail; _tail = tmp; } else { LinkNode* tmp = new LinkNode(x); pos->_next ->_prev = tmp; tmp->_next = pos->_next ; pos->_next = tmp; tmp->_prev = pos; //另一种写法 } } LinkNode* Find(const DataType& x) { if(_head == _tail) { if(_head->_data == x) { return _head; } else { cout<<"没有找到该节点"<<endl; } } else { LinkNode* begin = _head; while(begin != _tail) { if(begin->_data == x) { return begin; } else { begin = begin->_next ; } } if(begin->_data == x) { return begin; } else { cout<<"没有找到该节点"<<endl; } } } void Erase(LinkNode* del) { //节点无效 //只有一个节点 //多个节点(处理del是头尾的情况) if(del == NULL) { cout<<"找不到该节点"<<endl; return; } else if(_head == _tail) { if(_head == del) { delete _head; _head = NULL; _tail = NULL; } else { cout<<"找不到该节点"<<endl; return; } } else { //del为头 //del为尾 //del在中间 if(del == _head) { PopFront(); } else if(del == _tail) { PopBack(); } else { LinkNode* tmp1 = del->_prev ; LinkNode* tmp2 = del->_next ; tmp1->_next = tmp2; tmp2->_prev = tmp1; delete del; } } } void Reverse() { LinkNode* tmp1 = _head; LinkNode* tmp2 = _tail; while(tmp1 != tmp2 && tmp2->_next != tmp1) { DataType a = tmp1->_data ; tmp1->_data = tmp2->_data ; tmp2->_data = a; tmp1 = tmp1->_next ; tmp2 = tmp2->_prev ; } } private: LinkNode* _head; LinkNode* _tail; }; void Test1() { List s1; s1.PushBack(1); s1.PushBack(2); s1.PushBack(3); s1.PushBack(4); s1.Print(); /*s1.PopBack (); s1.PopBack (); s1.PopBack (); s1.PopBack (); s1.PopBack (); s1.Print();*/ LinkNode* ret1 = s1.Find(1); cout<<ret1->_data<<endl; LinkNode* ret2 = s1.Find(2); cout<<ret2->_data<<endl; LinkNode* ret3 = s1.Find(3); cout<<ret3->_data<<endl; LinkNode* ret4 = s1.Find(4); cout<<ret4->_data<<endl; s1.Insert (ret1,5); s1.Print(); s1.Insert (ret2,6); s1.Print(); s1.Insert (ret3,7); s1.Print(); s1.Insert (ret4,8); s1.Print(); } void Test2() { List s1; s1.PushFront(4); s1.PushFront(3); s1.PushFront(2); s1.PushFront(1); s1.Print(); s1.PopFront (); s1.PopFront (); s1.PopFront (); s1.PopFront (); s1.PopFront (); s1.Print(); } void Test3() { List s1; s1.PushBack(1); s1.PushBack(2); s1.PushBack(3); s1.PushBack(4); s1.Print(); LinkNode* ret1 = s1.Find(1); cout<<ret1->_data<<endl; LinkNode* ret2 = s1.Find(2); cout<<ret2->_data<<endl; LinkNode* ret3 = s1.Find(3); cout<<ret3->_data<<endl; LinkNode* ret4 = s1.Find(4); cout<<ret4->_data<<endl; s1.Erase (ret1); s1.Print(); s1.Erase (ret2); s1.Print(); s1.Erase (ret3); s1.Print(); s1.Erase (ret4); s1.Print(); } void Test4() { List s1; s1.PushBack(1); s1.PushBack(2); s1.PushBack(3); s1.PushBack(4); //s1.PushBack(5); s1.Print(); s1.Reverse(); s1.Print(); } int main() { Test4(); //Test3(); //Test2(); //Test1(); getchar(); return 0; }
相关文章推荐
- 学生成绩排名(C语言编写)
- C++11 常量表达式
- 【C++】this指针
- 【C++】各种成员变量
- 乘积最大子序列
- VC++ 结束线程 AfxBeginThread AfxEndThread
- C++顺序容器
- C++IO库
- C++ 11 Lambda表达式
- C语言的关键字“volatile"有何作用?
- 《Effective C++》学习笔记——条款34
- 杨辉三角纯数学C语言实现
- c++ std::getline
- c++内存分配优先使用内存池,而不是new,delete
- 数字三角形
- c++中的语法结构
- C++虚函数的工作原理是什么
- C++中随机函数rand()和srand()的用法
- 【C++】const、volatile不能修饰没有this指针的成员函数
- VS2010如何添加MSCOMM控件