数据结构:循环链表的使用

2023-11-05

循环链表

循环链表:将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表。如图所示:
在这里插入图片描述
非空的循环链表如图:
在这里插入图片描述
循环链表与单链表的主要差异在于循环的判断上,原来是判断p->next是否为空,现在则是p->next不等于头结点,则循环未结束。

单循环链表的定义与实现:
(1)头文件:
在这里插入图片描述
代码实现:

#pragma once
//循环链表,尾节点next保存头结点地址

typedef struct CNode
{
	int data;
	struct CNode *next;
}CNode,*CList;

void InitList(CList plist);

bool Insert_head(CList plist,int val);//头插法

bool Insert_tail(CList plist,int val);//尾插法

CNode *Search(CList plist,int key);//查找

bool Delete(CList plist,int key);//删除

bool IsEmpty(CList plist);//判空

int GetLength(CList plist);//获取长度

void Show(CList plsit);//打印

CNode *Getprio(CList plist,int key);//获取key的前驱

CNode *GetNext(CList plist,int key);//获取key的后继

void Clear(CList plist);//清空数据

void Destroy(CList plist);//销毁数据

(2)源文件:
在这里插入图片描述

代码实现:

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include"clist.h"

void InitList(CList plist)
{
	assert(plist != NULL);
	if (plist == NULL)
	{
		return;
	}
	plist->next = plist;
}

bool Insert_head(CList plist,int val)//头插法
{
	CNode *p = (CNode *)malloc(sizeof(CNode));
	p->data = val;

	p->next = plist->next;
	plist->next = p;

	return true;
}

bool Insert_tail(CList plist,int val)//尾插法
{
	CNode *p;
	for (p=plist; p->next!=plist; p=p->next);

	CNode *q = (CNode *)malloc(sizeof(CNode));
	q->data = val;

	q->next = p->next;
	p->next = q;

	return true;
}

CNode *Search(CList plist,int key)//查找
{
	for (CNode *p=plist->next; p!=plist; p=p->next)
	{
		if (p->data == key)
		{
			return p;
		}
	}
	return NULL;
}

bool Delete(CList plist,int key)//删除
{
	CNode *p = Getprio(plist,key);
	if (p == NULL)
	{
		return false;
	}
	CNode *q=p->next;

	p->next = q->next;
	free(q);

	return true;
}

bool IsEmpty(CList plist)//判空
{
	return plist->next == plist;
}

int GetLength(CList plist)//获取长度
{
	int count = 0;
	for (CNode *p=plist->next; p!=plist; p=p->next)
	{
		count++;
	}
	return count;
}

void Show(CList plist)//打印
{
	for (CNode *p=plist->next; p!=plist; p=p->next)
	{
		printf("%d\n",p->data);
	}
}

CNode *Getprio(CList plist,int key)//获取key的前驱
{
	for (CNode *p=plist; p->next!=plist; p=p->next)
	{
		if (p->next->data == key)
		{
			return p;
		}
	}
	return NULL;
}

CNode *GetNext(CList plist,int key)//获取key的后继
{
	CNode *p = Search(plist,key);

	if (p==NULL||p->next==plist)
	{
		return NULL;
	}
	return p->next;
}

void Clear(CList plist)//清空数据
{
	Destroy(plist);
}

void Destroy(CList plist)//销毁数据
{//删除第一个
	CNode *p;

	while (plist->next != plist)
	{
		p = plist->next;
		plist->next = p->next;
		free(p);
	}
}



测试用例:
1.尾插法,将0-9分别插入循环链表
在这里插入图片描述

2.头插法,将50插入最前面
在这里插入图片描述

3.获取长度(去掉了头插)
在这里插入图片描述

4.查找5
在这里插入图片描述

5.查找前驱下标
在这里插入图片描述

6.查找后继下标
在这里插入图片描述

7.删除6
在这里插入图片描述

8.清空
在这里插入图片描述

9.摧毁
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构:循环链表的使用 的相关文章

  • java用模板生成word(docx)文档(含动态表格)

    生成word思路 用WPS或者office编辑好word的样式 然后另存为word xml文档 将xml翻译为FreeMarker模板 最后用java来解析FreeMarker模板并输出Docx 编辑好需要使用的word文档 1 把需要注入
  • 在Linux上面如何部署jar包?

    1 首先打开工具Xshell或者FinalShell 并登录 2 使用 ll 命令查看根目录文件 确定jar包将要放到哪个位置 使用cd 命令进入文件 如 cd opt yt 3 新建文件传输 可和本地关联 4 将jar包直接拖过去就行 5
  • 树的遍历(中序,前序,后序)

    与只有一种逻辑遍历它们的线性数据结构 数组 链表 队列 堆栈等 不同 树可以以不同的方式遍历 常见的有中序遍历 前序遍历和后序遍历 实现各种遍历的方法又包括 以上图为例 深度优先遍历 a 中序 左 根 右 4 2 5 1 3 b 前序 根
  • 关于async & await(TAP)异步模型的异常捕获

    在TAP之前 若要捕获线程中Task的异常 通常有两种办法 1 阻塞 线程开始后 在适当的时机 调用 wait 或waitAll方法 2 非阻塞 推荐 在建立任务的时候 写该task的continueWith方法 在该方法中捕获异常 对于T
  • get提交和post提交的区别

    Http定义了与服务器交互的不同方法 最基本的方法有4种 分别是GET POST PUT DELETE URL全称是资源描述符 我们可以这样认为 一个URL地址 它用于描述一个网络上的资源 而HTTP中的GET POST PUT DELET

