解题思路:
由下面的图可以看出当p往下走时count必须从一开始否则会超前一位
注意事项:
参考代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct Link_list
{
int data;
struct Link_list* next ;
}linklist;
//生成节点并将这n个数编号
linklist * find(linklist *head,int n)
{
struct Link_list *p,*q;
p=head =(linklist *)malloc(sizeof(linklist ));
for (int i=1;i<=n;i++)
{
q=(linklist *)malloc(sizeof (linklist ));//给辅助变量分配空间
q->data=i; //编号
p->next =q ; //将这个新生成的节点连接起来
p=q;
}
p->next =head->next; //让为节点指向头结点的下一个
return head; //返回头结点 也相当于返回这个链表
}
//找到留下来的那位
void Choose (linklist *head,int n)
{
int count = 1;
linklist*q,*p=(linklist*)malloc (sizeof(linklist));
p=head;
while (n)
{
if (count !=3)//如果count!=3就往下走
{
p=p->next;//往下走
count ++;
}
else
{
q=(linklist*)malloc(sizeof(linklist));
q=p->next;//用一个辅助变量来存储p的下一个避免找不到下一个节点
count =1;
p->next=q->next;//指向下一个的下一个
if(n ==1)//当只剩下最后一个元素时输出它的数据域
printf ("%d",p->data);
n --;
free(q);
}
}
}
int main()
{
struct Link_list *head=NULL;
int n;
printf ("请输入有几个人:\n");
scanf ("%d",&n);
head=find(head,n);
Choose(head,n);
return 0;
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复