解题思路:

看完题目,嗯,一个圈子,大家轮流报数退出,直到剩下一个人为止。

这不就是一个循环链表嘛!!在创建链表的时候数据域里存放他们的序号,指针域存放他们的下一个序号,链表的尾节点指向链表的头节点,就是题目说的那个小圈圈啦

然后我们设置一个计数器,当报到计数器设定的数的时候,就把那个链表节点释放掉

注意事项:

注意链表的插入方式,用头插法和尾插法创建的链表的遍历顺序会不一样哦

参考代码:

#include<stdio.h>
#include<stdlib.h>
typedef struct Node{
    int aa;                       //数据域
    struct Node *next;            //指针域
}LNode, *PNode;

//采用尾插法,保证循环圈的顺序是从小到大 
PNode ChaRu(LNode *h1, int n)
{
    LNode *p1;
    p1 = (LNode*)malloc(sizeof(LNode));
    p1->next = h1->next;
    h1->next = p1;
    p1->aa = n;
    return p1;            //更新p指针位置
}

int BaoShu(LNode *h2, int m)
{
    int count = 1, xx;                     //count是计数器,xx用来保存最后剩下的那一个人的序号
    LNode *p2 = h2->next, *del = NULL;
//删除报数的链表节点并一直报下去,直到只剩一个元素 
    while (p2->next != p2){
        //把m-1节点与m+1节点连接起来,删除m节点,因为单向循环链表无法找到前驱结点,故只能在m-1节点动手
        if (count == m - 1){
            del = p2->next;
            p2->next = del->next;
            p2 = del->next;
            free(del);
            count = 1;
            continue;
        }
        p2 = p2->next;
        count++;
    }
    xx = p2->aa;
    free(p2);
    //释放掉申请的内存,防止内存泄漏(当存在内存泄漏的情况程序可能会终止运行)
    return xx;
}

int main(void)
{
    int nn, mm, i;
    LNode *h, *p;

    while (scanf("%d%d", &nn, &mm) == 2){
        h = (PNode)malloc(sizeof(LNode));
        p = h;
        h->next = h;
        h->aa = nn;
    //创建循环圈子并对圈子中的元素赋值 
        for (i = 1; i < nn; i++){
            p = ChaRu(p, i);                //更新p指针的位置
        }
        printf("%d\n", BaoShu(h, mm));
    }
    return 0;
}


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论