约瑟夫问题
编号为1~N的N个人按顺时针方向坐一圈,每个人持有一个密码(正整数,可以自由输入),开始人选一个正整数作为报数上限值M,从第一个人按顺时针方向自1开始顺序报数,报到M时
停止报数。报M的人出列,将他的密码作为新的M值,从他顺时针方向上的下一个人开始从1报数,
如此下去,直至所有人出列
在运行时,总会显示运行失败,求大神指导{:5_92:} {:5_92:}
#include <iostream>
#include<stdlib.h>
using namespace std;
#define ERROR 0
typedef struct node
{
int number;
int key;
struct node *next;
}node,*Linklist;
Linklist intilist(int n);
int lengthlist(Linklist L);
int scanlist(Linklist L);
int gamelist(Linklist &L,int m);
Linklist intilist(int n)
{
if(n==0)
return NULL;
int ikey;
cout<<"输入第1个人的密码:";
cin>>ikey;
Linklist L=new node;
L->key=ikey;
L->number=1;
L->next=L;
for(int i=2;i<=n;i++)
{
Linklist p=new node;
int ikey;
cout<<"输入第"<<i<<"个人的密码:";
cin>>ikey;
p->key=ikey;
p->number=i;
p->next=L->next;
L->next=p;
L=L->next;
}
cout<<"单链表创建完毕"<<endl;
L=L->next;
return L;
}
int lengthlist(Linklist L)
{
if(L=NULL)
return 0;
int i=1;
Linklist p=L->next;
while(p!=L)
{
i++;
p=p->next;
}
return i;
}
int scanlist(Linklist L)
{
Linklist p=L;
if(p==NULL)
{
cout<<"人数为空"<<endl;
return ERROR;
}
cout<<"第一个人密码为:"<<p->key<<endl;
p=p->next;
while(p!=L)
{
cout<<"第"<<p->number<<"个人的密码为:"<<p->key<<endl;
p=p->next;
}
}
int gamelist(Linklist&L,int m)
{
if(L==NULL)
{
cout<<"人数为空,出列结束"<<endl;
return ERROR;
}
Linklist p=L;
while(p->next!=L)
p=p->next;
for(int n=lengthlist(L);n>0;n--)
{
cout<<"密码为:"<<m<<",出列编号为:";
for(int i=1;i<=m%n-1;i++)
p=p->next;
cout<<p->next->number<<endl;
m=p->next->key;
Linklist q=p->next;
p->next=q->next;
free(q) ;
}
return 1;
}
int main()
{
int m,n;
cout<<"请输入初始密码"<<endl;
cin>>m;
cout<<"请输入人数"<<endl;
cin>>n;
Linklist L=intilist(n);
cout<<n<<"个人的密码为"<<endl;
scanlist(L);
cout<<n<<"个人的出列顺序为"<<endl;
gamelist(L,m);
}
Linklist p=L->next;
第51行你把L赋值为NULL 谢谢分享 Linklist p=L->next;
页:
[1]