循环链表 猴子选大王

/*
    循环链表
    猴子选大王
*/
#include <stdio.h>
#include <stdlib.h>

typedef struct monkey {
    int num;
    struct monkey * next;
} monkey_t;
//head指向第一个节点,tail指向最后一个节点
monkey_t *head = NULL, *tail = NULL;

void create(int nn) {   //猴子的个数
    int i;
    monkey_t *p = NULL, *q = NULL;  //p指向一个新分配的节点,q指向当前最后一个节点

    p = (monkey_t *)malloc(sizeof (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 x = 0, res;
    monkey_t *p = NULL, *q = NULL;  //p指向当前要判断的节点,q跟随在p的后面,比p慢一拍

    q = tail;
    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 n, m;

    printf("Please input the number of monkey.\n");
    scanf("%d", &n);
    printf("Please input the number of interval m.\n");
    scanf("%d", &m);

    create(n);
    printf("monkey king is No.%d\n", select(m));
    return 0;
}




你可能感兴趣的:(循环链表 猴子选大王)