数据结构-线性表-双向链表(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)在计算机科学中是限定仅在表尾进行插入或删除操作的线性表.栈是一种数据结构,它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据.栈 ...
随机推荐
- 解决phpMyAdmin点击"结构"列页面失去响应的问题
最后更新时间 2017-12-05. 我的环境: phpMyAdmin:4.0.4.1 PHP:5.6.11 第一步 关闭自动更新 打开 ./libraries 目录下的 vendor_config. ...
- 无需学习Python,一个公式搞定领导想看的大屏
摘要:本文由葡萄城技术团队于博客园原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 不要让"做不了"成为数字化转型的障碍 随着 ...
- TCP 初识(一)
什么是TCP? TCP是面向连接的,可靠的,基于字节流的传输层通信协议. 面向连接:一定是一对一才能连接,不能像UDP协议可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的. 可靠的:无论网 ...
- windows传输文件到linux
PFSTP 打开该软件,在安装putty自带的 连接服务器 open 192.168.142.131 按提示输入账户密码 传送文件 put C:\Users\13662\nifi-1.13.2-bin ...
- 基于 Habana Gaudi 的 Transformers 入门
几周前,我们很高兴地 宣布 Habana Labs 和 Hugging Face 将开展加速 transformer 模型的训练方面的合作. 与最新的基于 GPU 的 Amazon Web Servi ...
- Cobalt Strike使用教程二
0x00 前言 继前一章介绍了Cobalt Strike的基本用法,本章接着介绍如何攻击.提权.维权等. 0x01 与Metasploit联动 Cobalt Strike → Metasploit m ...
- 您在 /var/spool/mail/root 中有新邮件
查看邮件 删除邮件 禁止系统启动邮件检查这样就再有邮件提示了 mail cat /dev/null > /var/spool/mail/root echo "unset MAILCHE ...
- Midjourney的一些学习心得:如何高效的图生图
注意本文没有什么长篇大论,全部是自己的学习心得. 心得体会:如何图生图 今天在一篇midjourney看到好图应该怎么抄. 相信经常会看到好图也想要的,但是要么抄不出感觉,要么抄过来把水印也抄了,这一 ...
- .NET周刊【8月第4期 2023-08-27】
国内文章 AgileConfig-1.7.0 发布,支持 SSO https://www.cnblogs.com/kklldog/p/agileconfig-170.html AgileConfig ...
- ORM分组查询复杂查询
记录一下自己在工作中遇到的一个问题,就是根据一个字段分类,然后还要统计这个字段不同状态的数量,这里我举个例子 假如有好多学生,这些学生来自不同的班级,现在我们要统计每一个班级中男生和女生的数量 def ...