解题思路:
注意事项:
参考代码:
#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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复