单向循环链表——插入、删除、实现约瑟夫环、排序

2024年2月3日
1.请编程实现单向循环链表的头插,头删、尾插、尾删

自定义头文件:

#ifndef __head_h__
#define __head_h__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef int datatype;
typedef struct Node
{
	datatype data;
	struct Node *next;
}*Linklist;
Linklist create();
Linklist insert_head(Linklist head,datatype element);
Linklist insert_rear(Linklist head,datatype element);
void output(Linklist head);
Linklist delete_head(Linklist head);
Linklist delete_rear(Linklist head);

#endif

主函数:

#include"head.h"
int main(int argc, const char *argv[])
{
	datatype element;
	int num;
	Linklist head=NULL;
	printf("please enter num:");
	scanf("%d",&num);
	for(int i=0;i<num;i++)
	{
		printf("please enter %d element:",i+1);
		scanf("%d",&element);
		//head=insert_head(head,element);
		head=insert_rear(head,element);
	}
	output(head);
	puts("");
	head=delete_head(head);
	output(head);
	puts("");
	head=delete_rear(head);
	output(head);
	return 0;
}

自定义函数:

#include"head.h"
/*
 * function:    创建新节点
 * @param [ in] 
 * @param [out] 成功返回首地址,失败返回NULL
 * @return      
 */
Linklist create()
{
	Linklist s=(Linklist)malloc(sizeof(struct Node));
	if(s==NULL)
		return NULL;
	s->data=0;
	s->next=s;
	return s;
}
/*
 * function:   头插
 * @param [ in] 头 插入的值
 * @param [out] 头
 * @return      
 */
Linklist insert_head(Linklist head,datatype element)
{
	Linklist s=create();
	s->data=element;
	if(head==NULL)
	{
		head=s;
	}
	else
	{
		Linklist p=head;
		while(p->next!=head)
			p=p->next;
		s->next=head;
		head=s;
		p->next=head;
	}
	return head;
}
/*
 * function:    尾插 
 * @param [ in] 头 插入值
 * @param [out] 头
 * @return      
 */
Linklist insert_rear(Linklist head,datatype element)
{
	Linklist s=create();
	s->data=element;
	if(head==NULL)
	{
		head=s;
		return head;
	}
	Linklist p=head;
	while(p->next!=head)
	{
		p=p->next;
	}
	p->next=s;
	s->next=head;
	return head;
}
/*
 * function:    遍历输出
 * @param [ in] 头
 * @param [out] 
 * @return      
 */
void output(Linklist head)
{
	if(head==NULL)
	{
		puts("empty");
		return;
	}
	Linklist p=head;
	do
	{
		printf("%-5d",p->data);
		p=p->next;
	}while(p!=head);
}
/*
 * function:    头删
 * @param [ in] 头
 * @param [out] 头
 * @return      
 */
Linklist delete_head(Linklist head)
{
	if(head==NULL)
		return head;
	Linklist del=head;
	Linklist p=head;
	while(p->next!=head)
		p=p->next;
	p->next=head->next;
	head=head->next;
	free(del);
	return head;
}
/*
 * function:    尾删
 * @param [ in] 头
 * @param [out] 头
 * @return      
 */
Linklist delete_rear(Linklist head)
{
	if(head==NULL)
		return NULL;
	if(head->next==head)
	{
		free(head);
		head=NULL;
		return head;
	}
	Linklist p=head;
	while(p->next->next!=head)
	{
		p=p->next;
	}
	Linklist del=p->next;
	free(del);
	del=NULL;
	p->next=head;
	return head;
}

尾插、头删、尾删

头插、头删、尾删

⒉请编程实现单向循环链表约瑟夫环
约瑟夫环:用循环链表编程实现约瑟夫问题
n个人围成一圈,从某人开始报数1,2, .; m,数到m的人出圈,然后从出圈的下一个人(m+1)开始重复此过程,直到全部人出圈,于是得到一个出圈人员的新序列
如当n=8,m=4时,若从第一个位置数起,则所得到的新的序列为4,8,5,2,1,3,7,6。

头文件:

#ifndef __head_h__
#define __head_h__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef int datatype;
typedef struct Node
{
	datatype data;
	struct Node *next;
}*Linklist;
Linklist create();
Linklist insert_rear(Linklist head,datatype element);
void output(Linklist head);
Linklist joseph(Linklist head,int n,int m);

