帮忙用C++或C编写约瑟夫环的程序

如题所述

问题描述(约瑟夫环):
已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
问题描述的还恰当吧?

解决问题的核心步骤:
1.建立一个具有n个链结点,无头结点的循环链表
2.确定第1个报数人的位置
3.不断地从链表中删除链结点,直到链表为空

c++程序代码如下,仅供参考:
#include <iostream>
using namespace std;
struct monkey {//链表节点
int num;
monkey *next;
};
monkey *head,*tail;//全局变量

void create(int n){//创建链表
int i;
monkey *p,*q;
p=new monkey;
p->num=1;
p->next=NULL;
head=p;
q=p;
for(i=2;i<=n;i=i++){
p=new monkey;
p->num=i;
q->next=p;
q=p;
p->next=NULL;
}
tail=q;
tail->next=head;
}
void select(int m,int k){//确定开始位置,和依次出圈的序号
int x=0,h=1;
int num=1;
monkey *p,*q;
q=tail;
for(;h<k;){
p=q->next;
h++;
q=p;
}//开始位置确定

do{//依次确定出圈顺序并输出序号和顺序号
p=q->next;
x=x+1;
if(x%m==0){
cout<<" "<<num<<": "<<p->num<<endl;
num++;
q->next=p->next;
delete p;
p=NULL;

}
else
q=p;

}while(q!=q->next);
head=q;

}
int main(){
int n,m,k;
head=NULL;
cout<<"请输入围坐在一起的总数目:";
cin>>n;
cout<<"请输入间隔规此m值:";
cin>>m;
cout<<"请输入开始位置的序号:";
cin>>k;
if(k>n){
cout<<"你的输入有误!程序结束!"<<endl<<endl;
return 1;
}
else{
create(n);
cout<<"依次出圈的的编号为:"<<endl<<endl;
cout<<" 次序 编号 "<<endl<<endl;
select(m,k);
cout<<endl<<"最后出圈的是"<<head->num<<"号";
delete head;
cout<<endl<<endl;
return 0;
}
}

说明:这是我以前看程序编程基础时做的小练习。当时,代码参考了吴文虎编著,清华大学出版社出版——程序设计基础(第二版)中的一道例题。在这里为了符合题意,进行了修改。

直言:一楼说的有一定的道理,参考别人的程序前最好还是要自己先写写出来,然后和别人的进行比较。如果对问题进行了详细的分析但仍有困难,再去参考他人的程序。感觉这样收获或许会大些。我是这样做的,呵呵!
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-04-30
/* joseph */
#include<stdio.h>
#include<stdlib.h>

typedef struct Node {
int password;
int num;
struct Node *next;
}Node,*Link;

Link joseph(int n) {
Link p,r,q;
int i;
q=(Node *)malloc(sizeof(Node));
for( i=1;i<=n;i++) {
p=(Node *)malloc(sizeof(Node));
if(!p) exit(r);//存储分配失败
printf("Please intput the %d student's password:",i);
scanf("%d",&p->password);
p->num=i;
q->next=p;
if(i==2)
r=q;
q=q->next;
if(i<n)p=p->next; };
p->next=r;
return r;
}

void print(Link r,int m,int n){
Link p,q;
int i,j;
printf("The order is:\n");
for( i=1;i<=n;i++) {
p=r;
for( j=1;j<m;j++) {
q=p;
p=p->next; } ;

m=p->password;
printf("%d ",p->num);
q->next=p->next;
r=p->next;
free(p);
};
}

void main() {
Link r;
int n,m;
printf("Please input the start number N:");
scanf("%d",&n);
printf("The first password M is:");
scanf("%d",&m);
r=joseph(n);
print(r,m,n);
}本回答被提问者采纳
第2个回答  2009-04-30
这个是最基础的在数据结构里面。还是你自己完成吧。等你以后想用的时候就知道现在没有白学。就怕是书到用时方恨少,事不经过不知道难。除非写出来出了问题叫别人帮你看一下,那还差不多。只接给你答案,只会害你。
第3个回答  2009-05-01
我建议还是自己做吧。。对自己有好处的!
相似回答