求用循环队列解决约瑟夫环问题的C语言代码,急,速度!!!!!!!
请输入围坐在圆桌周围的人数n:7
请输入第一次开始报数人的位置m:3
你希望报数到第几个数的人出列k: 2
出列的顺序如下:4 6 1 3 7 5 2 展开
他们都是用链表做的。。我没用链表做。。。很简单的写了一个。。。
#include <iostream.h>
void Fmade(int x, int y, int z);
void main()
{
int a, b, c;
//t i, j, k;
//t aa[100], b[100];
cout<<"请输入总人数:";
cin>>a;
cout<<endl<<"请输入开始位子:";
cin>>b;
cout<<endl<<"请输入步长:";
cin>>c;
Fmade(a, b, c);
}
void Fmade(int x, int y, int z)
{
int i, j=0, k=0;
int aa[100], bb[100];
int start;
aa[0]=0;
for(i=1; i<=x; i++)
{
aa[i]=i;
}
start=y;
while(j < x)
{
while(start <= x)
{
if(aa[start] !=0)
{
k++;
}
if(k == z)
{
bb[j]=aa[start];
aa[start]=0;
j++;
k=0;
}
start++;
}
start=1;
}
cout<<"出列顺序为:";
for(i=0; i<x; i++)
{
cout<<bb[i]<<" ";
}
}
说明下:因为这个数组只定义了100个字节。其中第一字节没有用。。所以只能计算99以内的出列。。。包括99,如果需要扩大计算范围,只需要扩大数组长度就行了。。。也就Fmade函数的定义。。。
最够插入运算的答案的图片:
他们都是用链表做的。。我没用链表做。。。很简单的写了一个。。。
#include <iostream.h>
void Fmade(int x, int y, int z);
void main()
{
int a, b, c;
//t i, j, k;
//t aa[100], b[100];
cout<<"请输入总人数:";
cin>>a;
cout<<endl<<"请输入开始位子:";
cin>>b;
cout<<endl<<"请输入步长:";
cin>>c;
Fmade(a, b, c);
}
void Fmade(int x, int y, int z)
{
int i, j=0, k=0;
int aa[100], bb[100];
int start;
aa[0]=0;
for(i=1; i<=x; i++)
{
aa[i]=i;
}
start=y;
while(j < x)
{
while(start <= x)
{
if(aa[start] !=0)
{
k++;
}
if(k == z)
{
bb[j]=aa[start];
aa[start]=0;
j++;
k=0;
}
start++;
}
start=1;
}
cout<<"出列顺序为:";
for(i=0; i<x; i++)
{
cout<<bb[i]<<" ";
}
}
说明下:因为这个数组只定义了100个字节。其中第一字节没有用。。所以只能计算99以内的出列。。。包括99,如果需要扩大计算范围,只需要扩大数组长度就行了。。。也就Fmade函数的定义。。。
最够插入运算的答案的图片:
链表
做的。。我没用链表做。。。很简单的写了一个。。。
#include <iostream.h>
void Fmade(int x, int y, int z);
void main()
{
int a, b, c;
//t i, j, k;
//t aa[100], b[100];
cout<<"请输入总人数:";
cin>>a;
cout<<endl<<"请输入开始位子:";
cin>>b;
cout<<endl<<"请输入步长:";
cin>>c;
Fmade(a, b, c);
}
void Fmade(int x, int y, int z)
{
int i, j=0, k=0;
int aa[100], bb[100];
int start;
aa[0]=0;
for(i=1; i<=x; i++)
{
aa[i]=i;
}
start=y;
while(j < x)
{
while(start <= x)
{
if(aa[start] !=0)
{
k++;
}
if(k == z)
{
bb[j]=aa[start];
aa[start]=0;
j++;
k=0;
}
start++;
}
start=1;
}
cout<<"出列顺序为:";
for(i=0; i<x; i++)
{
cout<<bb[i]<<" ";
}
}
说明下:因为这个数组只定义了100个字节。其中第一字节没有用。。所以只能计算99以内的出列。。。包括99,如果需要扩大计算范围,只需要扩大数组长度就行了。。。也就Fmade函数的定义。。。
最够插入运算的答案的图片:
2009-11-26
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int data;
struct node *next;
} node;
node *init(int n) /*创建包含从1到n结点的循环链表*/
{
int i;
node *a,*b,*rt=NULL;
for (i = 0,a=rt=malloc(sizeof(node)); i<n; i++) {
if (!i) {
a->data=1;
a->next=NULL;
}
else {
b=malloc(sizeof(node));
b->next=NULL;
b->data=i+1;
a->next=b;
a=b;
}
}
a->next=rt;
return rt;
}
void prt(node *a,int b,int n) /*从第b个人开始数,数到n者出列*/
{
node *p=a,*fr=a,*de;
int i;
--b;
while (b--)
p=p->next ;
while (fr->next!=p)
fr=fr->next ;
while (p->next!=p)
{
i=n-1;
while (p->next!=p&&i--) {
p=p->next;
fr=fr->next ;
}
printf("%d\t",p->data);
de=p ;
fr->next=fr->next->next;
p=p->next;
free(de);
}
printf("%d\n",p->data );
free(p);
}
int main(void) /*测试*/
{
node *list=init(7);/*共有7个人*/
prt(list,3,2); /*从第3个人开始数,数到2者出列*/
return 0;
}
//---------------------------------------------------------------------------