给你个调试过的约瑟夫出圈问题,我记得好像和这个差不多,你自己对着看吧,
#include
#include
#define LEN sizeof(struct Lnode)
typedef struct Lnode
{
int key;
int num;//每个结点的序号
struct Lnode *next;
}Lnode[30];
void main()
{
int a[30],m,j=0;//a[30]用于最后依次输出出圈的人的序号,m为每次出圈的密码,j为计数器
struct Lnode *p,*q,*head,*c;//c用于删除结点
int i,length,limit=1;//limit用于判断输入的人数是否超出30,length为输入人数,i用于计数循环
printf("请输入人数(<=30):");
while(limit==1)//当输入人数超出30时,不执行下面的程序
{
scanf("%d",&length);
system("cls");
if(length<=30)
{
printf("请输入初始密码:");
scanf("%d",&m);
system("cls");
limit=0;
//以下开始建立链表
for(i=0;i
p=(struct Lnode*)malloc(LEN);//由于p为指向结构体类型数据的指针,而malloc带回的是不指向任何类型数据的指针(void*),所以加了struct Lnode*将malloc返回的指针强制转换为指向结构体类型数据的指针,malloc用于开辟一个长度为LEN的连续内存区,每次循环开辟一个新结点使p指向它
if(i==0)
head=q=p;
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
c=p->next;
p->next=c->next;//删除结点
a[j]=c->num;//把删除的结点的序号记录在数组a内
j++;
m=c->key;
p=p->next;//p后移一位
}
if(m%2==0)//出圈密码为偶数时
p=p->next;
else ;
a[j]=p->num;
p=p->next;
a[j+1]=p->num;
for(j=0;j
}
else
printf("输入人数超过最大允许人数,请重新输入:");
}
}