数据结构单向循环链表,创建以及增删改查的实现

一、单向循环链表的描述

循环链表:是另一种形式的链式存储结构。其特点是表中最后一个结点的指针域指向头节点,整个链表形成一个环。

单向循环链表的操作和单链表操作基本一致,差别在于:当链表遍历时,判别当前指针p是否指向表尾结点的终止条件不同。在单链表中,判别条件一般为p!=NULL或p->next!=NULL,而单向循环链表的判别条件为p!=L或p->next!=L。

二、单向循环链表存储结构

typedef int ElemType;  //重定义数据域的数据类型
typedef struct LNode   //定义单链表存储结构
{
	ElemType data;     //结点的数据域
	struct LNode *next;//结点的指针域
}*LinkList;            //LinkList为指向结构体LNode的指针类型

三、单向循环链表的操作

3.1 循环链表创建

LinkList Request_space()  //在堆区申请一个结点空间
{
	LinkList node=(LinkList)malloc(sizeof(struct LNode));
	if(NULL==node)
		return NULL;
	node->data=0;
	node->next=node;
	return node;
}

3.2 循环链表遍历

int Output(LinkList L_list)  //实现输出
{
	if(NULL==L_list)
		return -1;
	LinkList p=L_list;
	do
	{
		printf("%d ",p->data);
		p=p->next;
	}while(p!=L_list);
	puts("");
	return 0;
}

3.3 循环链表头插

LinkList insert_head(LinkList L_list,ElemType value)  //实现头插
{
	LinkList node=Request_space();
	if(NULL==node)
		return L_list;  
	if(NULL==L_list)
	{
		L_list=node;
		node->data=value;
	}
	else
	{
		node->next=L_list->next;
		L_list->next=node;
		node->data=L_list->data;
		L_list->data=value;
	}
	return L_list;
}

3.4 循环链表尾插

LinkList insert_rear(LinkList L_list,ElemType value)  //实现尾插
{
	LinkList node=Request_space();
	node->data=value;
	if(NULL==L_list)
		L_list=node;
	else
	{
		LinkList rear=L_list;
		while(rear->next!=L_list)
			rear=rear->next;
		rear->next=node;
		node->next=L_list;
	}
	return L_list;
}

3.5 循环链表头删

LinkList delete_head(LinkList L_list)  //实现头删
{
	if(NULL==L_list)
		return NULL;
	if(L_list->next==L_list)
	{
		free(L_list);
		L_list=NULL;
	}
	else
	{
		LinkList p=L_list->next;
		L_list->data=p->data;
		L_list->next=p->next;
		free(p);
		p=NULL;
	}
	return L_list;
}

3.6 循环链表尾删

LinkList delete_rear(LinkList L_list)  //实现尾删
{
	if(NULL==L_list)
		return NULL;
	if(L_list->next==L_list)
	{
		free(L_list);
		L_list=NULL;
	}
	else
	{
		LinkList rear=L_list;
		while(rear->next->next!=L_list)
			rear=rear->next;
		free(rear->next);
		rear->next=L_list;
	}
	return L_list;
}

3.7 循环链表解决约瑟夫环问题

int Joseph_loop(LinkList L_list,int n,int m)  //单向循环链表实现约瑟夫环
{
	LinkList p=L_list;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m-2;j++)
		{
			p=p->next;
		}
		LinkList q=p->next;
		p->next=q->next;
		printf("%d ",q->data);
		free(q);
		q=NULL;
		p=p->next;
	}
	return 0;
}

四、多文件编辑实现单向循环链表操作

头文件 head.h

#ifndef __HEAD_H__
#define __HEAD_H__

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef int ElemType;  //重定义数据域的数据类型
typedef struct LNode  //定义单链表存储结构
{
	ElemType data;
	struct LNode *next;
}*LinkList;

LinkList Request_space();  //在堆区申请一个结点空间
int Output(LinkList L_list);  //实现输出
LinkList insert_head(LinkList L_list,ElemType value);  //实现头插
LinkList insert_rear(LinkList L_list,ElemType value);  //实现尾插
LinkList delete_head(LinkList L_list);  //实现头删
LinkList delete_rear(LinkList L_list);  //实现尾删
int Joseph_loop(LinkList L_list,int n,int m);  //单向循环链表实现约瑟夫环

