数据结构(三):线性表的链式存储结构
来源:互联网 发布:中国突破第一岛链 知乎 编辑:程序博客网 时间:2024/06/07 03:11
双链表的特点
双链表中的每个节点有两个指针域, 一个指向其后继节点,另一个指向其前驱节点。
所以相对单链表来说,在双链表中访问一个节点的前后的节点更为方便
双链表的节点类型
对于双链表,采用类似于单链表的节点类型定义
//模板节点类型template <typename T>struct DLinkList{ T data; DLinkList<T> *prior; //前驱指针 DLinkList<T> *next; };
双链表的基本运算方法
在双链表中,有些运算(如求长度、去元素、查找元素等算法)与单链表的相应算法是相同的。
不同的是, 在单链表中进行插入删除时涉及前后节点的一个指针域的变化。
而在双链表中,结点的插入和删除操作涉及前后结点的两个指针域的变化。
//双链表类模板 template <typename T> class DLinkListClass { DLinkList<T>* dhead; //双链表表头指针public: DLinkListClass<T>(); //构造函数, 创建一个空栓链表 ~DLinkListClass<T>(); //析构函数,销毁双链表 void CreateListF(T a[], int n); //头插法建表 void CreateListR(T a[], int n); //尾插法建表 bool ListInsert(int i , T e); //插入数据元素 bool ListDelete(int i); //删除数据元素 void DispList(); //遍历显示链表 public: //友元函数 template<typename A> friend bool Delnode(DLinkListClass<A> &L); //删除第一个值为x的节点 template<typename A> friend bool Delmaxnode(DLinkListClass<A> &L); //删除第一个值最大的节点 };
实现代码
template<typename A>bool Delnode(DLinkListClass<A> &L) //删除第一个值为x的节点 { DLinkList<A> *p= L.dhead->next, *pre; while(p != NULL) p= p->next; if(p == NULL) return false; else { pre = p->prior; if(p->next != NULL) p->next->prior = pre; pre->next = p->next; delete p; return true; }}template<typename A>bool Delmaxnode(DLinkListClass<A> &L) //删除第一个值最大的节点 { DLinkList<A> *p = L.dhead->next, *maxp = p, *pre; while(p != NULL) { if(p->data > maxp->data) maxp = p; p = p->next; } pre = maxp->prior; if(maxp->next != NULL) maxp->next->prior = pre; pre->next = maxp->next; delete maxp;}//构造函数 template<typename T>DLinkListClass<T>::DLinkListClass(){ dhead = new DLinkList<T>(); dhead->next = NULL; dhead->prior = NULL;}//析构函数 template<typename T>DLinkListClass<T>::~DLinkListClass<T>(){ DLinkList<T> *p, *q; p = dhead; q = p->next; while(q != NULL) { delete p; p = q; q = q->next; } delete p;}//头插法template<typename T>void DLinkListClass<T>:: CreateListF(T a[], int n){ DLinkList<T> *s; int i; for(i = 0; i < n; i++) { s = new DLinkList<T>(); s->data = a[i]; s->next = dhead->next; if(dhead->next != NULL) dhead->next->prior = s; dhead->next = s; s->prior = dhead; }}//尾插法template<typename T>void DLinkListClass<T>:: CreateListR(T a[], int n){ DLinkList<T> *s, *r; int i; r = dhead; for(i = 0; i < n; i++) { s = new DLinkList<T>(); s->data = a[i]; r->next = s; s->prior = r; r = s; } r->next = NULL;}//插入数据元素template<typename T>bool DLinkListClass<T>::ListInsert(int i, T e){ int j =0; DLinkList<T> *s, *p = dhead; while(j < i-1 && p != NULL) { j++; p = p->next; } if(p == NULL) return false; else { s = new DLinkList<T>(); s->data = e; s->next = p->next; if(p->next != NULL) p->next->prior =s; s->prior = p; p->next = s; return true; }}//删除数据元素template<typename T>bool DLinkListClass<T>::ListDelete(int i){ int j =0; DLinkList<T> *q, *p = dhead; while(j < i-1 && p != NULL) { j++; p = p->next; } if(p == NULL) return false; else { q = p->next; if(q == NULL) return false; p->next = q->next; if(p->next != NULL) p->next->prior = p; delete q; return true; }}//遍历显示链表template <typename T>void DLinkListClass<T>::DispList(){ DLinkList<T> *p = dhead->next; while(p!= NULL) { cout << p->data << " "; p = p->next; }}int main(){ int a[5] = {1,2,3,4,5}; char b[5] = {'a', 'b', 'c','d','e'}; DLinkListClass<int> Link1; DLinkListClass<char> Link2; Link1.CreateListF(a, 5); Link2.CreateListR(b, 5); Link1.ListInsert(3, 55); Link2.ListDelete(3); cout << "头插法\n"; Link1.DispList(); Delmaxnode(Link1); cout << "\nDelmaxnode\n"; Link1.DispList(); cout << "\n尾插法\n"; Link2.DispList(); return 0;}
本人github链接: https://github.com/ITMasterC 欢迎来共同探讨,C++,cocos2dx游戏,数据结构,C语言实现小游戏代码…………
0 0
- 数据结构(三):线性表的链式存储结构
- 【数据结构】线性表的链式存储结构
- 【数据结构】-线性表的链式存储结构
- 线性表的链式存储结构(三)
- 大话数据结构三:线性表的链式存储结构(静态链表)
- 大话数据结构三:线性表的链式存储结构(静态链表)
- 数据结构:线性表之链式存储结构
- <数据结构>线性表.链式存储结构
- 【数据结构】线性表之链式存储结构
- 数据结构---线性表----链式存储结构
- 数据结构:线性表之链式存储结构
- 数据结构二线性链表的链式存储结构
- 跟我学数据结构-- 线性表的链式存储结构
- 数据结构笔记之线性表的链式存储结构
- Python 数据结构 之 线性表 的链式存储结构
- 【数据结构基础】线性表的链式存储结构--单链表
- 数据结构:线性表的链式存储结构_单链表
- 【数据结构】线性表的链式存储结构--单链表
- 前言
- 树状数组——BZOJ3192/Luogu3253 [JLOI2013]删除物品
- iOS开发 message sent to deallocated instance问题解决
- CentOS6 安装golang
- 排序算法的稳定性与不稳定性
- 数据结构(三):线性表的链式存储结构
- OKHttp使用之粗陋封装
- GCD的基本概念和使用
- 消息队列设计
- java文件普通复制和NIO复制
- MATLAB中ismember函数
- Dynamics CRM2016 Web API之查询单个属性字段的值
- LeetCode 14. Longest Common Prefix 找字符串数组最长相同前缀
- 如何通俗易懂地解释「协方差」与「相关系数」的概念?