1. 循环链表定义

单链的循环链表结点的存储结构和单链表的存储结构一样, 所不同的是: 最后一个结点的 next 域指向头结点, 而不是“空”。这样, 由表尾很容易找到表头。

但若链表较长, 则由表头找到表尾较费时, 因而, 单循环链表往往设立尾指针而不是头指针, 如图 2 31所示。这在两个链表首尾相连合并成一个链表时非常方便。


2. 循环链表实现

2.1 创建单循环空链表

RingList::RingList()
{L = new LNode;  // 产生头结点,并使L指向此头结点L->next = L;    // 指针域指向头结点std::cout << "constructor done" << std::endl;
}

2. 销毁单循环链表

 LNode *q;LNode *p = L->next; // p指向头结点while (p != L)  // 没到表尾{q = p->next;delete p;p = q;}// 到达末尾, p == Ldelete p;p = NULL;

2.3 循环链表中插入元素

2.4 循环链表中删除元素

3. 代码清单

project.h

#include <iostream>
#include <string>#define N (30)
#define K (9)
// 单链表中单个结点的完整数据结构定义
typedef struct LNode
{int data;       // 值域LNode *next;    // 指针域
}LNode;class RingList
{public:RingList();~RingList();int init_ring_list();int clear_list();bool is_empty();int get_list_length();int get_element(int i, int &value);int insert_element(int i, int value);int delete_element(int i, int &value);int print_list();private:LNode *L;
};

project.cpp

#include "project.h"RingList::RingList()
{L = new LNode;  // 产生头结点,并使L指向此头结点L->next = L;    // 指针域指向头结点std::cout << "constructor done" << std::endl;
}RingList::~RingList()
{LNode *q;LNode *p = L->next; // p指向头结点while (p != L)  // 没到表尾{q = p->next;delete p;p = q;}// 到达末尾, p == Ldelete p;p = NULL;std::cout << "destructor done" << std::endl;
}int RingList::clear_list()
{L = L->next;    // L指向头结点LNode *q;LNode *p = L->next; // p指向第一个结点while (p != L)  // 没到表尾{q = p->next;delete p;p = q;}L->next = L;    // 头结点指针域指向自身std::cout << "destructor done" << std::endl;return 0;
}bool RingList::is_empty()
{return L->next == L ? true : false;
}int RingList::get_list_length()
{int length = 0;LNode *p = L->next; // p指向头结点while (p != L)  // 没到表尾{length++;p = p->next;}return length;
}int RingList::get_element(int i, int &value)
{if(i <= 0 || i > get_list_length()){std::cout << "i is not a valid value" << std::endl;return -1;}LNode *p = L->next; // p指向头结点for(int k=1; k<i; k++)  // 顺指针向后查找,直到p指向第i个元素{p = p->next;}value = p->data;return 0;
}int RingList::insert_element(int i, int value)
{if(i<=0){std::cout << "i is not a valid value" << std::endl;return -1;}LNode *p = L->next; // p指向头结点for(int k=1; k<i; k++)    // 寻找第i-1个结点{p = p->next;}LNode *q = new LNode;   // 生成新结点q->data = value;// 插入L中q->next = p->next;p->next = q;// 改变尾结点if(p == L){L = q;}return 0;
}int RingList::delete_element(int i, int &value)
{if(i<=0 || i > get_list_length()){std::cout << "i is not a valid value" << std::endl;return -1;}LNode *p = L->next; // p指向头结点for(int k=1; k<i; k++)    // 寻找第i-1个结点{p = p->next;}LNode *q;q = p->next;    // q指向待删除结点value = q->data;p->next = q->next;if(L == q)  // 删除的是表尾元素{L = p;}delete q;  // 释放待删除结点q = NULL;return 0;
}int RingList::print_list()
{LNode *p = L->next->next; // p指向首元结点while (p != L->next)  // p不指向头结点{std::cout << "list element is " << p->data << std::endl;p = p->next;}return 0;
}

```main.cpp`

#include "project.cpp"int main()
{RingList L;std::cout << "is empty: " << L.is_empty() << std::endl;L.insert_element(1, 10);L.insert_element(2, 20);L.insert_element(3, 30);L.print_list();std::cout << "list length: " << L.get_list_length() << std::endl;int value;L.get_element(3, value);std::cout << "第三个元素为: " << value << std::endl;int del_value;L.delete_element(2, del_value);std::cout << "删除的第二个元素为: " << del_value << std::endl;
}

