C语言描述怎么用循环队列实现猴子选大王
利用循环队列,实现猴子选大王问题,N只猴子,每次数M下轮到的猴子出队,最后剩下的那只猴子为大王
程序代码:
#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; }