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

一、单向循环链表的描述

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

单向循环链表的操作和单链表操作基本一致,差别在于:当链表遍历时,判别当前指针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;  //定义结点变量,注意定义时一定要指向NULLint 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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue+element Cascader 级联选择器 > 实现省市区三级联动

vueelement Cascader 级联选择器 > 实现省市区三级联动 先看下实现效果吧&#xff08;嘻嘻&#xff09; 看完我们就开始啦 安装element-china-area-data1 npm install element-china-area-data5.0.2 -S上代码 <el-cascadersize"large":options"options…

CRC校验原理全面解读

目录 1. 简介2. 原理2.1 CRC的发送与接收2.2 CRC校验码的生成2.3 CRC校验码的校验 3. 拓展问题3.1 模2除法为什么等同于异或运算&#xff1f;3.2 为什么除数的位数和被除数补充的位数相差为1&#xff1f;3.3 为什么CRC校验码不能纠正错误&#xff0c;只能检测错误&#xff1f; …

基于Selenium+Python的web自动化测试框架(附框架源码+项目实战)

目录 一、什么是Selenium&#xff1f; 二、自动化测试框架 三、自动化框架的设计和实现 四、需要改进的模块 五、总结 总结感谢每一个认真阅读我文章的人&#xff01;&#xff01;&#xff01; 重点&#xff1a;配套学习资料和视频教学 一、什么是Selenium&#xff1f; …

会员管理系统如何深度绑定用户?会员系统必备哪些功能?

在以消费者为主导的企业&#xff08;商家&#xff09;范围内&#xff0c;实行会员制管理能够更好的提升客户的忠诚度&#xff0c;减少客户的流失。完整、精确的会员管理系统&#xff0c;更能提升企业&#xff08;商家&#xff09;的实际效益。 蚓链会员管理系统(专业版) 便是这…

02 QPushButton的基本使用

Tips: 在使用控件的时候如果没有智能提示&#xff0c;可能是没有包含头文件 在运行时&#xff0c;报【invalid use of xxx】可能是没有包含相关头文件 如果出现中文乱码&#xff1a;设置编译器的编码格式为UTF-8 本节主要包含创建一个按钮控件、显示按钮、设置按钮的父窗口、设…

Centos7安装Docker

Centos7安装Docker 目录 环境准备 安装Docker 启动Docker 切换源 启动第一个容器 环境准备 切换root权限 su root 升级所有包同时也升级软件和系统内核 yum -y update 卸载旧版本 yum remove docker docker-common docker-selinux docker-engine 卸载旧版本 yum rem…