#endif

自定义函数 fun.c

#include "head.h"
LinkList Request_space()  //在堆区申请一个结点空间
{
	LinkList node=(LinkList)malloc(sizeof(struct LNode));
	if(NULL==node)
		return NULL;
	node->data=0;
	node->next=node;
	return node;
}
int Output(LinkList L_list)  //实现输出
{
	if(NULL==L_list)
		return -1;
	LinkList p=L_list;
	do
	{
		printf("%d ",p->data);
		p=p->next;
	}while(p!=L_list);
	puts("");
	return 0;
}
LinkList insert_head(LinkList L_list,ElemType value)  //实现头插
{
	LinkList node=Request_space();
	if(NULL==node)
		return L_list;  
	if(NULL==L_list)
	{
		L_list=node;
		node->data=value;
	}
	else
	{
		node->next=L_list->next;
		L_list->next=node;
		node->data=L_list->data;
		L_list->data=value;
	}
	return L_list;
}
LinkList insert_rear(LinkList L_list,ElemType value)  //实现尾插
{
	LinkList node=Request_space();
	node->data=value;
	if(NULL==L_list)
		L_list=node;
	else
	{
		LinkList rear=L_list;
		while(rear->next!=L_list)
			rear=rear->next;
		rear->next=node;
		node->next=L_list;
	}
	return L_list;
}
LinkList delete_head(LinkList L_list)  //实现头删
{
	if(NULL==L_list)
		return NULL;
	if(L_list->next==L_list)
	{
		free(L_list);
		L_list=NULL;
	}
	else
	{
		LinkList p=L_list->next;
		L_list->data=p->data;
		L_list->next=p->next;
		free(p);
		p=NULL;
	}
	return L_list;
}
LinkList delete_rear(LinkList L_list)  //实现尾删
{
	if(NULL==L_list)
		return NULL;
	if(L_list->next==L_list)
	{
		free(L_list);
		L_list=NULL;
	}
	else
	{
		LinkList rear=L_list;
		while(rear->next->next!=L_list)
			rear=rear->next;
		free(rear->next);
		rear->next=L_list;
	}
	return L_list;
}

int Joseph_loop(LinkList L_list,int n,int m)  //单向循环链表实现约瑟夫环
{
	LinkList p=L_list;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m-2;j++)
		{
			p=p->next;
		}
		LinkList q=p->next;
		p->next=q->next;
		printf("%d ",q->data);
		free(q);
		q=NULL;
		p=p->next;
	}
	return 0;
}

主函数 main.c

