约瑟夫环问题 数据结构实训需要 用C语言编程 哪位兄台给个能直接运行的(要有注解是什么意思) 先说声谢谢

这是个单人问题所以不需要大型程序但是也不要过短过于简单【问题描述】:编号是1,2,……,n的n(n>0)个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)。开始时任... 这是个单人问题 所以不需要大型程序 但是也不要过短过于简单
【问题描述】:编号是1,2,……,n的n(n>0)个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)。开始时任选一个正整数作为报数上限值m,从第一个开始顺时针方向自1开始顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数。如此下去,直到所有人全部出列为止。设计一个程序来求出出列顺序。
【要 求】:利用单循环链表存储结构解决此问题,按照出列的顺序输出各个人的编号。键盘输入m、n的初值和每个人的密码(密码也可以利用随机函数产生)。
展开
 我来答
164zsq
2011-12-07 · TA获得超过467个赞
知道小有建树答主
回答量:486
采纳率:0%
帮助的人:442万
展开全部
哥们,代码如下,试一下吧
#include <stdlib.h>
#include <stdio.h>
typedef struct node
{int number;
int password;
struct node* next;
}Node,*Linklist;

Linklist CreateLinklist(int amount);
void DeleteLinklist(Linklist R,int start,int amount);
void __cdecl exit(int); //声明

Linklist CreateLinklist(int amount) //建立不带头结点的单向循环链表,用尾指针
{int num,pw,i;
Node*s=NULL,*r=NULL;
Linklist L=NULL,R=NULL;

for(i=0;i<amount;i++)
{printf("\n请输入序号和密码:");
scanf("%d %d",&num,&pw);
s=(Node*)malloc(sizeof(Node));
if(s==NULL)
{printf("空间申请失败!");
exit(0); //退出
}
s->number=num;
s->password=pw;
if(i==0)
{L=s;r=s;}
else {r->next=s;
r=s;
}
} //for
R=r; //尾指针
r->next=L;
return(R); //返回尾指针
}

void DeleteLinklist(Linklist R,int start,int amount) //删除结点并打印序号
{Node *position=NULL,*p=NULL,*q=NULL;
int i,k,secret;

position=R;
secret=start;
for(i=1;i<=amount;i++)
{p=position;
for(k=1;k<secret;k++)
{p=p->next;}
q=p->next;
p->next=q->next;
secret=q->password;
printf("%d",q->number);
position=p; //position指向下一次开始计数的结点的前一个结点
free(q);
} //for
}

int main()
{int amount,start;
Linklist R=NULL; //尾指针

printf("\n请输入总人数:");
scanf("%d",&amount);
R=CreateLinklist(amount);
printf("\n请输入开始密码:");
scanf("%d",&start);
DeleteLinklist(R,start,amount);
return(1);
}
更多追问追答
追问
那个 这个是你自己编写的么?
如果你会的话 加一下好友qq774629368
有事情向您请教谢谢 合作
追答
这个问题很经典,我用数组,顺序表都实现过,而且也用过几种不同的方法,但具体思想都差不多
zhanganan2012
2011-12-09 · 超过16用户采纳过TA的回答
知道答主
回答量:37
采纳率:0%
帮助的人:37.7万
展开全部
一维数组轻松解决
//功能:解决约瑟夫问题

#include<stdio.h>
#define N 9
#define K 2
#define M 3

//给数组赋值
void setDate(int a[],int n)
{ int i;
for(i=0;i<n;i++)
a[i]=i+1;
}
//删除被选中的孩子
void deleted(int a[],int m,int len)
{
int i=m;
do
{
a[i]=a[i+1];
i++;
}while(i<len);
}

//开始play
void play(int a[],int k,int m)
{
int len =N;
int dm=k+m-2;//第一个被剔除的孩子
while(len!=1)
{printf("第%d个孩子被剔除。\n",a[dm]);
deleted(a,dm,len);//将被剔除的孩子从数组中删除
dm=dm+M-1;//下一个被剔除的孩子
len--;//数组的长度减1
if(dm>=len) dm=dm-len;
}
printf("最后一个孩子是%d.",a[0]);//最后一个孩子被放在a[0]中
}
main()
{
int a[N];
setDate(a,N);
play(a,K,M);

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式