永发信息网

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

答案:1  悬赏:80  手机版
解决时间 2021-03-24 23:26
  • 提问者网友:心牵心
  • 2021-03-24 04:04
C语言描述怎么用循环队列实现猴子选大王
最佳答案
  • 五星知识达人网友:人類模型
  • 2021-03-24 05:20
#include 
#include 
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("
失序:");
    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("

 猴子王是第  [%d] 只

", p->data);// 打印最后剩下的节点序号
    free(p);
    system("pause");
    return 0;
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