一个关于出列游戏编程的问题!敬请指点!
092_循环出列.zip
(1.54 KB)
程序代码:
/*本程序简介: * 编号为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; }