题目:
n个人围成一圈(编号依次为:0,1,2...n-1),从第一个人开始报数,1,2,……数到m者出列,再从下一个开始重新报数,数到m者再出列……。 下面的程序中,用不带附加表头的循环单链表来模拟约瑟夫环,且只设指向最后一个元素的尾指针。算法的思想是,第一步,先将每个人的编号追加到一个通过尾指针标识的循环单链表中。第二步,从首元素开始计数,数到m的取下这个元素,并追加到另一个用尾指针标识的循环单链表中……直到全部元素都取下。第三步,输出最后建立的循环单链表。请编写函数,完成第三步工作:输出通过尾指针标识的循环单链的全部元素。
void show(struct Node *r);//show data
其中r
是指针,指向无附加表头的循环单链表的最后一个结点
#include <stdio.h> #include <stdlib.h> struct Node{ int data; struct Node *next; }; void show(struct Node *r);//show data 需要完成的函数 int main(){ int n,m;scanf("%d%d",&n,&m); struct Node *p=fun(n,m));//创建按出列顺序排列的循环单链表,返回指向尾元素的指针:测试程序提供 show(p);//调用显示函数显示数据 该函数需要编程完成 return 0; } /* 请在这里填写答案 */
9 4
[]
[3,7,2,8,5,4,6,1,0]
我好气!
题目明明只说了 输出 而且分析程序来看明明show函数也只会运行一次 为什么就段错误啊!
明明只是个简简单单的循环链表输出 非要让我们猜题意
还好pta现在有自定义样例测试了...不然我一辈子都de不出来bug
原因是这样的 我的代码一直段错误 直到我尝试只输出一个‘?’却发现他给我输出了两个问号
震惊猫猫.jpg
输出r -> data段错误 说明r可能是空的
所以...我用了这样一个神奇的东西
void show(struct Node *r) { if (r) { printf("?"); } else { printf("!"); } }
“输出结果:!?”
!果然!
第一次的程序 循环链表是个空的 完全是空的 第二次再运行的时候才会有链表 如果直接输出的话才能正常运行
浪费了我一个小时的奇怪的题目增加了.jpg
void show(struct Node *r) { if (r) { struct Node *p; p = r -> next; int fir = 0; printf("["); while(p != r -> next || fir == 0) { if (!fir) { fir = 1; printf("%d",p -> data); } else { printf(",%d", p -> data); } p = p -> next; } printf("]"); } else { printf("[]\n"); } }
好气呀好气呀.png
原文:https://www.cnblogs.com/moonjumper/p/13884176.html