双向链表

来源:互联网 发布:php常用的谷歌插件 编辑:程序博客网 时间:2024/06/15 23:34
#include<iostream>using namespace std;typedef int DataType;class LinkNode{friendclass Link;    //要想在类Link中访问LinkNode,可将Link定义为LinkNode的友元类public:LinkNode(const DataType &x):_data(x),_prev(NULL),_next(NULL){}private:DataType _data;LinkNode *_prev;LinkNode *_next;};class Link{public:Link():_head(NULL),_tail(NULL){}Link(const Link& l){Link *tmp = new Link;tmp->_head = l._head;tmp->_tail = l._tail;_head = tmp->_head;_tail = tmp->_tail;//_head = l._head;//_tail = l._tail;}Link& operator=(const Link& l){return *this;}~Link(){ delete _head;delete _tail;_head = NULL;_tail = NULL;}public:void Print(){//if (_head)                 //存在代码冗余//{//cout << "The link is NULL!" << endl;//}//else if (_head == _tail)//{//cout << "_head->_data" << endl;//}//else//{//LinkNode *begin = _head;//while (begin)//{//cout << "begin->data"<<endl;//begin = begin->_next;//}//}cout << "Link->";LinkNode *begin = _head;while (begin){cout << begin->_data<<"->";begin = begin->_next;}cout << "NULL"<<endl;}void PushBack(const DataType &x){if (_head == NULL){_head = new LinkNode(x);       //头尾(成员变量)都要注意   _tail = _head;    }else{LinkNode *tmp = new LinkNode(x);_tail->_next = tmp;tmp->_prev = _tail;_tail = tmp;}}void PushFront(const DataType &x){if (_head == NULL){_head = new LinkNode(x);_tail = _head;}else{LinkNode *tmp = new LinkNode(x);_head->_prev = tmp;tmp->_next = _head;_head = tmp;}}void PopBack(){if (_head == NULL)        //空链表return;if (_head==_tail)         //一个节点{delete _head;_head = NULL;_tail = NULL;}else                      //两个及其以上节点{//_tail = _tail->_prev;//delete _tail->_next;//_tail->_next = NULL;LinkNode *del = _tail;         //定义一个del来保存要删除节点,降低错误率_tail = _tail->_prev;_tail->_next = NULL;}}void PopFront(){if (_head == NULL)        //空链表return;if (_head == _tail)         //一个节点{delete _head;_head = NULL;_tail = NULL;}else{_head = _head->_next;delete _head->_prev;_head->_prev = NULL;}}LinkNode* Find(const DataType& x){if (_head ==NULL){return NULL;}else{LinkNode *begin = _head;while (begin){if (begin->_data == x){return begin;    }begin = begin->_next;}return NULL;}}//void Insert(const DataType &x);void Insert(LinkNode* pos, const DataType& x){/*LinkNode *tmp=new LinkNode(x);tmp->_prev = pos;tmp->_next = pos->_next;pos->_next->_prev = tmp;pos->_next = tmp;*/LinkNode *tmp = new LinkNode(x);LinkNode *next = pos->_next;tmp->_prev = pos;pos->_next = tmp;tmp->_next = next;next->_prev = tmp;}void Erase(LinkNode* del){if (del == NULL||_head==NULL)      //空链表{return;}else if (_head == _tail)                //一个节点{if (del != _head){return;    }_head = NULL;_tail = NULL;}else                              //两个及其以上节点{if (del == _head)             //待删节点为头结点{_head = _head->_next;delete _head->_prev;_head->_prev = NULL;}else if (del == _tail){_tail = _tail->_prev;delete _tail->_prev;_tail->_next = NULL;}else{LinkNode *begin = _head;while (begin){if (begin == del){LinkNode *prev = begin->_prev;LinkNode *next = begin->_next;prev->_next = next;next->_prev = prev;delete begin;begin = NULL;return;}begin = begin->_next;}return;}}}void Remove(const DataType &x){if (_head == NULL){return;}else if (_head == _tail){if (_head->_data != x)return;delete _head;_head = NULL;_tail = NULL;}else{LinkNode *begin = _head;if (_head->_data==x){_head = _head->_next;delete _head->_prev;_head->_prev = NULL;}else if (_tail->_data == x){_tail = _tail->_prev;delete _tail->_next;_tail->_next = NULL;}else{while (begin){if (begin->_data == x){LinkNode *next = begin->_next;LinkNode *prev = begin->_prev;prev->_next = next;next->_prev = prev;delete begin;begin = NULL;return;}begin = begin->_next;}}}}void Reverse()        //双向链表逆置{if (_head == NULL || _head == _tail)return;else{LinkNode *begin = _head;LinkNode *end = _tail;while (begin != end&&end->_next != begin){int tmp=begin->_data;begin->_data = end->_data;end->_data = tmp;begin=begin->_next;end=end->_prev;}}}private:LinkNode *_head;LinkNode *_tail;};void Test1(){Link l;l.PushBack(1);l.PushBack(2);l.PushBack(3);l.PushBack(4);l.Print();l.PushFront(8);l.PushFront(7);l.PushFront(6);l.PushFront(5);l.Print();l.PopBack();l.Print();l.PopFront();l.Print();LinkNode *ret = l.Find(6);//cout << ret<< endl;l.Insert(ret, 0);l.Print();ret = l.Find(8);l.Erase(ret);l.Print();l.Remove(6);l.Print();l.Remove(3);l.Print();l.Remove(0);l.Print();l.Remove(9);l.Print();}void Test2(){Link l1;l1.PushBack(1);l1.PushBack(2);l1.PushBack(3);l1.PushBack(4);l1.PushBack(5);l1.PushBack(6);//l.PushBack(7);l1.Print();Link l2(l1);l2.Print();l1.Reverse();l1.Print();}int main(){//Test1();       //测试增删节点Test2();         //测试逆置,以及默认成员函数return 0;}

0 0
原创粉丝点击