| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 759 人关注过本帖, 1 人收藏
标题:一个关于出列游戏编程的问题!敬请指点!
取消只看楼主 加入收藏
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
结帖率:93.75%
收藏(1)
已结贴  问题点数:5 回复次数:6 
一个关于出列游戏编程的问题!敬请指点!
/*本程序简介:
*   编号为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 编辑 ]
搜索更多相关主题的帖子: 密码 正整数 
2012-11-09 12:53
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
收藏
得分:0 
回复 2楼 w527705090
还是谢谢你!

小小战士,战士中的战斗机!
2012-11-10 18:46
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
收藏
得分:0 
以下是引用azzbcc在2012-11-10 19:05:48的发言:

既然是循环链表,何必设一个flag,直接删掉这个节点就行了,多此一举啊!

其实只是实现方法不同而已,一种是退出时删除该节点直到链表为空,另一种是退出时标志置位直到所有节点标志都置位,两种都可以!为什么这个程序会有错误呢》求指点!

小小战士,战士中的战斗机!
2012-11-10 19:24
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
收藏
得分:0 
以下是引用azzbcc在2012-11-10 19:28:37的发言:

else
{
    if(p->flag==1)
        i++;//问题在这,当密码是4,i为3,时,此语句执行后i为4
    p=p->next;//然后指向下一节点,那么这个节点flag是1么?
}
////////////////////////////
else
{
    p=p->next;//这样就行了,先知道下一节点,再判断
    if(p->flag==1)
        i++;
}

这样改是对了,但每个人的密码换了,不再是自己的编号,再根据这种游戏规则得出来的结果就又不对了
如int str[]={2,3,5,1,3};
这样应该打印出来:
编号:1 2 3 4 5
密码:2 3 5 1 3
标志:1 1 1 1 1
2 3
5 3
4 1
1 2
3 5
实际打印出来却是:
编号:1 2 3 4 5
密码:2 3 5 1 3
标志:1 1 1 1 1
2 3
5 3
4 1
4 1
4 1
要那种适用于任何密码的,开始时用第一个人的密码从第一个人开始报数,我的程序应该怎样改?我都晕了!

小小战士,战士中的战斗机!
2012-11-10 20:13
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
收藏
得分:0 
回复 7楼 遗矢的老人
生活中很多故事或者情景都可以用编程来说明问题,这就是思想。为什么人类能统治世界?就是因为人类会思考问题,会研究问题。牛顿为什么会成为科学家?就是因为被苹果砸的!被苹果砸了又怎样?可贵的就是这不是一个一般的苹果,是乔布斯的苹果,他没有吃掉这个苹果,而是从这个苹果中得出了伟大的万有引力定律,一举成名,一发不可收拾!给我个杠杆,我可以翘起整个地球,这可不是吹的!

[ 本帖最后由 小小战士 于 2012-11-10 21:50 编辑 ]

小小战士,战士中的战斗机!
2012-11-10 21:48
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
收藏
得分:0 
此程序成功告破,感谢各位的大力相助!辛苦辛苦!感激不尽!
下面与大家分享一下!

/*本程序简介:
 *    编号为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 编辑 ]

小小战士,战士中的战斗机!
2012-11-11 01:06
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
收藏
得分:0 
同喜同喜

小小战士,战士中的战斗机!
2012-11-22 12:25
快速回复:一个关于出列游戏编程的问题!敬请指点!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013318 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved