猴子选大王

本文介绍了一种基于链表实现的猴子大王选举算法,通过循环链表模拟猴子围成一圈的游戏过程,每次数到指定数字的猴子将被淘汰,直至选出最后一只猴子作为大王。文章详细展示了算法的实现步骤,包括链表的创建、猴子的淘汰过程及最终结果的输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//一堆猴子都有编号,编号是1,2,3 …m,这群猴子(m个)按照1-m的顺序围坐一圈,从第f开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中剩下最后一只猴子,则该猴子为大王。


#include <stdio.h>
#include <stdlib.h>
 
typedef struct monkey {
    int num;
    struct monkey * next;
} monkey_t;

monkey_t *head = NULL, *tail = NULL;//head指向第一个节点,tail指向最后一个节点
 
void create(int nn) {   //猴子的个数
    int i;
    monkey_t *p = NULL, *q = NULL;  //定义两个结构体指针p和q,p指向一个新分配的节点,q指向当前最后一个节点
    
    p = (monkey_t *)malloc(sizeof (monkey_t));//分配空间   sizeof(monkey_t)计算monkey_t所需要分配的空间大小
    p->num = 1;
    p->next = NULL;
    head = p;
    q = p;
    for (i = 2; i <= nn; i++) {
        p = (monkey_t *)malloc(sizeof (monkey_t));
        p->num = i;
        p->next = NULL;
        q->next = p;
        q = p;
    }
    tail = q;
    tail->next = head;  //形成闭环,建立循环链表
}
 
int select(int mm,int first) {
    int x = 0, res;
    monkey_t *p = NULL, *q = NULL;  //p指向当前要判断的节点,q跟随在p的后面,比p慢一拍
     q = tail;
     while(first!=1) {
         q=q->next;
         first--;    
     }
     
    do {
        p = q->next; //定位p   
        x++;
        if (x % mm == 0) {
           // printf("The deleted monkey's number is No.%d\n", p->num);
            q->next = p->next;
            free(p);
            //p = NULL;
        } else {
            q = p;  //q跟进一步
        }
    } while (q != q->next); //循环直到只剩下一个节点
    //head = q;
    res = q->num;
    free(q);
    return res;
}
 
int main() {
    int m, n,f;
 
    printf("请输入一共有多少个猴子 \n");
    scanf("%d", &m);
    printf("输入一个数,数到这个数的猴子就要离开此圈 \n");
    scanf("%d", &n);
    printf("请输入从第几个猴子开始 \n");
    scanf("%d", &f);
    if(n==1&f==1){
    system("cls");
    printf("\n ☆ 猴子大王是 %d 号 ☆\n", m);  
    return 0;
    }
    else{ 
    create(m);
    system("cls");
    printf("\n ☆ 猴子大王是 %d 号 ☆\n ", select(n,f));
    return 0;
    } 
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值