主题:数据结构课程设计 Joseph环 那位大哥大姐帮帮忙
tczll
[专家分:0] 发布于 2005-07-08 11:18:00
题目:Joseph环
任务:编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。设计一个程序来求出出列顺序。
要求:利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号。
测试数据:
m的初值为20,n=7 ,7个人的密码依次为3,1,7,2,4,7,4,首先m=6,则正确的输出是什么?
要求:
输入数据:建立输入处理输入数据,输入m的初值,n ,输入每个人的密码,建立单循环链表。
输出形式:建立一个输出函数,将正确的输出序列
[color=00FF00][/color][em18]
我的邮箱:tczll@hotmail.com
回复列表 (共6个回复)
沙发
chinaren2k [专家分:560] 发布于 2005-07-08 13:20:00
这个我有
联系我 chinaren2k@gmail.com
出售
板凳
冷清的月 [专家分:10] 发布于 2005-07-09 23:20:00
#include<iostream.h>
#include<stdlib.h>
typedef struct LNode
{
int listnumber,password;
struct LNode *next;
}LNode,*Linklist;
void create(Linklist &l,int n)
{
int i=1;
l=(Linklist)new(LNode);
cout<<"请输入第 "<<i<<" 个人的密码:"<<endl;
cin>>l->password;
l->listnumber = i;
Linklist p,q=l;
for(i=2;i<=n;i++)
{
p=(Linklist)new(LNode);
cout<<"请输入第 "<<i<<" 个人的密码:"<<endl;
cin>>p->password;
p->listnumber=i;
q->next=p;
q=p;
if(i==n)
{
q->next=l;
}
}
}
void game(Linklist &l,int m,int n)
{
Linklist p=l,k;
int i;
while(n)
{
for(i=1;i<m-1;i++)
p=p->next;
k=p->next;
cout<<k->listnumber<<" ";
m=k->password;
p->next=k->next;
p=p->next;
n--;
free(k);
}
cout<<endl;
}
int main()
{
Linklist L;
int m,n;
char c;
loof: cout<<"请输入初次报数值以及人数:"<<endl;
cin>>m>>n;
create(L,n);
game(L,m,n);
cout<<"continue?"<<endl;
cin.get();
cin.get(c);
if(c=='y')
goto loof;
free(L);
return 0;
}
这是开学时候编的,印象中没有错误,GOTO语句是为了方便测试临时加的,大家自己把它删掉,并且套入循环,强烈建议不要用GOTO语句,当然调试除外.方便起见用了C++的输入输出,改成C很容易,这是完全的过程化,不是面向对象
3 楼
大黑猫 [专家分:0] 发布于 2006-01-03 15:17:00
要是密码是一个数的话怎么改?卖身求助!!!!
4 楼
shengdog [专家分:10] 发布于 2006-01-03 17:12:00
#include<iostream.h>
#include<stdlib.h>
typedef struct LNode
{
int listnumber,password;
struct LNode *next;
}LNode,*Linklist;
void create(Linklist &l,int n)
{
int i=1;
l=(Linklist)new(LNode);
cout<<"请输入第 "<<i<<" 个人的密码:"<<endl;
cin>>l->password;
l->listnumber = i;
Linklist p,q=l;
for(i=2;i<=n;i++)
{
p=(Linklist)new(LNode);
cout<<"请输入第 "<<i<<" 个人的密码:"<<endl;
cin>>p->password;
p->listnumber=i;
q->next=p;
q=p;
if(i==n)
{
q->next=l;
}
}
}
void game(Linklist &l,int m,int n)
{
Linklist p=l,k;
int i;
while(n)
{
for(i=1;i<m-1;i++)
p=p->next;
k=p->next;
cout<<k->listnumber<<" ";
m=k->password;
p->next=k->next;
p=p->next;
n--;
free(k);
}
cout<<endl;
}
int main()
{
Linklist L;
int m,n;
char c;
loof: cout<<"请输入初次报数值以及人数:"<<endl;
cin>>m>>n;
create(L,n);
game(L,m,n);
cout<<"continue?"<<endl;
cin.get();
cin.get(c);
if(c=='y')
goto loof;
free(L);
return 0;
}
呵呵,窃取你的劳动成果一用。
小注:以后编程最好不要用qoto!!
5 楼
pcboyxhy [专家分:2910] 发布于 2006-01-04 15:45:00
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
int m, n, step=0, index=0, cir=0, t;
scanf("%d%d", &m, &n);
char *out = (char*)malloc(m);
if(!out) return -1;
memset(out, 0, m);
while(1)
{
if(step==m) break;
while(cir<n)
{
if(!out[index]) ++cir;
index=(index+1)%m;
}
cir=0; ++step; out[(index+m-1)%m]=1;
printf("\nNo.%d out.", !index?m:index);
}
free(out);
system("PAUSE");
return 0;
}
6 楼
sdmslp [专家分:0] 发布于 2006-12-04 19:40:00
这个题我们还有一个实现提示:采用单向循环链表存储,报数到M的结点删除,继续从下一结点开始.
我来回复