UG\NX二次开发 捕获NX OPEN C++异常,乱码问题

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: 捕获NX OPEN C++异常,乱码问题。 效果: 使用uc1601(ex.what(),1)显示乱码 使用 NXMessageBox()->Show("Block Styler", NXMessageBox::DialogTypeError, ex…

rce题目

<?php include "flag.php"; highlight_file(__FILE__); if(isset($_GET[HECTF])) { if (; preg_replace(/[^\W]\((?R)?\)/, NULL, $_GET[HECTF])) { if (!preg_match(/pos|high|op|na|info|dec|hex|oct|pi/i, $_GET[HECTF])) { eval(…

Kubernetes Volume及其类型(NFS、SAN) - PV - PVC - PV与PVC与Pod的关系

目录 volume 卷 官方文档&#xff1a;卷 | Kubernetes 一、emptyDir&#xff08;临时卷&#xff09; 二、hostPath卷 type字段参数 hostPath 实验&#xff1a; 三、第3方提供的存储卷&#xff08;百度云、阿里云、亚马逊云、谷歌云等&#xff09; 四、local卷 五、NF…

Nautlius Chain主网正式上线,模块Layer3时代正式开启

Nautilus Chain 是在 Vitalik Buterin 提出 Layer3 理念后&#xff0c; 对 Layer3 领域的全新探索。作为行业内首个模块化 Layer3 链&#xff0c;我们正在对 Layer3 架构进行早期的定义&#xff0c;并有望进一步打破公链赛道未来长期的发展格局。 在今年年初&#xff0c;经过我…

Java读取Excel 单元格包含换行问题

Java读取Excel 单元格包含换行问题 需求解决方案 需求 针对用户上传的Excel数据&#xff0c;或者本地读取的Excel数据。单元格中包含了换行&#xff0c;导致读取的数据被进行了切片。 正常读取如下图所示。 解决方案 目前是把数据读取出来的cell转成字符串后&#xff0c;…

Flask新手教程

Flask简介 Flask是一个轻量级的可定制框架&#xff0c;使用Python语言编写&#xff0c;较其他同类型框架更为灵活、轻便、安全且容易上手。 Flask 可以很好地结合MVC模式进行开发&#xff0c;开发人员分工合作&#xff0c;小型团队在短时间内就可以完成功能丰富的中小型网站或…

迭代器模式:相比直接遍历集合数据,使用迭代器有哪些优势?

今天&#xff0c;我们学习另外一种行为型设计模式&#xff0c;迭代器模式。它用来遍历集合对象。不过&#xff0c;很多编程语言都将迭代器作为一个基础的类库&#xff0c;直接提供出来了。在平时开发中&#xff0c;特别是业务开发&#xff0c;我们直接使用即可&#xff0c;很少…

Vue电商项目--登录与注册

登录注册静态组件 刚刚报了一个错误&#xff0c;找不到图片的资源 assets文件夹--放置全部组件共用静态资源 在样式当中也可以使用符号【src别名】。切记在前面加上 注册业务上 先修改原先的接口成这个按钮 然后把input框里面的数据保存到data中 注册业务下 就是点击获…

Spring后置处理器BeanFactoryPostProcessor与BeanPostProcessor源码解析

文章目录 一、简介1、BeanFactoryPostProcessor2、BeanPostProcessor 二、BeanFactoryPostProcessor 源码解析1、BeanDefinitionRegistryPostProcessor 接口实现类的处理流程2、BeanFactoryPostProcessor 接口实现类的处理流程3、总结 三、BeanPostProcessor 源码解析 一、简介…

安泰电子:ATA-ML100水声功率放大器模块技术参数

随着人类对海洋的深度探索和利用的不断加深&#xff0c;水下通信技术日益成为研究的热点。水下通信技术是指在海洋、湖泊等水体中实现信息传递和交流的技术手段。它不仅在海洋资源勘探、海洋环境监测等领域具有广泛应用&#xff0c;还在水下考古、水下工程等领域发挥着重要作用…

【UniApp开发小程序】项目创建+整合UI组件(FirstUI和uView)

创建项目 下图为初始化的项目的文件结构 引入组件 俗话说&#xff1a;“工欲善其事&#xff0c;必先利其器”&#xff0c;为了更加方便地开发出页面较为美观的小程序&#xff0c;我们先引入成熟的UI组件&#xff0c;再开始开发之旅。&#xff08;如果你是前端高手&#xff0…

移动端深度学习部署:TFlite

1.TFlite介绍 &#xff08;1&#xff09;TFlite概念 tflite是谷歌自己的一个轻量级推理库。主要用于移动端。 tflite使用的思路主要是从预训练的模型转换为tflite模型文件&#xff0c;拿到移动端部署。 tflite的源模型可以来自tensorflow的saved model或者frozen model,也可…

MotionBert论文解读及详细复现教程

MotionBert&#xff1a;统一视角学习人体运动表示 通过学习人体运动表征&#xff0c;论文原作者提出了处理以人为中心的视频任务的统一方法。使用双流时空transformer&#xff08;DSTformer&#xff09;网络实现运动编码器&#xff0c;能够全面、自适应地捕获骨骼关节之间的远…

在php中安装php_xlswriter扩展报错,找不到php_xlswriter.dll

前言&#xff1a;这里已经把下载的php_xlswriter.dll扩展放到了php安装目录的ext目录下&#xff0c;运行php -m还是报错找不到该扩展 原因&#xff1a;下载的扩展是nts的&#xff0c;而安装的php是ts的。查看当前php是nts还是ts&#xff1a; 在PHP中&#xff0c;可以利用phpin…