解题思路:用了循环链表,没有删除节点的操作,做的都是跳过节点的工作

注意事项: 删注释啊直接复制粘贴好像会编译错误

参考代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct Node
{
    int no;//节点编号
    int tag;//节点的当前报数
    int flag;//节点是否被排除
    struct Node *next;
}cycnod;

int main()
{
    //建立头节点
    cycnod *head,*q;
    head=(cycnod*)malloc(sizeof(cycnod));
    head->no=1;
    head->tag=0;
    head->flag=0;
    head->next=NULL;
    q=head;
    //建立完成

    int i,n,cnt=1;//cnt用来记录当前节点所报数字,初始化为1

    //建立循环链表
    scanf("%d",&n);
    for(i=2;i<=n;i++)//顺序编号,tag flag等设初值为0
    {
        cycnod *p=(cycnod*)malloc(sizeof(cycnod));
      p->no=i;
      p->tag=0;
      p->flag=0;
        p->next=NULL;
        q->next=p;
        q=q->next;
    }
    q->next=head;
    //建立完毕

    //模拟报数
    q=head;
    while(n>1)
    {
        if(q->tag!=3)//当前节点没有报过3,参与报数
        {
            q->tag=cnt;//当前节点报数
            cnt++;
            if(cnt>3)//节点报数完成后cnt加1,若cnt大于3则重置为1
            {
                cnt=1;
            }
        }
        else//当前节点报过3,则不参与报数
        {
            if(q->flag==0)//flag为0说明当前节点第一次报数3,将其排除,节点总数减1
            {
                q->flag=1;
                n--;//节点总数减1
            }
            //flag为1说明该节点已经被排除了不用管它
        }
        q=q->next;//进入下一个节点
    }
    //模拟完毕

    q=head;
    while(q->flag==1)//从头开始找flag不为1的,即最后剩下的那个节点
    {
        q=q->next;
    }
    printf("%d\n",q->no);//输出该节点初始编号
    return 0;
}
点赞(0)
 

0.0分

0 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论