数据结构-线性表-双向链表(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)在计算机科学中是限定仅在表尾进行插入或删除操作的线性表.栈是一种数据结构,它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据.栈 ...
随机推荐
- 用极限网关实现 ES 容灾,简单!
身为 IT 人士,大伙身边的各种系统肯定不少吧.系统虽多,但最最最重要的那套.那几套,大伙肯定是捧在手心,关怀备至.如此重要的系统,万一发生故障了且短期无法恢复,该如何保障业务持续运行? 有过这方面思 ...
- TCP的Keep-Alive机制:链接存在但是没有数据传输,内核怎么处理
服务端/客户端会定期发送探测报文来检测客户端的存活状态. 由三个内核参数控制: 首次发送探测报文时间:net.ipv4.tcp_keepalive_time有报文传输时重置 探测报文的发送间隔:net ...
- 使用 virt-install 命令创建虚拟机
实践 参考文档:官方手册 这个命令适用于创建第一个虚拟机,后面如果再增加,修改xml文件或者使用clone命令就可以了. centos.sh #!/bin/bash name='centos7' is ...
- 代码随想录算法训练营第三天| LeetCode 203.移除链表元素(同时也对整个单链表进行增删改查操作) 707.设计链表 206.反转链表
203.移除链表元素 题目链接/文章讲解/视频讲解::https://programmercarl.com/0203.%E7%A7%BB%E9%99%A4%E9%93%BE%E8%A1 ...
- 使用sqlplus
1. 执行一个SQL脚本文件 SQL>start file_name SQL>@ file_name 可以将多条sql语句保存在一个文本文件中,这样当要执行这个文件中的所有的sql语句时, ...
- IDEA使用@Autowired注解为什么会提示不建议?
在使用IDEA编写Spring相关的项目时,当在字段上使用@Autowired注解时,总会出现一个波浪线提示:"Field injection is not recommended.&qu ...
- 园子的脱困努力-云厂商合作:领取阿里云免费ECS试用资源,部署Java Web环境,送小礼品
在园子脱困的关键时期,每一笔收入都很重要,一边在会员救园,一边我们要努力把握每一个商务合作机会,争取早日走出困境. 之前园子维持生存的收入主要来自于与云厂商的合作,但去年由于云厂商推广策略的调整,这块 ...
- Android RIL&IMS源码分析
一.需求 1.了解IMS相关知识体系 2.RILD 与 RILJ.IMS回调消息的机制 二.相关概念 2.1 IMS IMS全称是IP Multimedia Subsystem,中文意义为IP多媒体子 ...
- 再聊Java Stream的一些实战技能与注意点
大家好,又见面了. 在此前我的文章中,曾分2篇详细探讨了下JAVA中Stream流的相关操作,2篇文章收获了累计 10w+阅读.2k+点赞以及 5k+收藏的记录.能够得到众多小伙伴的认可,是技术分享过 ...
- 逻辑漏洞挖掘之XSS漏洞原理分析及实战演练
一.前言 2月份的1.2亿条用户地址信息泄露再次给各大公司敲响了警钟,数据安全的重要性愈加凸显,这也更加坚定了我们推行安全测试常态化的决心.随着测试组安全测试常态化的推进,有更多的同事对逻辑漏洞产生了 ...