21、数据结构/单向循环链表练习20240203

一、请编程实现单向循环链表的头插,头删、尾插、尾删。

二、请编程实现单向循环链表约瑟夫环

约瑟夫环:用循环链表编程实现约瑟夫问题

n个人围成一圈,从某人开始报数1, 2, ..., m,数到m的人出圈,然后从出圈的下一个人(m+1)开始重复此过程,

直到 全部人出圈,于是得到一个出圈人员的新序列

如当n=8,m=4时,若从第一个位置数起,则所得到的新的序列 为4, 8, 5, 2, 1, 3, 7, 6。

三、请编程实现单向循环链表的排序。

(以上均为单向循环链表,故在一个文件内完成)

代码:

#include<stdlib.h>
#include<string.h>
#include<stdio.h>
typedef struct node //定义链表节点结构体:数据域、指针域
{
	int data;
	struct node *next;
}*linklist;
linklist create_node()//创建新节点并初始化,返回节点地址
{
	linklist s=(linklist)malloc(sizeof(struct node));
	if(NULL==s)
		return NULL;
	s->data=0;
	s->next=s;
	return s;
}
linklist insert_head(linklist head,int element)
{
	linklist s=create_node();
	if(NULL==s)
	{
		puts("fail");
		return NULL;
	}
	s->data=element;
	if(NULL==head)
	{
		head=s;
		return head;
	}
	linklist p=head;
	while(p->next!=head)
		p=p->next;
	s->next=head;
	head=s;
	p->next=head;
	return head;
}
linklist insert_rear(linklist head,int element)
{
	linklist s=create_node();	
	if(NULL==s)
	{
		puts("fail");
		return NULL;
	}
	s->data=element;
	if(NULL==head)
	{
		head=s;
		return head;
	}
	linklist p=head;
	while(p->next!=head)
		p=p->next;
	p->next=s;
	s->next=head;
	return head;
}
void output(linklist head)
{
	linklist p=head;
	while(p->next!=head)
	{
	printf("%d ",p->data);
	p=p->next;
	}
	printf("%d",p->data);
	puts("");
}
linklist delete_head(linklist head)
{
	if(NULL==head)
	{
		puts("empty");
		return head;		
	}
	if(head==head->next)
	{
		free(head);
		return NULL;
	}
	linklist del=head;
	linklist p=head;
	while(p->next!=head)
		p=p->next;
	head=head->next;
	p->next=head;
	free(del);del=NULL;
	return head;
}
linklist delete_rear(linklist head)
{
	if(NULL==head)
	{
		puts("empty");
		return head;		
	}
	if(head==head->next)
	{
		free(head);
		return NULL;
	}
	linklist p=head;
	while(p->next->next!=head)
		p=p->next;
	linklist del=p->next;
	p->next=head;
	free(del);del=NULL;
	return head;
}
void joseph_ring(linklist head,int len,int m)
{
	linklist p=head;
	for(int i=1;i<=len;i++)
	{
		for(int j=1;j<=m-2;j++)
		{
			p=p->next;
		}
		linklist del=p->next;
		printf("%d ",del->data);
		p->next=del->next;
		free(del);
		p=p->next;
	}
	puts("");
}
void simple_sort(linklist head)
{
	linklist p=head;
	for(p;p->next!=head;p=p->next)
	{
		linklist min=p;
		for(linklist q=p->next;q!=head;q=q->next)
		{
			if(min->data > q->data)
				min=q;
		}
		if(min!=p)
		{
			int t=min->data;
			min->data=p->data;
			p->data=t;
		}
	}
}
int main(int argc, const char *argv[])
{
	linklist head=NULL;//定义单向循环链表头指针并初始化
	int len;//根据终端输入的值确定单向循环链表的长度
	printf("please enter the length of the linklist:");
	scanf("%d",&len);
	int element;
	for(int i=0;i<len;i++)//循环输入数值,头插或尾插创建循环链表
	{
		printf("%d element:",i+1);
		scanf("%d",&element);
//		head=insert_head(head,element);//头插
		head=insert_rear(head,element);//尾插
	}
	output(head);//遍历
	simple_sort(head);//排序
	output(head);
/*//代码实现约瑟夫环
	for(int i=1;i<=len;i++)
	{
		head=insert_rear(head,i);//根据长度循环尾插输入约瑟夫环内数值;
	}
	output(head);//遍历
	int m;
	printf("please enter the m of the joseph ring:" );
	scanf("%d",&m);
	joseph_ring(head,len,m);
	head=delete_head(head);//头删
	head=delete_head(head);
	output(head);
	head=delete_rear(head);//尾删
	output(head);
*/
	
	return 0;
}

运行:

相关推荐
没有名字的鬼6 小时前
C_字符数组存储汉字字符串及其索引
c语言·开发语言·数据结构
Milk夜雨7 小时前
C语言冒泡排序教程简介
数据结构·算法·排序算法
委婉待续7 小时前
redis的学习(三)
数据结构·算法
我可能是个假开发11 小时前
【递归与分治】Leetcode23:合并K个升序链表
数据结构·链表
武昌库里写JAVA11 小时前
Redis 笔记(二)-Redis 安装及测试
数据结构·vue.js·spring boot·算法·课程设计
tt55555555555512 小时前
每日一题-两个链表的第一个公共结点
数据结构·算法·链表
路溪非溪13 小时前
数据结构之树
数据结构
执着的小火车14 小时前
【2024华为OD-E卷-100分-boss的收入】(题目+思路+Java&C++&Python解析)
数据结构·算法·华为od·华为·排序算法
小小小妮子~15 小时前
B+树在MySQL中的应用价值
数据结构·mysql·b+树
SsummerC16 小时前
【leetcode100】二叉树的直径
数据结构·python·算法·leetcode