数据结构-线性表-双向链表(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)在计算机科学中是限定仅在表尾进行插入或删除操作的线性表.栈是一种数据结构,它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据.栈 ...
随机推荐
- 2021-11-30 wpf的mvvm绑定2
主页页面代码 <Grid> <TextBox x:Name="First" Width="80" Height="20" ...
- K8S | Service服务发现
服务发现与负载均衡. 一.背景 在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关.注册中心.配置中心等相关服务,可以被集群外部访问: 对于测试「Tes」环境或者 ...
- 【工具】-Misc-Python-dsstore
介绍 这是一个.DS_Store解析工具. 什么是.DS_Store .DS_Store 是 Desktop Services Store 的缩写,是 macOS 操作系统上的一个不可见文件,只要您使 ...
- 使用$test$plusargs提高RTL验收速度
0 前言 这段时间在整合一个小ip,因为要验证每个feature是否可行,需要用testbench + C语言的方式进行仿真验证,由于每种feature不仅要在C语言中修改寄存器配置,还要再testb ...
- centos转移mysql的数据存储目录
前言 centos7使用yum安装mysql的时候,没修改存储位置,/var也没单独挂载,导致长时间运行后根目录空间不足.现需要将数据转移到大分区的/home,操作步骤如下. 步骤 创建新目录 mkd ...
- vue实现文本复制
一. 下载插件 npm install --save vue-clipboard2 二. main.js import VueClipBoard from 'vue-clipboard2' Vue.u ...
- Web通用漏洞--CSRF
Web通用漏洞--CSRF 漏洞简介 CSRF(Cross Site Request Forgery, 跨站请求伪造/客户端请求伪造),即通过伪造访问数据包并制作成网页的形式,使受害者访问伪造网页,同 ...
- 基于C#的消息处理的应用程序 - 开源研究系列文章
今天讲讲基于C#里的基于消息处理的应用程序的一个例子. 我们知道,Windows操作系统的程序是基于消息处理的.也就是说,程序接收到消息代码定义,然后根据消息代码定义去处理对应的操作.前面有一个博文例 ...
- 拯救Win7,2023该如何正确升级?
对于现存的Win7系统用户,微软曾多次提醒将在2023年1月停止对Win7与Win8.1的安全更新和技术支持.而转眼已经来到2023,时间已到,对于Win7,微软已经再也不管了,停止为Win7用户提供 ...
- zbolg首页-文章内标签调用代码
{if count($lhantItem.Tags)>0}{foreach $lhantItem.Tags as $i => $tag} <a href='{$tag.Url}' t ...