| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 12005 人关注过本帖
标题:C语言描述怎么用循环队列实现猴子选大王
只看楼主 加入收藏
海中小渔
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2016-4-24
结帖率:0
收藏
已结贴  问题点数:10 回复次数:2 
C语言描述怎么用循环队列实现猴子选大王
利用循环队列,实现猴子选大王问题,N只猴子,每次数M下轮到的猴子出队,最后剩下的那只猴子为大王
搜索更多相关主题的帖子: C语言 大王 
2016-04-24 13:04
will丶
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:117
专家分:443
注 册:2015-10-19
收藏
得分:5 
程序代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct node//定义链表节点类型
{
    int data;
    struct node *next;
}linklist;
int main()
{
    int i, n, k, m, total;
    linklist *head, *p, *s, *q;
    printf("请输入猴子总数:");// 读入问题条件 
    scanf("%d", &n);
    printf("请输入开始计数的猴子数:");
    scanf("%d", &k);
    printf("请输入数:");
    scanf("%d", &m);
    head = (linklist*)malloc(sizeof(linklist));   // 创建循环链表,头节点也存信息 
    p = head;
    p->data = 1;
    p->next = p;
      for (i = 2; i <= n; i++) //初始化循环链表 
    {
        s = (linklist*)malloc(sizeof(linklist));
        s->data = i;
        s->next = p->next;
        p->next = s;
        p = p->next;
    }
    p = head;
    for (i = 1; i < k; i++)   //找到第 k 个节点 
    {
        p = p->next;
    }
    total = n;         // 保存节点总数 
    printf("\n失序:");
    q = head;
    while (total != 1)    // 只剩一个节点时停止循环 
    {
        for (i = 1; i < m; i++)     // 报数过程,p指向要删除的节点 
        {
            p = p->next;
        }
        printf("[%d] ", p->data);   // 打印要删除的节点序号 
        while (q->next != p)    // q 指向 p 节点的前驱
        {
            q = q->next;
        }
        q->next = p->next;   // 删除 p 节点 
        s = p;        // 保存被删除节点指针
        p = p->next;  // p 指向被删除节点的后继 
        free(s);     // 释放被删除的节点 
        total--;     // 节点个数减一 
    }
    printf("\n\n 猴子王是第  [%d] 只\n\n", p->data);// 打印最后剩下的节点序号
    free(p);
    system("pause");
    return 0;
}

腾空类星陨,遥望若花生。
2016-04-24 17:28
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:5 
回复 楼主 海中小渔
#include<stdio.h>
int main()
{
    int s[100],i,k,m,n,e;
    int *p;
    p=s;
    printf("输入n=");
    scanf("%d",&n);
    printf("输入m=");
    scanf("%d",&m);
    for(i=0;i<n;i++)
    *(p+i)=i+1;
    i=0;
    k=0;
    e=0;
    while(e<n-1)
    {
        if(*(p+i)!=0) k++;
        if(k==m)
        {
            *(p+i)=0;
            k=0;
            e++;
        }
        i++;
        if(i==n) i=0;
        
    }
    while(*p==0) p++;
    printf("%d",*p);
    return 0;
   
}
不知道是不是你想要实现的。楼上写更好,就是不知道你能不能看懂。

[此贴子已经被作者于2016-4-25 00:20编辑过]

2016-04-25 00:17
快速回复:C语言描述怎么用循环队列实现猴子选大王
数据加载中...
 
   



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

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