解题思路:用了循环链表,没有删除节点的操作,做的都是跳过节点的工作
注意事项: 删注释啊直接复制粘贴好像会编译错误
参考代码:
#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 人评分
C语言程序设计教程(第三版)课后习题10.2 (C语言代码)浏览:1153 |
破解简单密码 (C语言代码)浏览:1866 |
C语言训练-求s=a+aa+aaa+aaaa+aa...a的值 (C语言代码)浏览:665 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:615 |
【蟠桃记】 (C语言代码)浏览:711 |
【偶数求和】 (C语言代码)浏览:674 |
C二级辅导-阶乘数列 (C语言代码)浏览:736 |
C语言程序设计教程(第三版)课后习题9.3 (C语言代码)浏览:750 |
输入输出格式练习 (C语言代码)浏览:883 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:501 |