循环链表 猴子选大王

来源:互联网 发布:淘宝达人互动视频教程 编辑:程序博客网 时间:2024/05/17 03:19
/*    循环链表    猴子选大王*/#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;}

0 0