双向链表(c++封装)
来源:互联网 发布:java方法交换两个变量 编辑:程序博客网 时间:2024/05/21 08:48
双向链表是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。结构图如下所示:其中_pPre是双向链表的前驱结点,_pNext是它的后继结点,_data是数据域
代码实现:
#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<assert.h>using namespace std;typedef int DataType;class Node{public: Node(const DataType& data) : _pNext(NULL) , _pPre(NULL) , _data(data) {} Node* _pNext; Node* _pPre; DataType _data; };class List { public: friend ostream& operator<<(ostream& _cout, const List& list)//输出运算符的重载 { Node* pCur = list._pHead; if (pCur == NULL)//空链表 _cout << "NULL"; else { while (pCur->_pNext) { _cout << pCur->_data << "->"; pCur = pCur->_pNext; } _cout << pCur->_data << "->"; _cout << "NULL"; } return _cout; } List() : _pHead(NULL) {} List(DataType* array, size_t size) { for(size_t i = 0; i < size; ++i) { PushBack(array[i]); } } List& operator=(const List& list)//赋值运算符的重载 { Node* pCur = list._pHead; if (this != &list) { while (pCur->_pNext) { PushBack(pCur->_data); pCur = pCur->_pNext; } PushBack(pCur->_data); } return *this; } void PushBack(const DataType data);//尾插void PopBack();//尾删void PushFront(const DataType data); //头插void PopFront();。。头删Node* Find(const DataType data);//寻找指定元素Node* Erase(Node* pos); //任意位置删除Node* Insert(Node* pos, const DataType& data); //任意位置插入size_t Size()//求节点个数{ size_t i=0; Node* pCur=_pHead; if(_pHead==NULL) { return 0; } else { while(pCur->_pNext) { ++i; pCur=pCur->_pNext; } return i+1; }}void Clear(){ Node* pCur=_pHead; if(_pHead==NULL) { return; } else { while(pCur->_pNext==NULL) { pCur->_pPre->_pNext=NULL; delete pCur; } _pHead=NULL; }}~List() { Node* _pCur=_pHead; if(_pHead==NULL&&_pHead->_pNext==NULL) { return; } while(_pHead&&_pHead->_pNext) { _pCur=_pHead; _pHead=_pHead->_pNext; delete _pCur; } delete _pHead; }private: Node* _pHead; };void List::PushBack(const DataType data) { Node* pTail = _pHead; Node* pNewNode = new Node(data); if(_pHead==NULL) { _pHead=pNewNode; pNewNode->_pPre=pTail; } else { while(pTail->_pNext) { pTail = pTail->_pNext; } pTail->_pNext = pNewNode; pNewNode->_pPre = pTail; } pNewNode->_data=data; pNewNode->_pNext=NULL;} void List::PopBack(){ Node* pCur=_pHead; if(pCur==NULL) { return; } else { while(pCur->_pNext) { pCur=pCur->_pNext; } pCur->_pPre->_pNext=NULL; delete pCur; }}void List::PushFront(const DataType data){ Node* NewNode=new Node(data); if(_pHead==NULL) { NewNode->_data=data; NewNode->_pNext=_pHead; NewNode->_pPre=NULL; _pHead=NewNode; } _pHead->_pPre=NewNode;}void List::PopFront(){ Node* pCur=_pHead; if(pCur==NULL) { return; } else _pHead=_pHead->_pNext; _pHead->_pPre=NULL; delete pCur;}Node* List::Find(const DataType data){ Node* pCur=_pHead; if(pCur==NULL) { return NULL; } else if((pCur->_pNext==NULL)&&(pCur->_data==data)) { return pCur; } else { while(pCur->_pNext) { if(pCur->_data==data) return pCur; pCur=pCur->_pNext; } } return NULL;}Node* List::Insert(Node* pos, const DataType& data)//任意位置删除{ Node* NewNode=new Node(data); assert(pos); if(pos==_pHead) { PushFront(data); } else if(pos->_pNext==NULL) { PushBack(data); } else { NewNode->_pNext=pos; pos->_pPre->_pNext=NewNode; NewNode->_pPre=pos->_pPre; pos->_pPre=NewNode; NewNode->_data=data; } return _pHead;}Node* List::Erase(Node* pos){ if(pos==NULL) { return _pHead; } if(pos==_pHead) { PopFront(); } else { pos->_pPre->_pNext=pos->_pNext; pos->_pNext->_pPre=pos->_pPre; delete pos; } return _pHead;}DataType array[]={1,2,3};List list(array,sizeof(array)/sizeof(array[0]));void Test1()//PushBack PopBack { list.PushBack(4); cout<<list<<endl; list.PopBack(); cout<<list<<endl;}void Test2()//PushFront PopFront{ list.PushFront(0); cout<<list<<endl; list.PopFront(); cout<<list<<endl;}void Test4()//Size Clear { cout<<list<<endl; size_t size=list.Size(); cout<<"Size="<<size<<endl; list.Clear(); cout<<list<<endl;}void Test5()//Insert Find{ Node* pos=list.Find(2); list.Insert(pos,5); cout<<list<<endl;}void Test6()//Erase{ Node* pos=list.Find(2); list.Erase(pos); cout<<list<<endl;}void Test7()//赋值运算符的重载{ List list2; list2=list; cout<<list2<<endl;}int main(){ //Test1(); //Test2(); //Test3(); //Test4(); //Test5(); //Test6(); Test7(); system("pause"); return 0;}
阅读全文
0 0
- 双向链表(c++封装)
- 双向链表(C++)
- 双向链表c
- C双向链表
- 【C++】双向链表
- 【C++】双向链表
- C 双向链表
- 数据结构封装之《DLinkList双向链表》
- 类的封装性 -- 双向链表
- 数据结构封装之《DLinkList双向链表》
- 数据结构(C实现)------- 双向链表
- 数据结构 - 双向链表(C++)
- 双向链表(C实现)
- 双向循环链表list(C++)
- 双向链表C语言
- 数据结构(C#)--双向链表
- List-c双向链表
- [C++]双向链表操作
- PowerDesigner16 状态图
- maven私服nexus搭建
- Angularjs遇见的启动失败
- 百度SDK之方向传感器的应用
- PAT乙级1072. 开学寄语(20)
- 双向链表(c++封装)
- NOIP2006 2^k进制数
- python之实战----逻辑回归战iris
- Python面试总结(四)ip正则与三次握手四次挥手
- 过采样和欠采样
- 20191021考试总结
- matlab中plot函数最简单应用
- 模板类实现顺序表
- 【NOIP2017提高A组集训10.21】 总结