主题:求助!一个惹闹了我的题目(用C语言实现)源代码
liyi12121
[专家分:0] 发布于 2005-07-07 10:38:00
任务:编号是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 ,输入每个人的密码,建立单循环链表。
输出形式:建立一个输出函数,将正确的输出序列
回复列表 (共8个回复)
沙发
SWolf [专家分:670] 发布于 2005-07-17 15:15:00
等我学完链表的 再给你解
板凳
FancyMouse [专家分:13680] 发布于 2005-07-17 15:22:00
TJU1012
3 楼
die [专家分:10] 发布于 2005-07-19 11:40:00
这道题可以把这7个人看成一个大圆环,7个人的编号从1-7,他们的密码就是按照3,1,7,2,4,7,4来赋值,我们从第1个开始,首先你输入m(这要有个判断,如果m=这7个人的密码中的一个就接着往下执行,否则就提示以下不对,接着输入m),如果输入的m=3,那么就会发现第1个人的密码为3,就是说第3个人要出去,则第3个人被删除掉,他的密码为1,那么m=1,所以第4个人也出去,就是这么找下去,最后的输出结果为3 4 6 2 5 1 7
至于建立的单链表吗~里面包含他们的编号,密码,还有一个指向下一个位置的指针就可以了!
4 楼
godcloud325 [专家分:200] 发布于 2005-07-19 15:13:00
很简单啊,我现在有事,一会写上来
5 楼
godcloud325 [专家分:200] 发布于 2005-07-20 08:29:00
#include<iomanip.h>
#include<stdlib.h>
//==============================================类对象声明==========================//
template <class T> class list;
template <class T>
class node
{
friend class list<T> ;
friend class circlelist;
private:
T data;
node<T> * next;
};
//----------
template <class T>
class list
{
friend class circlelist;
public:
list(){first=NULL;}
bool insert(int a,T b);
int length();
private:
node<T> * first;
};
//----------
class circlelist
{
public:
circlelist(list<int>& l,int& num) //初始化循环链表,让1->2->3....num->1
{
for(int i=1;i<=num;i++)
{
l.insert(i-1,i);
}
node<int> * p=l.first;
for(int j=1;j<num;j++)
p=p->next;
p->next=l.first;
}
void change(list<int>& l,int *& q,int & shi,int & num) //报到call的分别删除.并存到数组q
{
cout<<"输入报数号:";
int call;
cin>>call;
if(call<1)
exit(1);
if(call==1)
{
for(int h=1;h<=num;h++)
q[h-1]=h;
return;
}
node<int> *p=l.first;
int k;
int n=0;
while(true)
{
for(k=1;k<call-1;k++)
p=p->next;
node<int> * t;
t=p->next;
p->next=t->next;
q[n]=t->data;
delete t;
n++;
p=p->next;
shi++;
if(shi>=num)
break;
}
}
};
//==========================================类函数定义=================================//
template<class T>
bool list<T>::insert(int a,T input)
{
node<T> * p=first;
node<T> * q=new node<T>;
q->data=input;
int t=length();
if(a<0 ||a>t)
return 0;
if(a==0)
{
q->next=first;
first=q;
}
else
{
for(int i=1;i<a;i++)
p=p->next;
q->next=p->next;
p->next=q;
}
return 1;
}
//----------
template<class T>
int list<T>::length()
{
node<T>* p=first;
for(int i=0;p;i++)
p=p->next;
return i;
}
//************************************主程序********************************************************//
void main()
{
int num;
int shi=0;
cout<<"输入游戏人数:";
cin>>num;
list<int> l;
circlelist s(l,num);
int * q=new int [num];
s.change(l,q,shi,num);
for(int m=1;m<=num;m++)
cout<<q[m-1]<<" ";
cout<<endl;
char h;
cin>>h;
}
6 楼
godcloud325 [专家分:200] 发布于 2005-07-20 08:30:00
跟你那个不是完全相同,我会尽快写个完全相同的
7 楼
godcloud325 [专家分:200] 发布于 2005-07-20 15:37:00
完全正确的:
#include<iomanip.h>
#include<stdlib.h>
//==============================================类对象声明==========================//
template <class T> class list;
template <class T>
class node
{
friend class list<T> ;
friend class circlelist;
private:
T data;
T no;
node<T> * next;
};
//----------
template <class T>
class list
{
friend class circlelist;
public:
list(){first=NULL;}
bool insert(int a,T b,T no);
int length();
private:
node<T> * first;
};
//----------
class circlelist
{
public:
circlelist(list<int>& l,int& num,node<int>*& last) //初始化循环链表,让1->2->3....num->1
{
int code;
for(int i=1;i<=num;i++)
{
cout<<"输入第"<<i<<"人手中的密码:";
cin>>code;
l.insert(i-1,code,i);
}
node<int> * p=l.first;
for(int j=1;j<num;j++)
p=p->next;
last=p;
p->next=l.first;
}
void change(list<int>& l,int *& q,int & shi,int & num,node<int>*&last) //报到call的分别删除.并存到数组q
{
cout<<"输入报数号(报到此数的人将退出游戏):";
int call;
cin>>call;
if(call<1)
exit(1);
int k;
int n=0;
if(call==1) //初始报数为1的情况
{
node<int> * t;
t=last->next;
last->next=t->next;
call=t->data;
q[n]=t->no;
delete t;
n++;
shi++;
while(true)
{
for(k=1;k<call;k++)
last=last->next;
node<int> * t;
t=last->next;
last->next=t->next;
call=t->data;
q[n]=t->no;
delete t;
n++;
shi++;
if(shi>=num)
break;
}
return;
}
node<int> *p=l.first; //初始报数不为1的情况
for(k=1;k<call-1;k++)
p=p->next;
node<int> * t;
t=p->next;
p->next=t->next;
call=t->data;
q[n]=t->no;
delete t;
n++;
shi++;
while(true)
{
for(k=1;k<call;k++)
p=p->next;
node<int> * t;
t=p->next;
p->next=t->next;
call=t->data;
q[n]=t->no;
delete t;
n++;
shi++;
if(shi>=num)
break;
}
}
};
//==========================================类函数定义=================================//
template<class T>
bool list<T>::insert(int a,T input,T no)
{
node<T> * p=first;
node<T> * q=new node<T>;
q->data=input;
q->no=no;
int t=length();
if(a<0 ||a>t)
return 0;
if(a==0)
{
q->next=first;
first=q;
}
else
{
for(int i=1;i<a;i++)
p=p->next;
q->next=p->next;
p->next=q;
}
return 1;
}
//----------
template<class T>
int list<T>::length()
{
node<T>* p=first;
for(int i=0;p;i++)
p=p->next;
return i;
}
//************************************主程序********************************************************//
void main()
{
int num;
int shi=0;
node<int>* last;
cout<<"输入游戏人数:";
cin>>num;
list<int> l;
circlelist s(l,num,last);
int * q=new int [num];
s.change(l,q,shi,num,last);
cout<<"游戏者退出游戏的序列是:";
for(int m=1;m<=num;m++)
cout<<q[m-1]<<" ";
cout<<endl;
char h;
cin>>h;
}
8 楼
biy492732033 [专家分:0] 发布于 2006-05-07 21:08:00
二叉树所含的几个结点和满二叉树中编号为1至n结点一一对应,
我来回复