数据结构-线性表-双向链表(c++)
与单循环链表类似,但析构函数需要注意
- 析构函数:
因为while循环的条件是p->next!=front,所以不能直接delete front;
template<class T>
TWLinkList<T>::~TWLinkList()
{
Node<T>* p = front;
while (p->next!=front)
{
Node<T>* temp = p;
p = p->next;
delete temp;
}
delete p;
}
所以不能直接delete front,这样会使判断语句失效(front被释放)
template<class T>
TWLinkList<T>::~TWLinkList()
{
Node<T>* p = front;
while (p->next!=front)
{
front = p;
p = p->next;
delete front;
}
delete p;
}
TowWayLinkList.h
#ifndef TOWWAYLINKLIST_H_
#define TOWWAYLINKLIST_H_
#include<iostream>
template<class T>
struct Node
{
T data;
struct Node<T>* prior;
struct Node<T>* next;
};
template<class T>
class TWLinkList
{
private:
Node<T>* front;
public:
TWLinkList();
TWLinkList(T a[],int n);
~TWLinkList();
int GetLength()const;
void Print()const;
Node<T>* Get(int i);
int Location(T x)const;
void Insert(int i, T x);
void Delete(int i);
void Sort();
void Connect(TWLinkList<T>& b);
};
template<class T>
TWLinkList<T>::TWLinkList()
{
front = new Node<T>;
front->next = front;
front->prior = front;
}
template<class T>
TWLinkList<T>::TWLinkList(T a[], int n)
{
front = new Node<T>;
Node<T>* rear = front;
for (int i = 0; i < n; i++)
{
Node<T>* s = new Node<T>;
s->data = a[i];
rear->next = s;
s->prior = rear;
rear = s;
}
rear->next = front;
front->prior = rear;
}
template<class T>
TWLinkList<T>::~TWLinkList()
{
Node<T>* p = front;
while (p->next!=front)
{
Node<T>* temp = p;
p = p->next;
delete temp;
}
delete p;
}
template<class T>
int TWLinkList<T>::GetLength() const
{
int i = 0;
Node<T>* p = front;
while (p->next != front)
{
p = p->next;
i++;
}
return i;
}
template<class T>
void TWLinkList<T>::Print() const
{
int i = 0;
Node<T>* p = front->next;
while (p->next != front)
{
std::cout << p->data << " ";
if (i % 5 == 4)
std::cout << std::endl;
p = p->next;
i++;
}
std::cout << front->prior->data << std::endl;
}
template<class T>
Node<T>* TWLinkList<T>::Get(int i)
{
int j = 0;
Node<T>* p = front;
if (i == GetLength())return front->prior;
while (p->next != front&&j!=i)
{
p = p->next;
j++;
}
return p;
}
template<class T>
int TWLinkList<T>::Location(T x)const
{
int i = 0;
Node<T>* p = front;
if (x == front->prior->data) return GetLength();
while (p->next != front)
{
p = p->next;
i++;
if (p->data == x)
return i;
}
return -1;
}
template<class T>
void TWLinkList<T>::Insert(int i, T x)
{
Node<T>* p = front;
if (i != 1)
p = Get(i - 1);
Node<T>* s = new Node<T>;
s->data = x;
s->next = p->next;
p->next->prior = s;
p->next = s;
s->prior = p;
}
template<class T>
void TWLinkList<T>::Delete(int i)
{
Node<T>* p = front;
if (i != 1)
p = Get(i - 1);
Node<T>* q = p->next;
p->next->next->prior = p;
p->next = q->next;
delete q;
}
template<class T>
void TWLinkList<T>::Sort()
{
for (int i = 0; i < GetLength(); i++)
{
Node<T>* p = front->next;
while (p->next != front)
{
if (p->data > p->next->data)
{
T t;
t = p->next->data;
p->next->data = p->data;
p->data = t;
}
p = p->next;
}
}
}
template<class T>
void TWLinkList<T>::Connect(TWLinkList<T>& b)
{
Node<T>* p = b.front;
b.front->next->prior = front->prior;
front->prior->next = b.front->next;
b.front->prior->next = front;
front->prior = b.front->prior;
p->next = p;
p->prior = p;
}
#endif // !TOWWAYLINKLIST_H_
Use.cpp
#include<iostream>
#include"TowWayLinkList.h"
const int SIZE = 10;
int main()
{
using std::cout;
using std::endl;
int ss[SIZE] = { 9,3,4,1,5,0,8,6,2,7 };
int qq[5] = { 0,1,2,3,4 };
TWLinkList<int> Grade(ss, SIZE);
TWLinkList<int> B(qq, 5);
cout << "链表内容:" << endl;
Grade.Print();
cout << "长度为:" << endl;
cout << Grade.GetLength() << endl;
cout << "查找5的位置:" << endl;
cout << Grade.Location(5) << endl;
cout << "删除第10个位置后的内容:" << endl;
Grade.Delete(10);
Grade.Print();
cout << "此时长度为:" << endl;
cout << Grade.GetLength() << endl;
cout << "在第9个位置插入11的内容:" << endl;
Grade.Insert(9, 11);
Grade.Print();
cout << "排序后:" << endl;
Grade.Sort();
Grade.Print();
Grade.Connect(B);
cout << "连接后:" << endl;
Grade.Print();
return 0;
}
数据结构-线性表-双向链表(c++)的更多相关文章
- [从今天开始修炼数据结构]线性表及其实现以及实现有Itertor的ArrayList和LinkedList
一.线性表 1,什么是线性表 线性表就是零个或多个数据元素的有限序列.线性表中的每个元素只能有零个或一个前驱元素,零个或一个后继元素.在较复杂的线性表中,一个数据元素可以由若干个数据项组成.比如牵手排 ...
- [数据结构-线性表1.2] 链表与 LinkedList<T>(.NET 源码学习)
[数据结构-线性表1.2] 链表与 LinkedList<T> [注:本篇文章源码内容较少,分析度较浅,请酌情选择阅读] 关键词:链表(数据结构) C#中的链表(源码) 可空类 ...
- C# 数据结构 线性表(顺序表 链表 IList 数组)
线性表 线性表是最简单.最基本.最常用的数据结构.数据元素 1 对 1的关系,这种关系是位置关系. 特点 (1)第一个元素和最后一个元素前后是没有数据元素,线性表中剩下的元素是近邻的,前后都有元素. ...
- C#实现数据结构——线性表(下)
线性表链式存储结构 看了线性表的顺序存储,你肯定想线性表简是挺简单,但是我一开始怎么会知道有多少人排队?要分配多大的数组?而且插入和删除一个元素也太麻烦了,所有元素都要前移/后移,效率又低. 那怎么办 ...
- python数据结构——线性表
线性表 线性表可以看作是一种线性结构(可以分为顺序线性结构,离散线性结构) 1. 线性表的种类: 顺序表 元素存储在一大块连续存储的地址中,首元素存入存储区的起始位置,其余元素顺序存放. (元素之间的 ...
- 数据结构线性表(js实现)
最近在复习数据结构的过程中,发现基本上数据结构都是用C来实现的,自己之前学习的时候也是用C去写的,由于目前对js更为熟悉一些,所以这里选择使用js去实现其中的某些算法和结构.实际上算法和语言关系不大, ...
- C#实现数据结构——线性表(上)
什么是线性表 数据结构中最常用也最简单的应该就是线性表,它是一种线性结构(废话,不是线性结构怎么会叫线性表?当然不是废话,古人公孙龙就说白马非马,现代生物学家也说鲸鱼不是鱼). 那什么是线性结构? 按 ...
- [置顶] ※数据结构※→☆线性表结构(queue)☆============循环队列 顺序存储结构(queue circular sequence)(十)
循环队列 为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量.存储在其中的队列称为循环队列(Circular Queue). ...
- [置顶] ※数据结构※→☆线性表结构(queue)☆============优先队列 链式存储结构(queue priority list)(十二)
优先队列(priority queue) 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除.在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先删除.优先队列具有 ...
- [置顶] ※数据结构※→☆线性表结构(stack)☆============栈 序列表结构(stack sequence)(六)
栈(stack)在计算机科学中是限定仅在表尾进行插入或删除操作的线性表.栈是一种数据结构,它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据.栈 ...
随机推荐
- ISP图像处理——紫边Purple Fringing检测
之前写过文章记紫边的形成原因,以下小结改善方法 图像紫边存在数码相机.监控摄像头等数字成像图像,使用设备在逆光.大光圈条件下拍摄图像的高反差区域容易出现紫边,解决图像自编问题有助设备得到完美图像. 紫 ...
- Spring的Bean标签配置(一)
Bean标签基本配置 由于配置对象交由Spring来创建 默认情况下它调用的的是类中的无参构造函数,如果没有无参构造函数则不会创建成功 id:唯一标识符号,反射是通过无参构造创建对象的. class: ...
- quarkus实战之四:远程热部署
将本地的改动极速同步到远程服务端,并自动生效,掌握此技能,开发调试会更高效 欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/ ...
- 二进制安装K8S
参考链接:https://zhuanlan.zhihu.com/p/408967897 准备工作 3台Centos7.9虚拟机 虚拟机配置:2C4G,能连接外网 虚机规划 ip 用途 192.168. ...
- FPGA学习之乒乓操作
乒乓操作学习记录如下: 乒乓操作" 是一个常常应用于数据流控制的设计思想, 典型的乒乓操作方法如下图 所示: 乒乓操作的处理流程为:输入数据流通过" 输入数据选择单元"将 ...
- EntityCleanFramework
EF几乎是按照领域的概念诞生,它可以和Clean结合(ECF是我新想出的名字).ECF 是为了统一业务架构开发方式,也可以说成在 微服务架构 中服务的通用开发方式.当有了统一开发方式后,协作将更上一层 ...
- 行行AI人才直播第14期:【国内第二波人工智能进入者、连续创业者】土豆《土豆利用GPT成功融资两次的提示词和故事》
行行AI人才(海南行行智能科技有限公司)是博客园和顺顺智慧共同运营的AI行业人才全生命周期服务平台. 此刻,ChatGPT的火热程度已经无需多言.一时间,追逐大模型成了国内AI行业的标准动作,&quo ...
- JDBC:使用IDEA配置JDBC
IDEA使用Jar包 操作流程 步骤1:创建lib路径 步骤2:复制jar包 步骤3:必须要做的一步 参考链接 https://blog.csdn.net/upup1006/article/detai ...
- go 判断文件是否存在,并创建
1 package main 2 3 import ( 4 "fmt" 5 "os" 6 ) 7 8 //判断文件夹是否存在 9 func PathExists ...
- Wampserver64 报错:无法启动此程序,因为计算机中丢失 MSVCR110.dll。尝试重新安装该程序以解决此问题。
缺少环境配置, 程序下载地址如下: https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=30679 点击下载,下载完成后,双击程 ...