一个关于出列游戏编程的问题!敬请指点!
程序代码:/*本程序简介:
* 编号为1~5的5个人围坐一圈,每人持有的密码为自己的编号,从一号开始循环报数(1~M),报到M的人退出,将他的密码作为新的M值,下一个没退出的人继续从一报数,如此下去,直到所有人全部退出游戏,求出列顺序!
*正确解是1,2,4,3,5
*问题:为什么打印出了1,2,4,1,2
* 找了半天问题没找出来,是设计思路有问题还是编程上的疏漏?在线求解!敬请指点!
*/
#include<stdio.h>
#include<malloc.h>
typedef struct node
{
int flag;
int num;
int mima;
struct node *next;
}node;
//创建循环单向链表
node *create_list(node *head,int str[],int x)
{
int i;
node *p,*q;
head=(node *)malloc(sizeof(node));
for(i=0;i<x;i++)
{
p=(node *)malloc(sizeof(node));
p->flag=1;
p->num=i+1;
p->mima=str[i];
p->next=NULL;
if(i==0)
{
head=p;
}
else
{
q->next=p;
}
q=p;
}
q->next=head;//循环链表
return head;
}
int main()
{
int str[]={1,2,3,4,5};
node *head=NULL;
node *p=NULL;
int x;
x=sizeof(str)/sizeof(str[0]);
head=create_list(head,str,x);
printf("编号:");
p=head;
do
{
printf("%d ",p->num);
p=p->next;
}while(p!=head);
printf("\n");
printf("密码:");
p=head;
do
{
printf("%d ",p->mima);
p=p->next;
}while(p!=head);
printf("\n");
/*标志为1表示没退出,标志为0表示退出*/
printf("标志:");
p=head;
do
{
printf("%d ",p->flag);
p=p->next;
}while(p!=head);
printf("\n");
/*实现过程如下*/
p=head;
int i=1;
int e=head->mima;//从1号开始循环报数
do
{
if(i==e)//如果报数M
{
printf("%d %d\n",p->num,p->mima);//打印退出人的编号和密码
p->flag=0;//标志置0
i=1;//i从1开始
e=p->mima;//密码为退出人的密码
// printf("e=%d\n",e);
x--;//退出
if(x==0)//如果所有人都退出,结束游戏。
break;
p=p->next;
}
else
{
if(p->flag==1)//没退出的人报数,退出的人不报数
i++;
p=p->next;//下一个人
}
}while(1);
return 0;
}







