循环链表

C++单循环链表(迭代器版)

天大地大妈咪最大 提交于 2020-02-26 15:35:39
1 #ifndef _LIST_H_ 2 #define _LIST_H_ 3 //虚基类 4 template<class ElemType> 5 class List 6 { 7 public: 8 List() {}; 9 virtual ~List() {}; 10 virtual void Clear() = 0;//清空数据结构 11 virtual void Insert(const int& i, const ElemType& X) = 0;//插入元素 12 virtual void ReMove(const int &i) = 0;//移除指定位置的元素 13 virtual void Erase(const ElemType& X) = 0;//删除表中所有X元素 14 virtual int Search(const ElemType& X) const = 0;//搜索某个元素 15 virtual void Traverse() const = 0;//遍历数据结构 16 virtual ElemType Visit(const int& i)const = 0;//访问某个元素 17 }; 18 #endif // !_LIST_H_ List.h 1 #ifndef __SCYCLISTLIST_H__ 2 #define _

单向循环链表

喜你入骨 提交于 2020-02-26 14:06:26
一、定义 单向循环链表是单链表的一个变型,链表中最后一个节点的next域不再是None,而是指向链表的头节点。 二、操作 1、is_empty()判断链表是否为空 2、length()链表长度 3、travel()遍历整个链表 4、add(item)链表头部添加元素 5、append(item)链表尾部添加元素 6、insert(pos,item)指定位置添加元素 7、remove(item)删除节点(从头部开始找,将找到的第一个item删除掉) 8、search(item)查找节点是否存在 来源: CSDN 作者: DAN_L 链接: https://blog.csdn.net/DAN_L/article/details/104514400

数据结构与算法:链表

谁都会走 提交于 2020-02-26 10:29:37
一、链表和数组的区别 链表与数组相似,但链表是一种比数组稍微复杂的数据结构。数组需要一块连续的内存空间来存储数据,对内存的要求比较高,而链表则不需要,它通过「指针」将不连续的内存块串联起来。如果要申请一个 100MB 大小的数组和链表,当内存中没有连续的,或者没有足够大小的空间时,数组便会申请失败,而链表不会。 链表有很多种结构,常见的有: 单链表 、 双向链表 、 循环链表 。 二、单向链表 链表通过指针将不连续的内存块串联在一起使用,我们把其中的内存块称为「结点」,而为了将所有的结点串起来,链表中的结点除了存储数据之外,还会用指针记录链表结点的下一个结点的地址,我们把这个记录下一个结点的地址的指针叫做「后继指针next」,整个单链表如下图所示。 其中第一个结点和最后一个结点是比较特殊的,通常分别把它们称为「头结点」和「尾结点」。头结点用来记录链表的基地址,有了它就能遍历得到整个链表。尾结点并不指向任何结点,而是指向空地址 null ,表示链表上的最后一个结点。 与数组不同,链表的插入和删除操作并不需要大量的数据搬移,它只需要考虑相邻结点的指针改变,对应的时间复杂度为 O(1) 。同样,链表的访问元素操作也没有数组那样直接用首地址和下标通过寻址公式直接得到对应的内存地址,链表需要通过从指针一个一个结点地遍历,直到找到相应的结点。因此链表的随机访问时间复杂度为 O(n) 。 三

线性表之单向循环链表

喜欢而已 提交于 2020-02-25 18:59:24
一,循环链表的概念 1.什么是循环链表   所谓的循环链表就是让单向链表的首尾相连,组成一个环状。 2.循环链表的典型应用   约瑟夫环问题。 3.实现循环链表的重点   1,循环链表在插入第一个元素的时候,需要我们将第一元素的指针域指向其自身,也就构成了循环链表。   2,循环链表基于单向链表而生,单是比循环链表多了游标这个概念。要想实现循环链表的插入,删除的关键是考虑头结点问题,因为在头插法方式(往链表的头部插入数据)中,需要将末尾数据元素的指针域指向新插入的节点。将新插入的节点的指针域指向头结点的指针域的指针域,还需要将头结点指向新插入的结点。(插入相同)。 二,循环链表新增概念和功能 1,什么是游标   所谓的游标就是在链表中可以移动的指针,游标初始化一般是指向链表的第一个结点。 2,游标的功能 初始化游标 移动游标:将移动前的游标所对应得结点返回,并将游标指向下一个数据元素。 获取游标:获取当前游标所对应得数据元素 删除游标:删除当前游标所对应得数据元素,并将游标指向下一个数据元素。 三,循环链表的实现 1,循环链表的功能 # ifndef CIRCLE_LINK_LIST # define CIRCLE_LINK_LIST /* 业务节点 */ typedef void Node; /* 链表节点(被包含) */ typedef struct CircleNode {

