数据结构(06)— 线性循环链表实战
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)— 线性循环链表实战相关推荐
- 数据结构与算法:06 线性表
06 线性表 知识结构: 1. 线性表的定义与操作 1.1 线性表的定义 线性表(Linear List)是由n(n≥0)n (n≥0)n(n≥0)个相同类型的数据元素a0,a1,⋯,an−1a_0, ...
- 数据结构之线性表----一文看懂顺序表、单链表、双链表、循环链表
线性表是数据结构中比较基础的内容,不过也是入门的所需要客服的第一个难关.因为从这里开始,就需要我们动手编程,这就对很多同学的动手能力提出了挑战.不过这些都是我们需要克服的阵痛,学习新的知识总是痛苦 ...
- 【Java数据结构】线性表
线性表 线性表是最基本.最简单.也是最常用的一种数据结构. 线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而 ...
- Java数据结构之线性表(2)
从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...
- 用Java描述数据结构之线性表的顺序存储(顺序表),ArrayList及其方法的介绍
我们先来想一想什么是线性表? 线性表是最基本.最简单.也是最常用的一种数据结构.线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列. 线性表中数据元素之 ...
- python线性表和队列_[笔记]python数据结构之线性表:linkedlist链表,stack栈,queue队列...
python数据结构之线性表 python内置了很多高级数据结构,list,dict,tuple,string,set等,在使用的时候十分舒心.但是,如果从一个初学者的角度利用python学习数据结构 ...
- c语言用两个栈构造队列伪码,数据结构习题线性表栈队列.doc
数据结构习题线性表栈队列 线性表(58) 1. 在单链表.双链表和单循环链表中,若仅知道指针p指向某结点,不知道头指针,能否将结点*p从相应的链表中删去?若可以,其时间复杂度各为多少? 2.设线性表的 ...
- step3 . day2 数据结构之线性表链表
今天继续学习数据结构的线性表部分,从基础的顺序表到链表,类比写了一些调用函数,完成了表的增删改查排序等问题. 尤其是链表的排序,费了很大的心思终于捋顺写出来了,小有成就感,而且代码一次通过率越来越高, ...
- 数据结构:线性数据结构(1)-栈(栈,队列,deques, 列表)
栈,队列,deques, 列表是一类容器,他们数据项之间的顺序由添加或删除的顺序决定,一旦一个数据项被添加,它相对于前后元素一直保持该位置不变.注入此类的数据结构称为线性数据结构. 栈 栈(栈,队列, ...
最新文章
- java基础之面试篇四-单向链表和双向链表区别
- android onLayout死循环
- 《BI那点儿事》数据流转换——排序
- 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 @Mixin 注解进行方法注入 | Mixin 混合多个类优先级分析 )
- Android的DataBinding原理介绍
- html selsec 文字靠右,EDA课程设计
- mysql中括号_干货!Python与MySQL数据库的交互实战
- 深度学习——CNN的学习笔记
- 支付宝年度账单被怼;英特尔CPU曝惊天漏洞;甘薇为贾跃亭喊冤 | 一周业界事
- AppUI自动化中的图像识别的使用
- mysql如何导出数据脚本_MySQL 导出数据
- 【Unity开发小技巧】Unity随机概率扩展(概率可调控)
- 如何快速将WPS表格或者excel数据将表格转化为json
- PDF编辑器哪个好,PDF文件怎么拆分成多个PDF
- 盘点我用过的导出Excel的方法
- ppt精选111个毕业答辩模板
- jquery js 设置 div 的内容,给 div 添加一个属性
- cocos creator上线appstore的脚印
- 数独之Swordfish
- 未明学院学员报告:「看电影攻略」之豆瓣电影票房与口碑分析,这几类电影不易踩雷!