C++简单实现双链表
来源:互联网 发布:linux虚拟机使用教程 编辑:程序博客网 时间:2024/06/08 08:33
首先,来了解一下什么是双向链表。官方解释是这样的:双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。
来一波图:
由上图可以看出:其实双向链表是由很多个节点组成的,而每一个节点又分为三个部分,一个数据域,用于存放数据;两个指针,一个用于指向前一个节点,另一个用于指向后一个节点。而当前边和后边没有节点的时候就指向NULL。
接下来看具体代码实现:
#include <iostream>using namespace std;#include <assert.h>typedef int DataType;struct Node{Node(const DataType& data): _pNext(NULL), _pPre(NULL), _data(data){}Node* _pNext;Node* _pPre;DataType _data;};class List{public:List()//构造函数: _pHead(NULL){}List(DataType* array, size_t size)//构造函数{for (size_t i = 0; i < size; ++i)PushBack(array[i]);}~List()//析构函数{Node* pTail = _pHead;while ((_pHead) && (_pHead->_pNext)){pTail = _pHead;_pHead = _pHead->_pNext;delete pTail;}delete _pHead;} 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();//求节点个数 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* pTail = _pHead;if (pTail == NULL){return;}else{while (pTail->_pNext){pTail = pTail->_pNext;}pTail->_pPre->_pNext = NULL;//将删除节点前一节点的pNext指针指向NULLdelete pTail;}}
前插和后插都差不多,这里就以前插为例做一个详细讲解(前删和后删都特别简单,就不多做讲解了)
具体代码:
void List::PushFront(const DataType data)//前插{Node* NewNode = new Node(data);if (_pHead != NULL){_pHead->_pPre = NewNode;}NewNode->_data = data;NewNode->_pNext = _pHead;NewNode->_pPre = NULL;_pHead = NewNode;}
void List::PopFront()//前删{if (_pHead == NULL){return;}else{Node* del = _pHead;_pHead = _pHead->_pNext;_pHead->_pPre = NULL;delete del;}}Node* List::Find(const DataType data)//查找函数{Node* pTail = _pHead;//空链表if (pTail == NULL){return NULL;}//只有一个节点的情况else if ((_pHead->_pNext == NULL) && (_pHead->_data == data)){return _pHead;}//多节点情况else{while (pTail->_pNext){if (data == pTail->_data){return pTail;}pTail = pTail->_pNext;}}return NULL;}
删除任意位置的详解:
具体代码:
Node* List::Erase(Node* pos)//删除任意位置节点{if (NULL == pos){return _pHead;}if (pos == _pHead)//删除头节点{PopFront();}else{pos->_pPre->_pNext = pos->_pNext;pos->_pNext->_pPre = pos->_pPre;delete pos;}return _pHead;}
任意位置插入节点详解:
具体代码:
Node* List::Insert(Node* pos, const DataType& data)//任意位置插入{assert(NULL != pos);Node* NewNode = new Node(data);if (pos == _pHead){PushFront(data);return _pHead;}else if (NULL == pos->_pNext){PushBack(data);return _pHead;}else{NewNode->_pNext = pos;pos->_pPre->_pNext = NewNode;NewNode->_pPre = pos->_pPre;pos->_pPre = NewNode;NewNode->_data = data;return _pHead;}}
size_t List::Size()//求节点个数{if (_pHead == NULL){return 0;}else{size_t count = 1;Node* pTail = _pHead;while (pTail->_pNext){++count;pTail = pTail->_pNext;}return count;}}DataType array[] = { 1, 2, 3, 4, 5, 6 };List list(array, sizeof(array) / sizeof(array[0]));void FunTest1(){list.PushBack(7);list.PopBack();list.PushFront(7);list.PopFront();}void FunTest2(){Node* pos = list.Find(2);list.Erase(pos);Node* position = list.Find(4);list.Insert(position, 8);}void FunTest3(){size_t size = list.Size();cout << "size=" << size << endl;}int main(){FunTest1();FunTest2();FunTest3();return 0;}
阅读全文
0 0
- 简单计算器实现(C++)
- c++vector简单实现
- C实现简单列表
- 简单五子棋----C语言实现
- C语言实现简单单链表
- linux c实现简单shell
- C语言简单实现五子棋
- C实现简单循环队列
- ANTLR实现简单计算器[C#]
- c循环队列简单实现
- 简单的单链表实现 c
- 《简单计算器实现(c#)》
- c库函数的简单实现
- 简单链表(C实现)
- c简单实现日志记录
- C语言简单实现接口
- 【STL C++】简单实现vector
- c/c++实现简单计算器
- 【OI之路】07动态规划
- 有趣算法--“异或” 原理及应用
- 160个CrackMe之91
- Linux学习路程(1) 学习目的
- 类的继承
- C++简单实现双链表
- leetcode 58. Length of Last Word(C语言,计算最后一个单词的长度)19
- Nginx源码剖析--模块配置信息初始化
- JS实现继承的几种方式
- 深入理解Spring系列之九:DispatcherServlet初始化源码分析
- 自学mysql—Mysql执行顺序
- 基础练习 特殊回文数
- 一个最简单的循环
- python里实现插入排序算法