约瑟夫环(为什么最后输出的出对序列是乱码,求高手修改,),该怎么处理
约瑟夫环(为什么最后输出的出对序列是乱码,求高手修改,急啊!!!)
#include<time.h>
#include<cstdlib>
#include<iostream>
using namespace std;
struct LNode
{
int num;
int password;
LNode *next; /*生成n个结点的单向循环链表 */
};
typedef LNode* LinkList;
void createList(LinkList &head,int);
void game(LinkList &head,int ,int );
void printList(LinkList head,int);
int n,m;
int main()
{
LinkList head;
cout<<"请输出围圈人数: \n";
cin>>n;
cout<<"请给出一个上报限数: \n";
cin>>m;
while(n<1||m<1) //防止输入出错,增强强壮性
{
cout<<"输入人数有误,请重新输入:\n";
cout<<"请输入参与人数:\n";
cin>>n;
cout<<"请给出一个上报限数: \n";
cin>>m;
}
createList(head,n);
printList(head,n);
cout<<"出列的顺序如下:"<<endl;
game(head,m,n);
}
void createList(LinkList &head,int n)
{
int i,j;
LinkList p=head,r;
srand((int)time(0));
for(i=0; i<n; i++)
{
j=1+(int)rand()%10;
r=p;
p=new LNode; /*创建新的结点*/
p->num=i+1;
p->password=j;
r->next=p;
}
p->next=head->next;
p=head;
head=head->next;
}
void game(LinkList &head,int m,int n)
{
int j;
LinkList p,s;
p=head;
while(n>0)
{
for(j=1;j<m;j++)
{
s=p;
s=s->next;
p=p->next;
}
s->next=p->next;
cout<<p->num<<" ";
m=p->password;
free(p);
p=s->next;
n--; /*每循环一次人是减1*/
}
cout<<endl;
}
void printList(LinkList head,int n)
{
LinkList p=head;
int i;
for(i=0;i<n;i++)
{
cout<<"num:"<<p->num<<" "<<"password:"<<p->password<<endl;
p=p->next;
}
}
------解决方案--------------------
问题1:head没有进行初始化
问题2:方法game中注意注释掉的那行,多余的,会导致错误!
#include<time.h>
#include<cstdlib>
#include<iostream>
using namespace std;
struct LNode
{
int num;
int password;
LNode *next; /*生成n个结点的单向循环链表 */
};
typedef LNode* LinkList;
void createList(LinkList &head,int);
void game(LinkList &head,int ,int );
void printList(LinkList head,int);
int n,m;
int main()
{
LinkList head;
cout<<"请输出围圈人数: \n";
cin>>n;
cout<<"请给出一个上报限数: \n";
cin>>m;
while(n<1||m<1) //防止输入出错,增强强壮性
{
cout<<"输入人数有误,请重新输入:\n";
cout<<"请输入参与人数:\n";
cin>>n;
cout<<"请给出一个上报限数: \n";
cin>>m;
}
createList(head,n);
printList(head,n);
cout<<"出列的顺序如下:"<<endl;
game(head,m,n);
}
void createList(LinkList &head,int n)
{
int i,j;
LinkList p=head,r;
srand((int)time(0));
for(i=0; i<n; i++)
{
j=1+(int)rand()%10;
r=p;
p=new LNode; /*创建新的结点*/
p->num=i+1;
p->password=j;
r->next=p;
}
p->next=head->next;
p=head;
head=head->next;
}
void game(LinkList &head,int m,int n)
{
int j;
LinkList p,s;
p=head;
while(n>0)
{
for(j=1;j<m;j++)
{
s=p;
s=s->next;
p=p->next;
}
s->next=p->next;
cout<<p->num<<" ";
m=p->password;
free(p);
p=s->next;
n--; /*每循环一次人是减1*/
}
cout<<endl;
}
void printList(LinkList head,int n)
{
LinkList p=head;
int i;
for(i=0;i<n;i++)
{
cout<<"num:"<<p->num<<" "<<"password:"<<p->password<<endl;
p=p->next;
}
}
------解决方案--------------------
问题1:head没有进行初始化
问题2:方法game中注意注释掉的那行,多余的,会导致错误!
- C/C++ code
#include<time.h> #include<cstdlib> #include<iostream> using namespace std; struct LNode { int num; int password; LNode *next; /*生成n个结点的单向循环链表 */ }; typedef LNode* LinkList; void createList(LinkList &head,int); void game(LinkList &head,int ,int ); void printList(LinkList head,int); int n,m; int main() { LinkList head = new LNode; cout<<"请输出围圈人数: \n"; cin>>n; cout<<"请给出一个上报限数: \n"; cin>>m; while(n<1||m<1) //防止输入出错,增强强壮性 { cout<<"输入人数有误,请重新输入:\n"; cout<<"请输入参与人数:\n"; cin>>n; cout<<"请给出一个上报限数: \n"; cin>>m; } createList(head,n); printList(head,n); cout<<"出列的顺序如下:"<<endl; game(head,m,n); system("pause"); return 0; } void createList(LinkList &head,int n) { int i,j; LinkList p=head,r; srand((int)time(0)); for(i=0; i<n; i++) { j=1+(int)rand()%10; r=p; p=new LNode; p->num=i+1; p->password=j; r->next=p; } p->next=head->next; p=head; head=head->next; } void game(LinkList &head,int m,int n) { int j; LinkList p,s; p=head; while(n>0) { for(j=1;j<m;j++) { s=p; //s=s->next; p=p->next; } s->next=p->next; cout << p->num <<" "; m=p->password; free(p); p=s->next; n--; } cout<<endl; } void printList(LinkList head,int n) { LinkList p=head; int i; for(i=0;i<n;i++) { cout<<"num:"<<p->num<<" "<<"password:"<<p->password<<endl; p=p->next; } }