C语言描述怎么用循环队列实现猴子选大王

 我来答
物理公司的
2016-12-15 · TA获得超过5698个赞
知道大有可为答主
回答量:6105
采纳率:86%
帮助的人:1400万
展开全部
#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;
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式