我是靠谱客的博主 淡淡篮球,这篇文章主要介绍约瑟夫环(循环单链表)【严蔚敏】,现在分享给大家,希望可以做个参考。

题目描述:
编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。现在给定一个随机数m>0,从编号为1的人开始,按顺时针方向1开始顺序报数,报到m时停止。报m的人出圈,同时留下他的密码作为新的m值,从他在顺时针方向上的下一个人开始,重新从1开始报数,如此下去,直至所有的人全部出圈为止。
问题输入
输入数据第一行为两个正整数n和m,分别表示人的个数及初始随机数,每组数据的第二行为n个整数,表示每个人持有的密码。
问题输出
用一行输出n个整数表示依次出圈人的编号,整数之间用空格分隔 。

输入样例
7 20
3 1 7 2 4 8 4
输出样例
6 1 4 7 2 3 5

上代码楼

//约瑟夫环
//循环单链表 
#include<stdio.h>
#include<stdlib.h>
//采用链表 
typedef struct Node{	 
	int data;			//拿到的密码
	int bian;			//编号 
	struct Node * next;
	
}LinkList; 

void CreateList(LinkList *&l,int &n,int &m);	//创建一个链表 
void Delete(LinkList* &l,int &m) ;		//删除一个,且返回他的密码 
int main()
{
	LinkList *l;
	int m,n,i=0,j = 1;
	CreateList(l,n,m);
	while(i!= n){			//达到循环的目的呀,逐个删除 
		while(j < m -1){	//先是遍历,找到那个节点的前驱节点,便于删除那个节点 
			j++;
			l = l->next;	
		}
		j = 1;			
		Delete(l,m);
		i++;
	}
	
} 

void CreateList(LinkList *&l,int &n,int &m)
{
	l= (LinkList*)malloc(sizeof(LinkList));		//开辟一个空间 
	LinkList *q;				
	l->next = NULL;
	q = l;
	scanf("%d%d",&n,&m);					//输入人的个数及初始随机数 
	for(int i=0;i<n;i++){			//尾插法 插入 ,这个链表我一开始设的是有头节点的 
		LinkList *p;
		p = (LinkList*)malloc(sizeof(LinkList));	//设置一个节点 
		scanf("%d",&p->data);
		p->bian = i+1;
		q->next = p;					/ 
		q = p ;
		}
	q->next = l->next;				//尾节点指针指向头节点指向的第一个节点(把这个没有存有效数据的节点去掉) 
	q=l;
	l = l->next;
	free(q);
}
//删除节点,并且输入这个节点的编号 
void Delete(LinkList *&l,int &m){	
	LinkList *p;
	p = l->next;
	l->next = l->next->next;
	m = p->data;
	if(m!=1)
	l = l->next;
	printf("%d ",p->bian);
	free(p);
}



注释刚刚加上,有啥不懂得或者错误请指正!

最后

以上就是淡淡篮球最近收集整理的关于约瑟夫环(循环单链表)【严蔚敏】的全部内容,更多相关约瑟夫环(循环单链表)【严蔚敏】内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(103)

评论列表共有 0 条评论

立即
投稿
返回
顶部