双循环链表

瘦欲@ 提交于 2020-02-19 17:34:03
1 #ifndef _LIST_H_ 2 #define _LIST_H_ 3 //虚基类 4 template<class ElemType> 5 class List 6 { 7 public: 8 List() {}; 9 virtual ~List() {}; 10 virtual void Clear() = 0;//清空数据结构 11 virtual void Insert(const int& i, const ElemType& X) = 0;//插入元素 12 virtual void ReMove(const int &i) = 0;//移除指定位置的元素 13 virtual void Erase(const ElemType& X) = 0;//删除表中所有X元素 14 virtual int Search(const ElemType& X) const = 0;//搜索某个元素 15 virtual void Traverse() const = 0;//遍历数据结构 16 virtual ElemType Visit(const int& i)const = 0;//访问某个元素 17 }; 18 #endif // !_LIST_H_ List.h 1 #ifndef __DCYCLELIST_H__ 2 #define __DCYCLELIST_H

循环链表的实现

喜夏-厌秋 提交于 2020-02-13 14:08:30
1. 什么是循环链表 1.1概念 任意数据元素都有一个 前驱 (地址)和一个 后继 (地址) 所有的数据元素的关系构成一个 逻辑上的环 1.2实现 循环链表是一种 特殊的单链表 尾节点的指针保存了首节点的地址 2. 循环链表的逻辑构成 继承层次结构 3. 循环链表的实现思路 (1)通过模板定义 CircleList 类,继承自LinkList类 (2)定义内部函数 makeCircle() , 用于将单链表首尾相连 (3) 特殊处理 :首元素的插入操作和删除操作   ① 插入位置为0时 : 头结点和尾结点均指向新结点 ; 新结点成为首结点 。   ② 删除位置为0时 : 头结点和尾结点指向位置为1的结点 ; 安全销毁首结点 。 (4) 重新实现 :清空操作和遍历操作 【编程实验】循环链表的实现 //LinkList.h 1 #ifndef LINKLIST_H 2 #define LINKLIST_H 3 #include "List.h" 4 namespace DataStructureLib 5 { 6 template <typename T> 7 8 class LinkList:public List<T> 9 { 10 protected: 11 struct Node{ 12 T value; 13 Node* next; 14 }; 15 16 mutable

什么是链表?

浪尽此生 提交于 2020-02-09 01:44:22
在了解完 什么是数据结构 之后,让我们一起来探索下数据结构中常见的一种— 链表 。 链表 链表是数据结构之一, 其中的数据呈线性排列。在链表中,数据的添加和删除都较为方便,就是访问比较耗费时间。 如上图所示就是链表的概念图,Blue、Yellow、Red 这 3 个字符串作为数据被存储于链表中,也就是 数据域 ,每个数据都有 1 个指针,即 指针域 ,它指向下一个数据的内存地址,其中 Red 是最后 1 个数据,Red 的指针不指向任何位置,也就是为 NULL,指向 NULL 的指针通常被称为空指针。 在链表中,数据一般都是分散存储于内存中的,无须存储在连续空间内。 因为数据都是分散存储的,所以如果想要访问数据,只能从第 1 个数据开始,顺着指针的指向一一往下访问(这便是 顺序访问 )。比如,想要找到 Red 这一数据,就得从 Blue 开始访问,这之后,还要经过 Yellow,我们才能找到 Red。 如果想要添加数据,只需要改变添加位置前后的指针指向就可以,非常简单。比如,在 Blue 和 Yellow 之间添加 Green。 首先将 Blue 的指针指向的位置变成 Green,然后再把 Green 的指针指向 Yellow,数据的添加就大功告成了。 数据的删除也一样,只要改变指针的指向就可以,比如删除 Yellow。 这时,只需要把 Green 指针指向的位置从 Yellow

