此程序成功告破,感谢各位的大力相助!辛苦辛苦!感激不尽!
下面与大家分享一下!
/*本程序简介:
*
编号为1~x的x个人围坐一圈,每人持有各自的密码(一个正整数),开始时选取一号的密码从一号开始循环报数(1~M),
*
报到M(M为这个密码的值)的人退出,将退出人的密码作为新的M值,下一个没退出的人继续从一开始报数,如此下去,
*
直到所有人全部退出游戏,求出列顺序(按编号排列)!
*测试数据:
*
如果1~3号密码依次为1,2,3,则出队顺序按编号排列依次为1,2,3;
*
如果1~4号密码依次为2,3,5,1,则出队顺序按编号排列依次为2,1,4,3;
*
如果1~5号密码依次为3,6,2,4,5,则出队顺序按编号排列依次为3,5,2,1,4;
*
如果1~6号密码依次为2,4,4,2,5,3,则出队顺序按编号排列依次为2,6,4,1,5,3;
*
如果1~7号密码依次为4,2,3,3,6,6,5,则出队顺序按编号排列依次为4,7,6,2,5,3,1;
*
如果1~8号密码依次为3,2,5,4,1,1,4,6,则出队顺序按编号排列依次为3,8,7,5,6,1,2,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[]={3,2,5,4,1,1,4,6};//密码,多少个密码就有多少个人参加游戏,此处密码可随意更改增删
//如果改密码或者增删人数,只要修改这里即可
node *head=NULL;
node *p=NULL;
int x;
x=sizeof(str)/sizeof(str[0]);//x为参加游戏的人数
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号开始循环报数
printf("出队顺序:\n");
while(1)
{
if(i==e)//如果报数M
{
printf("编号:%-3d 对应密码:%-3d\n",p->num,p->mima);//打印退出人的编号和密码
p->flag=0;//标志为1表示没退出,标志为0表示退出
i=1;//i从1开始
e=p->mima;//密码为退出人的密码
x--;//退出
if(x==0)//如果所有人都退出,结束游戏
break;//跳出循环
while(p->next->flag==0)//找到下一个没有退出的人
p=p->next;
p=p->next;//p指向下一个没有退出的人
}
else
{
while (p->next->flag==0)//找到下一个没有退出的人
p=p->next;
p=p->next;//p指向下一个没有退出的人
i++;//报数加一
}
}
return 0;//程序结束
}
程序执行结果如下:
_________________________________________________________________________________
编号:1 2 3
|
编号:1 2 3 4
|
编号:1 2 3 4 5
|
密码:1 2 3
|
密码:2 3 5 1
|
密码:3 6 2 4 5
|
标志:1 1 1
|
标志:1 1 1 1
|
标志:1 1 1 1 1
|
出队顺序:
|
出队顺序:
|
出队顺序:
|
编号:1
对应密码:1
|
编号:2
对应密码:3
|
编号:3
对应密码:2
|
编号:2
对应密码:2
|
编号:1
对应密码:2
|
编号:5
对应密码:5
|
编号:3
对应密码:3
|
编号:4
对应密码:1
|
编号:2
对应密码:6
|
|
编号:3
对应密码:5
|
编号:1
对应密码:3
|
|
|
编号:4
对应密码:4
|
_________________________|____________________________|__________________________|
编号:1 2 3 4 5 6
|
编号:1 2 3 4 5 6 7
|
编号:1 2 3 4 5 6 7 8
|
密码:2 4 4 2 5 3
|
密码:4 2 3 3 6 6 5
|
密码:3 2 5 4 1 1 4 6
|
标志:1 1 1 1 1 1
|
标志:1 1 1 1 1 1 1
|
标志:1 1 1 1 1 1 1 1
|
出队顺序:
|
出队顺序:
|
出队顺序:
|
编号:2
对应密码:4
|
编号:4
对应密码:3
|
编号:3
对应密码:5
|
编号:6
对应密码:3
|
编号:7
对应密码:5
|
编号:8
对应密码:6
|
编号:4
对应密码:2
|
编号:6
对应密码:6
|
编号:7
对应密码:4
|
编号:1
对应密码:2
|
编号:2
对应密码:2
|
编号:5
对应密码:1
|
编号:5
对应密码:5
|
编号:5
对应密码:6
|
编号:6
对应密码:1
|
编号:3
对应密码:4
|
编号:3
对应密码:3
|
编号:1
对应密码:3
|
|
编号:1
对应密码:4
|
编号:2
对应密码:2
|
|
|
编号:4
对应密码:4
|
_________________________|____________________________|__________________________|
[
本帖最后由 小小战士 于 2012-11-11 02:07 编辑 ]