#endif

主函数:

#include"head.h"
int main(int argc, const char *argv[])
{
	datatype element;
	int num;
	Linklist head=NULL;
	printf("please enter num:");
	scanf("%d",&num);
	for(int i=0;i<num;i++)
	{
		printf("please enter %d element:",i+1);
		scanf("%d",&element);
		head=insert_rear(head,element);
	}
	output(head);
	puts("");
	int m;
	printf("please enter m:");
	scanf("%d",&m);
	head=joseph(head,num,m);
	return 0;
}

自定义函数:

/*
 * function:    创建新节点
 * @param [ in] 
 * @param [out] 成功返回首地址,失败返回NULL
 * @return      
 */
Linklist create()
{
	Linklist s=(Linklist)malloc(sizeof(struct Node));
	if(s==NULL)
		return NULL;
	s->data=0;
	s->next=s;
	return s;
}
/*
 * function:    尾插 
 * @param [ in] 头 插入值
 * @param [out] 头
 * @return      
 */
Linklist insert_rear(Linklist head,datatype element)
{
	Linklist s=create();
	s->data=element;
	if(head==NULL)
	{
		head=s;
		return head;
	}
	Linklist p=head;
	while(p->next!=head)
	{
		p=p->next;
	}
	p->next=s;
	s->next=head;
	return head;
}
/*
 * function:    遍历输出
 * @param [ in] 头
 * @param [out] 
 * @return      
 */
void output(Linklist head)
{
	if(head==NULL)
	{
		puts("empty");
		return;
	}
	Linklist p=head;
	do
	{
		printf("%-5d",p->data);
		p=p->next;
	}while(p!=head);
}
Linklist joseph(Linklist head,int n,int m)
{
	if(NULL==head)
		return head;
	Linklist p=head;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m-2;j++)
		{
			p=p->next;
		}
		printf("%-5d",p->next->data);
		Linklist del=p->next;
		p->next=del->next;
		free(del);
		del=NULL;
		p=p->next;
	}
}

3.请编程实现单向循环链表的排序

头文件:

#ifndef __head_h__
#define __head_h__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef int datatype;
typedef struct Node
{
	datatype data;
	struct Node *next;
}*Linklist;
Linklist create();
Linklist insert_rear(Linklist head,datatype element);
void output(Linklist head);
void bubble(Linklist head,int num);
void simple(Linklist head);

#endif

主函数:

#include"head.h"
int main(int argc, const char *argv[])
{
	datatype element;
	int num;
	Linklist head=NULL;
	printf("please enter num:");
	scanf("%d",&num);
	for(int i=0;i<num;i++)
	{
		printf("please enter %d element:",i+1);
		scanf("%d",&element);
		head=insert_rear(head,element);
	}
	output(head);
	puts("");
	//bubble(head,num);
	simple(head);
	output(head);
	return 0;
}

自定义函数:

#include"head.h"
/*
 * function:    创建新节点
 * @param [ in] 
 * @param [out] 成功返回首地址,失败返回NULL
 * @return      
 */
Linklist create()
{
	Linklist s=(Linklist)malloc(sizeof(struct Node));
	if(s==NULL)
		return NULL;
	s->data=0;
	s->next=s;
	return s;
}
/*
 * function:    尾插 
 * @param [ in] 头 插入值
 * @param [out] 头
 * @return      
 */
Linklist insert_rear(Linklist head,datatype element)
{
	Linklist s=create();
	s->data=element;
	if(head==NULL)
	{
		head=s;
		return head;
	}
	Linklist p=head;
	while(p->next!=head)
	{
		p=p->next;
	}
	p->next=s;
	s->next=head;
	return head;
}
/*
 * function:    遍历输出
 * @param [ in] 头
 * @param [out] 
 * @return      
 */
