| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 759 人关注过本帖, 1 人收藏
标题:一个关于出列游戏编程的问题!敬请指点!
只看楼主 加入收藏
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
结帖率:93.75%
收藏(1)
已结贴  问题点数:5 回复次数:15 
一个关于出列游戏编程的问题!敬请指点!
/*本程序简介:
*   编号为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
w527705090
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:11
帖 子:441
专家分:1882
注 册:2011-6-28
收藏
得分:0 
帮不了你。。。水平不够。。。

有心者,千方百计;无心者,千难万难。
2012-11-10 17:30
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
收藏
得分:0 
回复 2楼 w527705090
还是谢谢你!

小小战士,战士中的战斗机!
2012-11-10 18:46
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
既然是循环链表,何必设一个flag,直接删掉这个节点就行了,多此一举啊!


[fly]存在即是合理[/fly]
2012-11-10 19:05
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
收藏
得分:0 
以下是引用azzbcc在2012-11-10 19:05:48的发言:

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

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

小小战士,战士中的战斗机!
2012-11-10 19:24
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
程序代码:
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++;
}


[fly]存在即是合理[/fly]
2012-11-10 19:28
遗矢的老人
Rank: 9Rank: 9Rank: 9
来 自:成都
等 级:蜘蛛侠
威 望:7
帖 子:325
专家分:1131
注 册:2012-7-20
收藏
得分:0 
这是一个故事啊,好像是一个部队没了粮食怎么的,最后只能一个人活着出去,所有人就同意了以上的这个“规则”,所有人围成一个去圈(其实是个循环链表),开始时在随机取一个数字,从某一位士兵开始报数,直到报到那个号的人就自杀,这样最后只剩一个就是胜利者
2012-11-10 19:37
小小战士
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
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
我先调着,看大神们怎么说。。。


[fly]存在即是合理[/fly]
2012-11-10 21:27
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:3 
只改了这一部分,还有错再追问吧,不多说,自己理解!
程序代码:
    if(x==0)//如果所有人都退出,结束游戏。
        break;
    while (0 == p->next->flag)
        p=p->next;
    p=p->next;
}
else
{
    while (0 == p->next->flag)
        p=p->next;
    p=p->next;
    i++;
}


[fly]存在即是合理[/fly]
2012-11-10 21:42
快速回复:一个关于出列游戏编程的问题!敬请指点!
数据加载中...
 
   



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

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