C++实现双向循环链表

a 夏天 提交于 2020-02-08 03:07:24
本次博文是关于利用C++模板的方式实现的双向循环链表以及双向循环链表的基本操作,在之前的博文 C++语言实现双向链表 中,已经给大家分析了双向循环链表的结构,并以图示的方式给大家解释了双向循环链表的基本操作。本篇文章利用C++实现了双向循环链表的基本操作,其中包括: 双向循环链表 实现的功能 头部插入结点建立链表 尾部插入结点建立链表 实现指定位置插入结点 查找给定数值是否存在 删除指定位置的结点 修改指定位置的结点 双向链表的长度 打印双向链表 定义双向链表的结点 双向循环链表的结点由三部分构成,用于 指向当前节点的直接前驱节点 的 指针域 , 用于存储数据元素 的 数据域 ,以及 用于指向当前节点的直接后继节点 的 指针域 。 在之前的C++语言实现双向链表时已经给大家解释了封装的结点的特点,不需要作太大的改变,我们需要封装一个结点类,定义了结点的三个要素,并利用构造函数实现初始化,另外,考虑到在双向循环链表中要用到结点类,所以将双向链表类定义为结点的友元类。 template < class T > class doubleCircularLinkedList ; //声明一下双向循环链表,以免定义友元时报错 template < class T > class doubleCircularLinkedListNode { private :

算分-PRIORITIZING

感情迁移 提交于 2020-02-03 11:53:13
Heaps and Heapsort:   堆是一种快速访问最大优先级元素的数据结构,这是快速实现选择排序的基础,但是总体来说平均速度比快排要慢一点,不过其最坏情况和平均情况是差不多的。   首先是堆的定义,每个结点比它的孩子结点都小(所以父节点最小),或者每个结点都比它的孩子结点大(父节点最大),把A[1,n]看做一个堆,i的两个孩子结点分别是2i和2i+1,这个非常方便实用。接着是删除堆的最小值(最大值同理),想法就是先删除最小值,然后把最后一个元素放到根节点并且不断sift-down,这个是一个结点下沉操作,即当前结点和两个子结点(如果有的话)中的最小者交换,继续下沉。然后是插入堆元素,想法是在最后的一个位置(i = n + 1)加入元素,然后sift-up,也就是和父节点比较,小的往上,大的下沉。同时无论是sift-down或者是sift-up都是O(logn)的。   于是我们可以提出堆排序的想法,也就是每次都删除最值,然后整理我们的堆,最后的总代价是O(nlogn)的,因为最差的代价t(n) <= t(2/3n) + t(1/3n) + O(logn),同时建堆的复杂度也是O(n)的,所以这个算法还是可以接受的。 Fibonacci Heaps:   在介绍斐波那契堆之前先来介绍二项树,高度为h的二项树由两棵高度为h-1的二项树得到

单项循环链表基本性质___循环链表基本功能___(search,remove,add,append,travel,insert, and length)

一曲冷凌霜 提交于 2020-02-02 11:13:45
单项循环链表基本性质 leetcode过程中发现很多题都用的到链表,在这里跟大家share一些我学习过程中对链表所知所学,如果有错误,希望大家***善意指正***。在此谢谢大家,如果非商业转发,请注明出处。未经允许,此文不能作为商业用途。 1:循环单链表 首先我们用一个图来表达循环单链表和普通单链表的具体区别。 在图中可以看出,我们循环单链表和单链表唯一的区别就是,循环链表的尾部是指向循环单链表的头部。即cur.next = self._head 接下来我们介绍一下基本的一些function的作用。每个稍微有难点的代码我都加了解释,希望大家认真学习哈哈哈哈,一起冲冲冲。 length的作用: def length(self): """链表长度""" #cur游标,用来移动遍历节点 if self.is_empty():#判断特殊情况,是不是空节点。 count = 1 return 0 cur = self._head#首先把头节点作为起始节点。 count = 1#开始遍历 while cur.next != self._head:#循环的条件是标尺下一个指向不是头节点 count += 1 cur = cur.next return count#计数即可 travel的作用: def travel(self):#定义travel函数 """遍历整个链表""" if self