joseph环
问题描述:编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向自1开始顺序报...
问题描述:编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。设计一个程序来求出出列顺序。
#include <iostream>
#include<stdlib.h>
using namespace std;
class LinkNode
{
public:
int data,num;
LinkNode *next;
};
LinkNode *p;
LinkNode *head;
void creat(int n) //创建链表
{
int i;
// LinkNode *p;
LinkNode *q;
p=new LinkNode;
cout<<"请输入第1个密码num=";
cin>>p->data;
p->num=1;
head=p;
for(i=2;i<=n;i++)
{
cout<<"请输入第"<<i<<"个密码num=";
q=new LinkNode;
cin>>q->data;
q->num=i;
p->next=q;
p=q;
if(i==n)
{
p->next=head;
break;
}
}
}
void Delete(int m)
{
int i;
// LinkNode *p;
LinkNode *q=p->next;
for(i=1;i<=m;i++)
{
if(i<m)
{
p=p->next;
}
if(i==m)
{
q=p->next;
p->next=q->next;
//cout<<"5";
cout<<"第"<<q->num<<"个人出列"<<" ";
m=q->data;
delete q;
// q=p->next;
}
}
if(p->next!=p)
Delete(m);
delete p;
}
int main()
{
int n,m;
cout<<"请输入人数n=";
cin>>n;
cout<<"请输入报数上限m=";
cin>>m;
creat(n);
Delete(m);
return 0;
}
我这个程序应该怎样改? 展开
#include <iostream>
#include<stdlib.h>
using namespace std;
class LinkNode
{
public:
int data,num;
LinkNode *next;
};
LinkNode *p;
LinkNode *head;
void creat(int n) //创建链表
{
int i;
// LinkNode *p;
LinkNode *q;
p=new LinkNode;
cout<<"请输入第1个密码num=";
cin>>p->data;
p->num=1;
head=p;
for(i=2;i<=n;i++)
{
cout<<"请输入第"<<i<<"个密码num=";
q=new LinkNode;
cin>>q->data;
q->num=i;
p->next=q;
p=q;
if(i==n)
{
p->next=head;
break;
}
}
}
void Delete(int m)
{
int i;
// LinkNode *p;
LinkNode *q=p->next;
for(i=1;i<=m;i++)
{
if(i<m)
{
p=p->next;
}
if(i==m)
{
q=p->next;
p->next=q->next;
//cout<<"5";
cout<<"第"<<q->num<<"个人出列"<<" ";
m=q->data;
delete q;
// q=p->next;
}
}
if(p->next!=p)
Delete(m);
delete p;
}
int main()
{
int n,m;
cout<<"请输入人数n=";
cin>>n;
cout<<"请输入报数上限m=";
cin>>m;
creat(n);
Delete(m);
return 0;
}
我这个程序应该怎样改? 展开
2个回答
展开全部
还没解决啊,中午的回答被百度黑掉了。
void Delete(int m)
{
LinkNode *p=head ; //p指向表头
while ( p ) //当链表不空时循环
{
LinkNode *q,*last;
if ( m== 1 ) //m=1时,就顺序清除到尾就好了
{
q=p;
if ( p->next== head )
p=NULL ;
else
p=p->next ;
}
else
{
int i=1;
while ( i++ < m )
{
last=p; //记录上一个结点
p=p->next ;
}
q=p; //当前结点出列
if ( p == p->next ) //当只剩自己时,结束
p=NULL;
else
{
last->next=q->next; //断链重连
p=p->next ;
}
}
cout<<"第"<<q->num<<"个人出列"<<" "<< q->data << endl;
delete q;
}
}
把这个函数,替换了你的,再试试吧
void Delete(int m)
{
LinkNode *p=head ; //p指向表头
while ( p ) //当链表不空时循环
{
LinkNode *q,*last;
if ( m== 1 ) //m=1时,就顺序清除到尾就好了
{
q=p;
if ( p->next== head )
p=NULL ;
else
p=p->next ;
}
else
{
int i=1;
while ( i++ < m )
{
last=p; //记录上一个结点
p=p->next ;
}
q=p; //当前结点出列
if ( p == p->next ) //当只剩自己时,结束
p=NULL;
else
{
last->next=q->next; //断链重连
p=p->next ;
}
}
cout<<"第"<<q->num<<"个人出列"<<" "<< q->data << endl;
delete q;
}
}
把这个函数,替换了你的,再试试吧
更多追问追答
追问
这个也有问题的啊。。。比如n=3,m=4,密码分别是1,2,3,那出列顺序不是应该是1,2,3吗?怎么这个运行出来是1,3,2
追答
你自己数一下出列顺序!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询