约瑟夫环:将编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个开始按顺时针方向自1开始报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。设m的初值为20,密码为:3,1,7,2,4,8,4。
#include<stdlib.h>
#include<iostream.h>
typedef struct LNode
{
int num,pwd;
struct LNode *next;
}LNode, *LinkList;
void main()
{
int a,i,m,n,j;//m为报数上限值,n为人数,j为输入的密码;
cout<<"please enter m and n:";
cin>>m>>n;
LinkList head,p,pt;//head为头节点的指针,p为当前指针的前一指针,pt为当前指针;
head=(LinkList)malloc(sizeof(LNode));
p=head;
for(i=1;i<n;i++)
{
pt=(LinkList)malloc(sizeof(LNode));
p->next=pt;
p=pt;
}
pt->next=head;
pt=head;
p=head;//建立n个节点;
cout<<"please enter the password:";
for(i=1;i<=n;i++)
{
cin>>j;
p->num=i;
p->pwd=j;
p=p->next;
}
pt=head;
p=head;//输入各个人的密码;
for(i=1;i<n;i++)
pt=p;//找寻最后一个节点;
for(i=1;i<=n;i++)
{
for(a=1;a<m;a++)
{
p=p->next;
}
pt=p;
m=pt->pwd;
cout<<pt->num;
p->next=pt->next;
free(pt);
pt=p;//输出各人的编号;
}
}
我在 VISUAL C++里运行总是显示内存引用失败。找了半天错也没找出来。大家帮忙看一下哪儿错了啊?