void output(Linklist head)
{
	if(head==NULL)
	{
		puts("empty");
		return;
	}
	Linklist p=head;
	do
	{
		printf("%-5d",p->data);
		p=p->next;
	}while(p!=head);
}
void bubble(Linklist head,int num)
{
	if(NULL==head)
		return;	
	for(int i=1;i<num;i++)
	{
		Linklist p=head;
		for(int j=0;j<num-i;j++)
		{
			if(p->data>p->next->data)
			{
				datatype t=p->data;
				p->data=p->next->data;
				p->next->data=t;
			}
			p=p->next;
		}
	}
}
/*
 * function:    简单选择排序
 * @param [ in] 头
 * @param [out] 
 * @return      
 */
void simple(Linklist head)
{
	if(NULL==head)
		return;
	for(Linklist i=head;i->next!=head;i=i->next)
	{
		Linklist min=i;
		for(Linklist j=i->next;j!=head;j=j->next)
		{
			if(min->data>j->data)
				min=j;
		}
		if(min!=i)
		{
			datatype t=i->data;
			i->data=min->data;
			min->data=t;
		}
	}
}

冒泡排序:

简单选择排序:

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

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

相关文章

React进阶 - 15(React 中 ref 的使用)

本章内容 目录 一、e.target 获取事件对应“元素”的DOM节点二、ref三、ref 和 setState 合用 上一节我们了解了 React中的”虚拟DOM“中的”Diff算法““ &#xff0c;本节我们来说一说 React中 ref的使用 一、e.target 获取事件对应“元素”的DOM节点 打开之前工程中的 To…

摘录笔记——2024年2月5日

美团三年&#xff0c;总结的10条血泪教训在美团的三年多时光&#xff0c;如同一部悠长的交响曲&#xff0c;高高低低&#xff0c;而今离开已有一段时间。闲暇之余&#xff0c;梳理了三年多的收获与感慨&#xff0c;既是对过去一段时光的的一个深情回眸&#xff0c;也是对未来之…

XAI:探索AI决策透明化的前沿与展望

文章目录 &#x1f4d1;前言一、XAI的重要性二、为什么需要可解释人工智能三、XAI的研究与应用四、XAI的挑战与展望 &#x1f4d1;前言 随着人工智能技术的快速发展&#xff0c;它已经深入到了我们生活的方方面面&#xff0c;从智能手机、自动驾驶汽车到医疗诊断和金融投资&…

网桥与网关

文章目录 概要网桥网关联系与区别参考文章 概要 网桥和网关的理解 网桥 几个名词的概念 网关 联系与区别 参考文章 如何通俗地解释什么是网桥&#xff1f; 网关到底是什么求通俗易懂讲解? 网桥&#xff1a;网桥也叫桥接器&#xff0c;是连接两个局域网的一种存储/转发…

探索设计模式的魅力:外观模式简化术-隐藏复杂性,提供简洁接口的设计秘密

设计模式专栏&#xff1a;http://t.csdnimg.cn/U54zu 目录 引言&#xff1a;探索简化之路 一、起源和演变 二、场景案例分析 2.1 不用模式实现&#xff1a;用一坨坨代码实现 2.2 问题 2.3 外观模式重构代码 定义 界面 接口 利用外观模式解决问题步骤 外观模式结构和说明 重构…

07、全文检索 -- Solr -- Solr 全文检索 之 为索引库添加中文分词器

目录 Solr 全文检索 之 为索引库添加中文分词器添加中文分词器1、添加中文分词器的 jar 包2、修改 managed-schema 配置文件什么是 fieldType 3、添加 停用词文档4、重启 solr5、添加【*_cn】动态字段&#xff0c;并为该字段设置中文分词器6、演示分词器的区别演示 text_cjk 这…

智能优化算法 | Matlab实现飞蛾扑火(MFO)(内含完整源码)

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 智能优化算法 | Matlab实现飞蛾扑火(MFO)(内含完整源码) 源码设计 %%%% clear all clc SearchAgents_no=100; % Number of search ag

【技能树学习】Git入门——练习题解析

前言 本篇文章给出了Git入门技能树中部分的练习题解析&#xff0c;包括分支管理&#xff0c;Git标签&#xff0c;在Mac和Windows上使用GitVSCode的步骤。强调了git cherry-pick不直接支持从标签中选择提交&#xff0c;git tag -d只能删除本地标签&#xff0c;Mac系统的终端可以…

C/C++ 回调函数 callback 异步编程

