在线等待!!有关约瑟夫问题。

muhao 2003-10-17 10:23:27
链表实现的约瑟夫问题

//链表式约瑟夫问题
#include <stdio.h>
#include <malloc.h>
#include <conio.h>
typedef struct node_type{
int seq,code;
struct node_type *next;
}link;
main()
{
int i,m,n,cn;
link *h,*p,*q;
printf("Input the first code m:");
scanf("%d",&m);//输入初始密码
printf("Input number n:");
scanf("%d",&n);//输入人数
m=m-1;
p=(link*)malloc(sizeof(link));
h=p; q=p;
printf("Input codes:");
for(i=1;i<=n-1;i++)
{
scanf("%d",&cn);
p->seq=i;p->code=cn;
p=(link*)malloc(sizeof(link));
q->next=p; q=p;
}
scanf("%d",&cn);
p->seq=n;
p->code=cn;
p->next=h;
if((n>1)&&(m==0))
{
m=h->code;printf("%d ",h->seq);
p->next=h->next;
free(h);
h=p->next;
}
p=h;
while((n>1)&&(m!=0))
{
if(m>1) for(i=1;i<=m-1;i++)p=p->next;
q=p->next;
m=q->code;
printf("%d ",q->seq);
p->next=q->next;
free(q);
n=n-1;
}
printf("%d\n",p->seq);
getch();
}
有不明白的地方如下:
在程序开始为什么要做“m=m-1”
...全文
44 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
liulang203 2003-10-19
  • 打赏
  • 举报
回复
while((n>1)&&(m!=0))
{
if(m>1) for(i=1;i<=m-1;i++)p=p->next;
q=p->next;
m=q->code;
printf("%d ",q->seq);
p->next=q->next;
free(q);
n=n-1;
}
注意这一段程序。在这一段中,本来在for(.......)中是向后推了m-1个但是下面有一个q=p-next;
又向后推了一个,最后又把q释放了到最后还是向后推了m个了
playboyxp 2003-10-19
  • 打赏
  • 举报
回复
#include <iostream.h>
void main()
{
int a[17],i,j,k=1,integer;
for(i=0;i<17;i++)
a[i]=i+1;
cin>>integer;
i=-1;
while(1)
{
for(j=0;j<integer;)
{
i=(i+1)%17;
if(a[i]!=0) j++;
}
if(k==17) break;
cout<<a[i]<<" ";
a[i]=0;
k++;
}
cout<<a[i]<<endl;
}
pxwzd123 2003-10-17
  • 打赏
  • 举报
回复
请看程序中的如下代码:
if((n>1)&&(m==0))
{
...............
}
如果每数到第m个人时就出列,那么就是每隔m-1个人就出列,程序中都使用隔几个人作为标志,所以,开始就有m=m-1

69,374

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