#include "head.h"
int main(int argc, const char *argv[])
{
	LinkList L_list=NULL;  //定义结点变量,注意定义时一定要指向NULL
	int n;            //定义循环输入次数
	ElemType value;   //定义数据域元素
	int seat;  //定义元素位置

	printf("please enter n:");
	scanf("%d",&n);
	
 	for(int i=0;i<n;i++)  //头插
	{
		printf("please enter a value:");
		scanf("%d",&value);
		L_list=insert_head(L_list,value);
	}
	
	for(int i=0;i<n;i++)  //尾插
	{	
		printf("please enter a value:");
		scanf("%d",&value);
		L_list=insert_rear(L_list,value);
	}
	L_list=delete_head(L_list);  //头删
	L_list=delete_rear(L_list);  //尾删
	Output(L_list);

	//约瑟夫环
	int m;
	printf("please enter the number of people:");
	scanf("%d",&n);
	printf("please enter the number you want to break:");
	scanf("%d",&m);
	for(int i=0;i<n;i++)  
	{	
		L_list=insert_rear(L_list,i+1);
	}
	Joseph_loop(L_list,n,m);

	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/39760.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

干货分享:商城系统开发方式

商城系统是一种为了满足电子商务需求而开发的系统&#xff0c;它能够实现在线购物、支付、订单管理等功能。在当今互联网时代&#xff0c;商城系统的开发方式多种多样。那么&#xff0c;商城系统开发方式有哪些呢&#xff1f; 1、完全独立自主开发 完全独立自主开发是指企业根…

【云原生】k8s之包管理器Helm

前言 每个成功的软件平台都有一个优秀的打包系统&#xff0c;比如Debian、Ubuntu 的 apt&#xff0c;RedHat、CentOS 的 yum。Helm 则是 Kubernetes上 的包管理器&#xff0c;方便我们更好的管理应用。 1.Helm的相关知识 1.1 Helm的简介与了解 Helm本质就是让K8s的应用管理&…

微服务保护——Sentinel【实战篇】

一、限流规则&#x1f349; 1.簇点链路&#x1f95d; 簇点链路&#xff1a;就是项目内的调用链路&#xff0c;链路中被监控的每个接口就是一个资源。默认情况下sentinel会监控SpringMVC的每一个端点&#xff08;Endpoint&#xff09;&#xff0c;因此SpringMVC的每一个端点&a…

5. MySQL - JDBC SQL 注入 博客系统(万字详解)

目录 1. 介绍 2. 使用 JDBC 连接数据库 2.1 如何使用 JDBC 连接数据库 2.2 导入的各个类 2.3 DataSource 对象的创建 2.4 从 DataSource 对象中得到 Connection 对象 2.5 创建 Statement 对象 2.6 从 ResultSet 中遍历每行结果&#xff0c;从每行中获取每列的值 2.7 代…

【0】冒泡排序

前言 通过函数模板技术设计一个冒泡排序算法&#xff0c;领悟泛型编程的思想和冒泡排序的思想&#xff0c;然后使用QTest测试各种输入值&#xff0c;养成先写测试代码&#xff0c;后写程序代码的习惯 0x0 编写一个int版本的冒泡函数 1.不管要排序的数组长度多长&#xff0c;外…

内核机制在以下方面发挥作用:

进程间通信&#xff1a;内核提供了特定的机制和接口&#xff0c;用于实现进程间的通信。这可以包括共享内存、管道、消息队列、信号量等。通过这些机制&#xff0c;进程可以在内核的帮助下进行数据传输和同步&#xff0c;实现进程间的协作和通信。 进程调度&#xff1a;内核负…

SpringCloud学习路线(1)—— 从头开始的微服务

一、服务架构的历史 现有的服务框架&#xff1a; 单体架构 概念&#xff1a; 将业务所有功能集中在一个项目中开发&#xff0c;打包部署优点&#xff1a; 架构简单&#xff0c;部署成本低缺陷&#xff1a; 耦合度高 分布式架构 概念&#xff1a; 根据业务功能对系统进行拆分&a…

如何在 Excel 中快速生成随机密码?

有时&#xff0c;我们可能想创建随机密码来保护某些重要内容。 但是&#xff0c;您有什么技巧可以在Excel中快速生成随机密码&#xff1f; 在这里&#xff0c;我有一些可以在Excel工作表中处理的方法。 用公式生成随机密码 使用插入随机数据生成随机密码​编辑 用公式生成随机…

从实体按键看 Android 车载的自定义事件机制

在汽车数字化、智能化变革的进程中&#xff0c;越来越多的车机设计或部分、或全部地舍弃了实体按键&#xff0c;进而把车主操作的入口转移到了车机 UI 以及语音助手。 但统一、高效的零层级 UI 颇为困难&#xff0c;语音的准确率、覆盖率亦不够完善&#xff0c;那么在当下的阶段…

STL源码刨析_stack _queue

目录 一. 介绍 1. stack 介绍 2. queue 介绍 二. 模拟实现 1. stack 模拟实现 2. queue 模拟实现 三. deque 1. deque 接口 2. 底层 一. 介绍 1. stack 介绍 stack&#xff08;栈&#xff09;是一种容器适配器&#xff0c;它提供了一种后进先出&#xff08;LIFO&#xff0…

arcgis建筑物平均高度

主要用到相交和属性表的汇总功能。 路网 建筑物栋 相交结果 右键&#xff0c;bh列汇总 原始块有392&#xff0c;这里只有389&#xff0c;说明有的地块没有建筑&#xff0c;所以应该将表连接到原始街区上检查是否合理&#xff0c;以及随机验证一个结果是否正确。 连接结果&…

【SpringBoot应用篇】SpringBoot集成atomikos实现多数据源配置和分布式事务管理

【SpringBoot应用篇】SpringBoot集成atomikos实现多数据源配置和分布式事务管理 分布式事务概念XA和JTA概述SpringBoot集成atomikos数据库结构pom通用工具类RBaseControllerBaseExceptionCodeExceptionCodeBaseExceptionBaseUncheckedExceptionBizException application.yml数据…

C++初阶 - 3.类和对象(中)

目录 1.类的6个默认成员函数 2.构造函数 2.2特性 3.析构函数 3.1 概念 3.2 特性 4. 拷贝构造函数 4.1 概念 4.2 特征 5.赋值运算符重载 5.1运算符重载 5.2 赋值运算符重载 5.3 前置和后置重载 6.日期类的实现 7.const成员 8.取地址及const取地址操作符重载 1.类…

为什么项目可见性难以实现?该如何提高?

在项目和专业服务管理中&#xff0c;失败有时难以避免。沟通不足和需求定义不明确被认为是造成失败的最大原因&#xff0c;这意味着项目可见性和信息流动至关重要。 什么是项目可见性&#xff1f; 项目可见性是组织项目相关信息的方式&#xff0c;以便所有团队成员、项目经理…

使用Jenkins自由风格的软件项目实现接口自动化测试持续集成

这里写目录标题 一、JOB项目配置1、添加描述2、限制项目的运行节点3、源码管理4、构建触发器5、构建步骤6、构建后操作 一、JOB项目配置 1、添加描述 可选选项可填可不填 2、限制项目的运行节点 节点中要有运行环境所需的配置 节点配置教程&#xff1a;https://blog.csdn…

Go语言之并发编程练习,GO协程初识,互斥锁,管道:channel的读写操作,生产者消费者

GO协程初识 package mainimport ("fmt""sync""time" )func read() {defer wg.Done()fmt.Println("read start")time.Sleep(time.Second * 3)fmt.Println("read end") }func listenMusci() {defer wg.Done()fmt.Println(&qu…

在云计算环境中,保护Java应用程序可用的有效措施和工具

云计算&#xff08;Cloud&#xff09;技术是近年来计算机科学的一个重要突破。大多数组织已经通过将自己的应用程序移入云平台而获益。不过&#xff0c;如何保证应用程序在第三方服务器上的安全性&#xff0c;是一项艰巨的挑战。 在本文中&#xff0c;我们将重点讨论Java&…

长沙打造“全球研发中心城市”,智能网联产业如何交卷?

作者 | 魏启扬 来源 | 洞见新研社 知乎上有一个浏览超百万的热门问题——“大家怎么看待长沙这个城市&#xff1f;” 答主“星球研究所”的回答获得了高赞&#xff0c;“这是一个天性如火的城市”。 网红城市的外衣下&#xff0c;从湖南卫视的综艺节目&#xff0c;到网红美…

数据结构--栈

一、栈 数组是一种连续存储、随机访问的线性表&#xff0c;链表属于分散存储、连续访问的线性表。它们每个数据都有其相对位置&#xff0c;有至多一个直接前驱和之多一个直接后继。栈&#xff08;Stack&#xff09;和队列&#xff08;Queue&#xff09;也属于线性表&#xff0c…

Fortinet Accelerate 2023·中国区巡展收官丨让安全成就未来

7月18日&#xff0c;2023 Fortinet Accelerate Summit在上海成功举办&#xff01;这亦象征着“Fortinet Accelerate2023中国区巡展”圆满收官。Fortinet携手来自多个典型行业的百余位代表客户&#xff0c;以及亚马逊云科技、Telstra - PBS 太平洋电信、Tenable等多家生态合作伙…