解题思路:

注意事项:

参考代码:

#include<stdio.h>

#include<stdlib.h>

#include<string.h>


typedef struct node

{

    int number;

    struct node *next;

}listnode;


listnode *creatnode(int num);


int main()

{

int n,count=0;

scanf("%d",&n);

listnode *firstnode=creatnode(n);

while(n>1)  //用于链表内节点个数的计算,若只剩1个节点,则跳出循环,输出剩余节点所存值即为答案

{

    for(listnode *i=firstnode;i->next!=NULL;)  //链表节点循环计数,若n>1,则重新进入for循环计数,计数值将接上次值继续计数

    {

        count++;

        if(count==3)  //数到3的节点将被删除

        {

            count=0;  //重新数至3

            listnode *temp=i->next;

            i->next=temp->next;

            free(temp);

            n--;  //每删除1个节点,节点数就少1个

        }

        else  //若计数未至3,更新i;在上边count==3的if判断内,删除节点时,已经更新了i,故不再需要i=i->next表达式

        {

            i=i->next;

        }

    }

}

printf("%d\n",firstnode->next->number);  //此时除头节点外,只剩1个节点,直接输出

return 0;

}


listnode *creatnode(int num)

{

    listnode *head,*middle,*temp;

    head=(listnode *)malloc(sizeof(listnode));

    if(head==NULL)

    {

        perror("malloc");

        exit(0);

    }

    head->next=NULL;

    temp=head;

    for(int i=0;i<num;i++)

    {

        middle=(listnode *)malloc(sizeof(listnode));

        if(middle==NULL)

        {

            perror("malloc");

            exit(0);

        }

        middle->number=i+1;  //第一个节点存1,......,第n个节点存n,便于最后原始编号的输出,直接输出节点所存值即可!

        temp->next=middle;

        temp=middle;

    }

    temp->next=NULL;

    return head;

}


点赞(0)
 

0.0分

0 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论