随机推荐

  • Linux安装以及使用

    Linux虚拟机安装以及使用 1 安装VMware16 2 创建虚拟机 3 虚拟机配置网络 4 利用mobaxterm连接服务器 5 配置jdk和tomcat 6 配置docker和mysql 7 部署项目 1 安装VMware16 接下来
  • leetcode160–相交链表(最优解/双指针)

    今天做的三道题比较简单 给你两个单链表的头节点 headA 和 headB 请你找出并返回两个单链表相交的起始节点 如果两个链表不存在相交节点 返回 null 题目数据 保证 整个链式结构中不存在环 注意 函数返回结果后 链表必须 保持其原
  • ISA(MIPS,ARM,RISC-V)中的算术运算溢出检测逻辑是怎样的?

    关于ISA架构 之前写过一些总结 这里单独将其中一个技术点拿出来 对比分析不同架构下实现的差异 这个技术点就是算术指令中的溢出检测 ARM体系结构中 通过CPSR的状态寄存器反映当前指令的溢出状态 而MIPS 则是通过指令触发中断的方式产生
  • Jenkins使用(代码拉取->编译构建->部署上线)

    Jenkins简介 Jenkins是一个开源项目 提供了一种易于使用的持续集成系统 使开发者从繁杂的集成中解脱出来 专注于更重要的业务逻辑实现上 同时Jenkins能实时监控集成中存在的错误 提供详细的日志文件和提醒功能 还能用图表的形式形
  • Java——(1)定义一个学生类Student,包含属性:姓名(String name)、年龄(int age) (2)定义Map集合,用Student对象作为key

    分析以下需求 并用代码实现 1 定义一个学生类Student 包含属性 姓名 String name 年龄 int age 2 定义Map集合 用Student对象作为key 用字符串 此表示表示学生的住址 作为value 3 利用四种方式
  • db2异常

    一 db2 SQL0180N The syntax of the string representation of a datetime value is incorrect SQLSTATE 2200 问题描述 在用import导入时没有
  • qt入门级使用

    qt的安装 可参考 QT下载安装及配置教程 亲测好用 qt基本使用 1 创建第一个qt程序 打开后欢迎界面如下 这是关于qt的一些项目的讲解 不过视频地址在国外 需要翻qiang才能看 而且全是英文 左边还有一个 示例 那里面有各种项目的模
  • Android开发之RecyclerView的使用全解

    转自 http blog csdn net dmk877 article details 50816933 自Android 5 0之后 谷歌公司推出了RecylerView控件 RecylerView 我想看到一个新名词后大部分人会首先发
  • 微分动态规划

    from https en wikipedia org wiki Differential dynamic programming 深入理解DDP DDP是一种轨迹优化类别问题中的最优控制算法 这种算法在1966年被Mayne提出 该算法使
  • PostgreSQL 性能优化

    提出问题 PostgreSQL数据库如何进行简单的性能调优 解决问题 前言 PostgreSQL的配置参数作为性能调优的一部分 起着重要的位置 有时候一个简单的配置参数就会决定应用的性能 因此有必要简单了解下其相关的配置参数 查询Linux
  • Hadoop(三)读写流程

    Remote Procedure Call RPC 远程过程调用协议 它是一种通过网络从远程计算机程序上请求服务 而不需要了解底层网络技术的协议 RPC协议假定某些传输协议的存在 如TCP或UDP 为通信程序之间携带信息数据 在OSI网络通
  • 数据库基础命令

    SELECT 从数据库中提取数据 SELECT column name column name FROM table name SELECT DISTINCT column name column name FROM table name
  • Numpy

    文章目录 1 Numpy是什么 2 ndarray 2 1 什么是ndarray 2 2 ndarray的属性 2 3 ndarray的类型 3 Numpy基本操作 3 1 生成0或1的数组 3 2 从现有数组生成数组 拓展 浅拷贝和深拷贝
  • 在Excel中如何引用其他的工作表或者工作簿

    http www office68 com excel 426 html 公式中对单元格和单元格区域的引用不必非得针对同一个工作表中的单元格和单元格区域 如果要引用另外的工作表中的单元格 那么就在单元格引用的前面加上工作表的名称以及一个感叹
  • ssl协议及开源实现openssl

    转载地址 https blog csdn net jinbusi blog article details 76039206 locationNum 4 fps 1 ssl协议 SSL Secure Socket Layer 安全套接层 s
  • Rsync的核心算法

    一 什么是Rsync 1 rsync 是 unix linux 下同步文件的一个高效算法 它能同步更新两处计算机的文件和目录 并适当的利用查找文件中的不同块以减少数据传输 2 rsync中一项与其他大部分类似程序或协定中所未见的重要特性是镜
  • Delphi 对象的创建(create)与释放(free/destory)

    create后一定要free吗 简单举例 procedure a var x TX begin x TX create do someting x free 如果我这里不free 到了这个end不就是相当于C中的 自动释放吗 也就是说在此处
  • Android 基础知识4-3.10 ScrollView(滚动条)详解

    一 简介 首先来看google官方对他的介绍 翻译过来就是可以滚动的用户布局容器 如果手机显示不下子布局 那么可以使用scrollView 当然谷歌也说NestedscrollView已经提供了更好的用户体验 这个我们以后再详细总结下 谷歌
  • 批量处理sql表

    1 批量CRUD表字段 DECLARE V SQL VARCHAR2 2000 V TABLE NAME VARCHAR2 30 CURSOR C1 IS 查询当前用户下 ZFPT40 STATISTIC ANALYSIS 的所有表 SEL
  • 数据结构:循环链表的使用

    循环链表 循环链表 将单链表中终端结点的指针端由空指针改为指向头结点 就使整个单链表形成一个环 这种头尾相接的单链表称为单循环链表 简称循环链表 如图所示 非空的循环链表如图 循环链表与单链表的主要差异在于循环的判断上 原来是判断p gt