c++ 实现双向链表构造函数,拷贝构造函数,析构函数,输出操作符重载,赋值操作符重载,头插尾插,头删尾删,任意位置插入,任意位置删除,查找等

来源:互联网 发布:大数据建模案例 编辑:程序博客网 时间:2024/05/04 00:20


这几个图是在写的时候画的,有助于理解。







清空链表



List.h


#pragma once#include <iostream>using namespace std;typedef int DataType;struct Node{Node(const DataType& _data = 0):data(_data),pPre(NULL),pNext(NULL) // 一定要记得将此处置空{}DataType data;Node *pPre;Node *pNext;};class List{private:Node *_pHead;  // 头指针Node *_pTail;  // 尾指针size_t _size;  // 当前个数private:// 创建一个新的结点Node* BuyNode(const DataType &data){return new Node(data);}public:// 构造函数List():_pHead(NULL),_pTail(NULL),_size(0){}// 拷贝构造函数List(const List&list):_pHead(NULL),_pTail(NULL),_size(0){Node *pCurNode = list._pHead;while (pCurNode){PushBack(pCurNode->data);pCurNode = pCurNode->pNext;}}// 析构函数~List(){Clear();}// 重载赋值运算符List& operator=(const List& list){if (this != &list){Clear();Node *pCurNode = list._pHead;while (pCurNode){PushBack(pCurNode->data);pCurNode = pCurNode->pNext;}}return *this;}// 重载输出运算符friend ostream& operator<<(ostream& _cout, const List& list);// 尾插void PushBack(const DataType& data);// 尾删void PopBack();// 头插void PushFront(const DataType& data);// 头删void PopFront();// 任意位置插入void Insert(Node* pos, DataType& data);// 任意位置删除void Erase(Node * pos);// 置空链表void Clear();// 查找Node* Find(const DataType& data)const;//判空bool Empty()const;// 返回首结点Node& Front();//这里应该返回note 还是note*呢?const Node& Front()const;// 返回首结点Node& Back();const Node& Back()const;// 返回结点个数size_t Size()const;};




List.cpp

#include "List.h"void List::PushBack(const DataType& data){if (NULL == _pHead){Node *pNewNode = BuyNode(data);_pHead = _pTail = pNewNode;}else{Node *pNewNode = BuyNode(data);_pTail->pNext = pNewNode;pNewNode->pPre = _pTail;_pTail = pNewNode;}++_size;}// 尾删void List::PopBack(){if (NULL == _pHead){return;}else if(1 == _size){delete _pHead;_pHead = _pTail = NULL;}else{_pTail = _pTail->pPre;delete _pTail->pNext;_pTail->pNext;}--_size;}// 输出操作符重载ostream& operator<<(ostream& _cout, const List &list){if (0 == list._size){cout << "链表为空" << endl;}else{Node* pCurNode = list._pHead;while (pCurNode){cout << pCurNode->data <<endl;pCurNode = pCurNode->pNext;}}return _cout;}// 头插void List::PushFront(const DataType& data){// 无结点if (NULL == _pHead){Node* pNewNode = BuyNode(data);_pHead = _pTail = pNewNode;}// 有结点 与尾插类似else{Node* pNewNode = BuyNode(data);pNewNode->pNext = _pHead;_pHead->pPre = pNewNode;_pHead = pNewNode;}++_size;}// 头删 void List::PopFront(){if (NULL == _pHead){return;}else if(1 == _size){delete _pHead;_pHead = _pTail = NULL;}else{_pHead = _pHead->pNext;delete _pHead->pPre;_pHead->pPre = NULL;}--_size;}// 清空void List::Clear(){Node* pCurNode = _pHead;Node* pCurNodeNext = _pHead;while (pCurNodeNext){pCurNodeNext = pCurNodeNext->pNext;delete pCurNode;pCurNode = pCurNodeNext;}_pHead = _pTail = NULL;_size = 0;}// 任意位置插入void List::Insert(Node* pos, DataType& data){if (NULL == pos){return;}else if(pos == _pTail){PushFront(data);}else{Node* pNewNode = BuyNode(data);pNewNode->pNext = pos->pNext;pos->pNext->pPre = pNewNode;pos->pNext = pNewNode;pNewNode->pPre = pos;++_size;}}// 任意位置删除void List::Erase(Node * pos){if (NULL == pos){return;}else if (pos == _pHead){PopFront();}else if(pos == _pTail){PopBack();}else{pos->pPre->pNext = pos->pNext;pos->pNext->pPre = pos->pPre;--_size;}}// 查找Node* List::Find(const DataType& data)const{Node *pCurNode = _pHead;while (pCurNode){if (data == pCurNode->data){return pCurNode;}}return NULL;}//判空bool List::Empty()const{return 0 == _size;}// 返回首结点Node& List::Front()//这里应该返回note 还是note*呢?{return *_pHead;}const Node& List::Front()const {return *_pHead;}// 返回首结点Node& List::Back(){return *_pTail;}const Node& List::Back()const{return *_pTail;}// 返回节点个数size_t List::Size()const{return _size;}


测试主函数略去,可自行测试

0 0
原创粉丝点击