数据结构约瑟夫环

2022.10.02


任务描述

本关任务:n个人围成一圈,按顺序从1到n进行编号,初始时从编号为1的人开始按1、2、3…顺序报数,报数到m(1≤m≤n)时该人退出到圈外,接着从出圈时的下一个位置开始从1开始重新进行报数,报数到m时的人再退出到圈外,以此类推。

编程要求

根据提示,在右侧编辑器补充代码,补充完成函数void Jesuphus(LinkNode *&L, int n, int m),其中L为不带附加头结点的循环单链表的头指针,n为圈中人的个数,m为报数的值。

各种格式

输入格式
输入只有一行,为n和m。1≤n≤3000,1≤m≤n。

输出格式
输出包含一行,为退出到圈外的人的编号,编号之间以一个空格分隔。

样例输入1
10 3

样例输出1
3 6 9 2 7 1 8 5 10 4

样例输入2
7 4

样例输出1
4 1 6 5 7 3 2

开始你的任务吧,祝你成功!

C++代码

#include "linklist.h"

/**
 * 约瑟夫环:L为不带附带头结点的循环单链表的头指针
 */
void Jesuphus(LinkNode *&L, int n, int m)
{
	//请在下面编写代码
	/******************Begin******************/
    int count=0;
    int i=2;
    LinkNode *pre=L,*p=pre->next;
    while(count!=n){
        if(m==1)
    {
        for(int i=1; i<=n; i++)
        {
            printf("%d ",i);
        }
        return;
    }
    if(i==m)
    {
        printf("%d ",p->data);
        pre->next=p->next;
        free(p);
        p=pre->next;
        i=1;
        count++;
    }
    else
    {
        pre=p;
        p=p->next;
        i++;
    }
}
	/*******************End*******************/
}

//尾插法建立循环单链表
void CreateListR(LinkNode *&L, ElemType a[], int n)
{
	LinkNode *s, *r;
	L = (LinkNode *)malloc(sizeof(LinkNode));  	//创建头结点
	L->data = a[0];
	L->next = NULL;
	r = L;					//r始终指向终端结点,开始时指向头结点
	for (int i = 1; i < n; i++)
	{
		s = (LinkNode *)malloc(sizeof(LinkNode)); //创建新结点s
		s->data = a[i];
		r->next = s;		//将结点s插入结点r之后
		r = s;
	}
	r->next = L;			//形成循环单链表
}

//输出循环单链表
void DispList(LinkNode *L)
{
	LinkNode *p = L;
	while (p->next != L)
	{
		printf("%d ", p->data);
		p = p->next;
	}
	printf("%d\n", p->data); //打印最后一个结点的值
}
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值