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;
}
我这个程序应该怎样改?
展开
 我来答
kaixingui2012
2012-10-24 · TA获得超过4.2万个赞
知道大有可为答主
回答量:1.4万
采纳率:81%
帮助的人:6309万
展开全部
还没解决啊,中午的回答被百度黑掉了。
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
追答
你自己数一下出列顺序!
yellowboy_
2012-10-24
知道答主
回答量:27
采纳率:0%
帮助的人:5.3万
展开全部
我有程序并带解释~不过是C语言的~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式