一个关于出列游戏编程的问题!敬请指点!
/*本程序简介: * 编号为1~5的5个人围坐一圈,每人持有各自的密码(一个正整数),开始时选取一号的密码从一号开始循环报数(1~M),报到M(M为这个密码的值)的人退出,将退出人的密码作为新的M值,下一个没退出的人继续从一开始报数,如此下去,直到所有人全部退出游戏,求出列顺序!
*例如:如果1~5号密码依次为2,3,5,1,3,则正确出列顺序依次为2,5,4,1,3
* 如果换了别的密码也应该会根据这个规律得出正确的出队顺序
*即程序正确执行结果应该为: 但为什么打印出来为:
* 编号:1 2 3 4 5 编号:1 2 3 4 5
* 密码:2 3 5 1 3 密码:2 3 5 1 3
* 标志:1 1 1 1 1 标志:1 1 1 1 1
* 2 3 2 3
* 5 3 5 3
* 4 1 4 1
* 1 2 4 1
* 3 5 4 1
*问题:为什么打印出来的出列顺序为2,5,4,4,4,明显错了。
* 找了半天问题没找出来,是设计思路有问题还是编程上的疏漏?求解!敬请指点!
* 如果修改后这组值可以了,可以试试别的密码,看行不行
* 我怎么修改都不能使程序适用于任意组密码,求解!
*/
#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[]={2,3,5,1,3};
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
{
p=p->next;//下一个人
if(p->flag==1)//没退出的人报数,退出的人不报数
i++;
}
}while(1);
return 0;
}
[ 本帖最后由 小小战士 于 2012-11-10 22:02 编辑 ]