数据结构(06)— 线性循环链表实战相关推荐

  1. 数据结构与算法:06 线性表

    06 线性表 知识结构: 1. 线性表的定义与操作 1.1 线性表的定义 线性表(Linear List)是由n(n≥0)n (n≥0)n(n≥0)个相同类型的数据元素a0,a1,⋯,an−1a_0, ...

  2. 数据结构之线性表----一文看懂顺序表、单链表、双链表、循环链表

    ​ 线性表是数据结构中比较基础的内容,不过也是入门的所需要客服的第一个难关.因为从这里开始,就需要我们动手编程,这就对很多同学的动手能力提出了挑战.不过这些都是我们需要克服的阵痛,学习新的知识总是痛苦 ...

  3. 【Java数据结构】线性表

    线性表 线性表是最基本.最简单.也是最常用的一种数据结构. 线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而 ...

  4. Java数据结构之线性表(2)

    从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...

  5. 用Java描述数据结构之线性表的顺序存储(顺序表),ArrayList及其方法的介绍

    我们先来想一想什么是线性表? 线性表是最基本.最简单.也是最常用的一种数据结构.线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列. 线性表中数据元素之 ...

  6. python线性表和队列_[笔记]python数据结构之线性表:linkedlist链表,stack栈,queue队列...

    python数据结构之线性表 python内置了很多高级数据结构,list,dict,tuple,string,set等,在使用的时候十分舒心.但是,如果从一个初学者的角度利用python学习数据结构 ...

  7. c语言用两个栈构造队列伪码,数据结构习题线性表栈队列.doc

    数据结构习题线性表栈队列 线性表(58) 1. 在单链表.双链表和单循环链表中,若仅知道指针p指向某结点,不知道头指针,能否将结点*p从相应的链表中删去?若可以,其时间复杂度各为多少? 2.设线性表的 ...

  8. step3 . day2 数据结构之线性表链表

    今天继续学习数据结构的线性表部分,从基础的顺序表到链表,类比写了一些调用函数,完成了表的增删改查排序等问题. 尤其是链表的排序,费了很大的心思终于捋顺写出来了,小有成就感,而且代码一次通过率越来越高, ...

  9. 数据结构:线性数据结构(1)-栈(栈,队列,deques, 列表)

    栈,队列,deques, 列表是一类容器,他们数据项之间的顺序由添加或删除的顺序决定,一旦一个数据项被添加,它相对于前后元素一直保持该位置不变.注入此类的数据结构称为线性数据结构. 栈 栈(栈,队列, ...

最新文章

  1. java基础之面试篇四-单向链表和双向链表区别
  2. android onLayout死循环
  3. 《BI那点儿事》数据流转换——排序
  4. 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 @Mixin 注解进行方法注入 | Mixin 混合多个类优先级分析 )
  5. Android的DataBinding原理介绍
  6. html selsec 文字靠右,EDA课程设计
  7. mysql中括号_干货!Python与MySQL数据库的交互实战
  8. 深度学习——CNN的学习笔记
  9. 支付宝年度账单被怼;英特尔CPU曝惊天漏洞;甘薇为贾跃亭喊冤 | 一周业界事
  10. AppUI自动化中的图像识别的使用
  11. mysql如何导出数据脚本_MySQL 导出数据
  12. 【Unity开发小技巧】Unity随机概率扩展(概率可调控)
  13. 如何快速将WPS表格或者excel数据将表格转化为json
  14. PDF编辑器哪个好,PDF文件怎么拆分成多个PDF
  15. 盘点我用过的导出Excel的方法
  16. ppt精选111个毕业答辩模板
  17. jquery js 设置 div 的内容,给 div 添加一个属性
  18. cocos creator上线appstore的脚印
  19. 数独之Swordfish
  20. 未明学院学员报告:「看电影攻略」之豆瓣电影票房与口碑分析,这几类电影不易踩雷!

热门文章

  1. grep 的特殊使用
  2. learning to rank_排序
  3. 分布式训练使用手册-paddle 数据并行
  4. pandas数据框,统计某列或者某行数据元素的个数
  5. Python 正则表达式各种特殊符号 重点
  6. LeetCode简单题之二进制表示中质数个计算置位
  7. 前后端分离必备工具:Swagger快速搞定(整合SpringBoot详细教程)
  8. 激光雷达数据到云cloud
  9. 色彩(颜色)空间原理(下)
  10. CVPR2020论文点评: AdderNet(加法网络)