约瑟夫问题

本文介绍了一个经典的约瑟夫问题,并通过C语言实现了一个循环链表来模拟该问题的过程。具体包括创建循环链表、定义节点结构、实现循环报数及节点删除等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>
#include<stdlib.h>
typedef struct s
{
int a;
struct s *next;
}ss;                       //建立节点
ss*creat(int n)            //建立循环链表的函数
{
int i = 1;
ss*head,*p,*s;
head = (ss*)malloc(sizeof(ss));
head->a = 1;
p = head;
while(--n)
{
s = (ss*)malloc(sizeof(ss));
s->a = i+1;
p->next = s;
p = s;
i++;
}
p->next = head;         //首尾相连
return(head);           //返回“头”指针
}
void print(ss*head,int n,int m,int k)        //依次出局函数
{
int j;
int k2  = k;
ss*p,*s;
p = head;
for( ; --m ; s = p , p = p->next);      //找到第一次报数的位置
for(j=0;j<n;j++)                        //循环n次
{
for( ; --k2 ; s = p , p = p->next); //找到报数结束位置
printf("%d  ",p->a);                //输出出局的人
s->next = p->next;
free(p);
p = s->next;                        //删除节点,释放内存
k2 = k;                             //k2依然取到k值,以备下次使用
}
}
main()
{
int n,m,k;
ss*head;
printf("\t\t\t\t***约瑟夫问题***\n\n");
printf("请输入围坐在圆桌周围的人数n:");
scanf("%d",&n);
    head = creat(n);
printf("请输入第一次开始报数人的位置m:");
scanf("%d",&m);
printf("你希望报数到第几个数的人出列:");
scanf("%d",&k);                        //输入参数,n、m、k
printf("出列顺序:");
print(head,n,m,k);
putchar(10);
}









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值