(约瑟夫问题)N个人围成一圈-从第一个开始报数-第k个退出-再从1开始报数-依次循环-直到最后一个人

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
struct ring
{
int number;
struct ring *next;
};
struct ring* creat(int n )
{
struct ring *q,*p,*head;
int i=1;
q=head=NULL;
while(i<=n)
{
p=(struct ring*)malloc(sizeof(struct ring));
p->number=i;
if(q==NULL)
{
head=q=p;
}
else
{
q->next=p;
q=p;
}
i++;
}
q->next=head;
return head;
}
struct ring* delete_number(struct ring *head,int k)
{
struct ring *q,*p;
q=p=head;
if(head==NULL)
{
printf("该链表中无数据元素,不能删除\n");
return head;
}
while(1)
{
q=p;
p=q->next;
if(p->number==k)
{
if(p!=head)
{
q->next=p->next;
free(p);
break;
}
else if(p==head)
{
q->next=p->next;
head=p->next;
break;
}
}
}
return head;
}
main()
{
int n,k,i=0;
int a;
struct ring *head,*p,*q;
while(1)
{
printf("请输入总人数n和退出条件k的值\n");
printf("\nn=");
scanf("%d",&n);
printf("\nk=");
scanf("%d",&k);
printf("\n");
head=creat(n);
p=q=head;
while(1)
{
q=p;
p=q->next;
i++;
if(i%k==0&&((head->next)!=head))
{
head=delete_number(head,q->number);
}
if((head->next)==head)
break;
if(p->next==head)
i=i%k;
}
printf("最后剩下的人是%d号\n",p->number);
printf("是否需要继续?1(继续) or 0(退出)\n请输入0或1:");
scanf("%d",&a);
system("cls");
if(a==0)
break;
}
}。

相关文档
最新文档