一、C语言的回调函数 1.小试牛刀 #include <iostream> using namespace std; #include <memory> #include <stdlib.h>int add(int a, int b) {return a b; }void test01() {// 函数指针可以指向任何类型的函数&#xff0c;只要函数的参数列表和返回值类型…

单片机串口 奇偶校验 配置问题

一、问题描述 使用GD32单片机串口进行通信测试&#xff0c;单片机的串口配置的是偶校验(Even)、数据位为8、停止位为1、波特率为9600。串口测试软件用的格西烽火&#xff0c;软件的配置如下&#xff1a;   单片机通过串口和串口测试软件进行通信交互&#xff0c;软件收到的数…

绩效主义不可取,为什么还有那么多企业在使用KPI?KPI到底行不行!

“绩效主义毁了索尼” “企业差点被KPI害死” “绩效主义就是企业的脓包” 相信这些言论在过去的若干年里都听过&#xff0c;都是国内外知名企业的大佬说过的话&#xff0c;KPI绩效考核犹如过街老鼠&#xff0c;人人喊打。 虽然近几年&#xff0c;随着小米、知乎等互联网企业…

【HTML 基础】语义化标签

文章目录 1. <header>2. <nav>3. <article>4. <section>5. <footer>为什么使用语义化标签结语 在现代的 Web 开发中&#xff0c;语义化标签成为设计网页结构的重要组成部分。通过使用 <header>, <nav>, <article>, <sectio…

新型生成式 AI 助手 Amazon Q(预览版)上线

今天&#xff0c;我们宣布推出 Amazon Q&#xff0c;这是一种新型的生成式人工智能助手&#xff0c;专门用于满足办公场景需要&#xff0c;可以根据客户业务进行定制。客户可以使用 Amazon Q 进行对话、解决问题、生成内容、获取见解并采取行动&#xff0c;所有这些都基于客户自…

RibbonOpenFeign源码(待完善)

Ribbon流程图 OpenFeign流程图

亚马逊认证考试系列 - 知识点 - 安全组介绍

第一部分&#xff1a;AWS简介 Amazon Web Services&#xff08;AWS&#xff09;是全球领先的云计算服务提供商&#xff0c;为个人、企业和政府机构提供广泛的云服务解决方案。AWS的服务包括计算、存储、数据库、分析、机器学习、人工智能、物联网、安全和企业应用等领域。AW…

2寸证件照多大?怎么裁剪?分享3个工具!

在我们的日常生活中&#xff0c;证件照是必不可少的。不同的场合需要不同尺寸的证件照&#xff0c;其中2寸证件照是最为常见的一种。那么&#xff0c;2寸证件照是多大呢&#xff1f;又有哪些软件可以编辑证件照呢&#xff1f;本文将为你一一解答。 首先&#xff0c;让我们来了解…

大数据企业应用场景分析

目录 一、企业分析 1.1 企业领域维度分析 1.2 技术服务型维度分析 1.3 细分领域维度分析 二、大数据应用场景 2.1 数据分析 2.2 智能推荐 2.3 产品/流程优化 2.4 异常监测 2.5 智能管理 2.6 人工智能和机器学习 三、总结 前言&#xff1a;想讲清楚大数据应用对企业…

第十四篇【传奇开心果系列】Python的OpenCV库技术点案例示例:图像特征提取与描述

传奇开心果短博文系列 系列短博文目录Python的OpenCV库技术点案例示例系列短博文目录前言一、OpenCV图像特征提取与描述介绍二、OpenCV图像特征提取与描述初步示例代码三、扩展思路介绍四、特征点筛选和匹配优化示例代码五、多尺度特征提取示例代码六、非局部特征描述子示例代码…

运行vue3项目出现的问题

Mac 系统运行 vue 启动项目时报错: Permission denied 的解决方式 控制台运行 chmod 777 node_modules/.bin/vue-cli-service 如果 npm run dev 还报这个错 控制台运行 node node_modules/esbuild/install.js

c++之说_10|自定义类型 union 联合体

之前我们说了一些 struct 结构体 现在来了解新的自定义类型 union 联合体 语法 union ptr {void* fptr;CLassFunPtr p;FunPtr p2;ptr& operator(CLassFunPtr ptr){p ptr;return *this;}ptr& operator(FunPtr Fptr){p2 Fptr;return *this;} } FunPtr_; 我们看到了…