这是约瑟夫环出圈问题,能帮我看看有什么问题吗?出圈顺序总是不对,谢谢

#include "conio.h"
#include <stdio.h>
#include <stdlib.h>//包含malloc函数
#define LEN sizeof(Lnode1)
typedef struct Lnode
{
int key;
int num;//每个结点的序号
struct Lnode *next;
}Lnode1[999];
int main()
{
int m,j=0,;//a[999]用于最后依次输出出圈的人的序号,m为每次出圈的密码,j为计数器
struct Lnode *p,*q,*head,*c,*a[999];//c用于删除结点,p为指向结构体类型数据的指针,head为链表的头指针 ,*a[999]记录要删除的节点
int i,length,limit=1;//limit用于判断输入的人数是否超出999,length为输入人数,i用于计数循环
printf("请输入人数(<999):");
while(limit==1)//当输入人数超出999时,不执行下面的程序
{
scanf("%d",&length);
if(length<=999)
{
printf("请输入初始密码:");
scanf("%d",&m);
limit=0;
//以下开始建立链表
for(i=0;i<length;i++)
{
p=(struct Lnode*)malloc(LEN);//由于p为指向结构体类型数据的指针,而malloc带回的是不指向任何类型数据的指针(void*),所以加了struct Lnode*将malloc返回的指针强制转换为指向结构体类型数据的指针,
//malloc用于开辟一个长度为LEN的连续内存区,每次循环开辟一个新结点使p指向它
if(i==0)
{ q=p;//把p赋值给q
head=q;//把q赋值给head
}
else
q->next=p;
q=p; //p,q后移一位
printf("请输入key%d(>0):",i+1);
scanf("%d",&p->key);
p->num=i+1;
}
q->next=head;//表尾连到表头,形成循环单链表
p=head;//把链表的头指针赋给p
//链表建立完毕
while((length-j)!=2)//当剩下的结点数大于2时
{
for(i=0;i<m-2;i++)
p=p->next;//p后移m-1个位置
c=p->next;
p->next=c->next;//删除结点
a[j]=c;//把删除的结点记录在数组a内
j++;
m=c->key;
p=p->next;//p后移一位
}
if(m%2==0)//出圈密码为偶数时
p=p->next;
else ;
a[j]=p;
p=p->next;
a[j+1]=p;
printf("出圈的序列为:\n");
for(j=0;j<length;j++)
printf("%d\n",*a[j]);//输出结果
}
else
printf("输入人数超过最大允许人数,请重新输入:");
getch();
}
}

int m,j=0,;//a[999]用于最后依次输出出圈的人的序号,m为每次出圈的密码,j为计数器

这行代码中多了一个“ , ”
将分号前面的那个去掉即可。调试通过。
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-12-22
这是因为以下这行错了:
printf("%d\n",*a[j]);//输出结果
要改为:
printf("%d\n",a[j]->num);//输出结果

另外,以下这行不必定义为结构数组:
}Lnode1[999];
改为:
}Lnode1;
第2个回答  2010-12-23
C++
相似回答