浏览 3940 次
锁定老帖子 主题:用单向循环链表解决约瑟夫环问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-12-16
最后修改:2008-12-16
设有n个人围坐一圈,现以某个人开始报数,数到m的人出列,接着从出列的下一个人开始重新报数,数到m的人又出列,如此下去,直到所有人都出列为止.按出列顺序输出. 这段代码是从网上找来的,在此特别说明!!!!! #include "stdlib.h" struct ele { int no; struct ele *link; } main() { struct ele *h, *u, *p; int n, m, i; printf("Please input n&m:\n"); scanf("%d%d", &n, &m);/*输入n和m*/ h = u = (struct ele *) malloc(sizeof(struct ele));/*形成首表元*/ h->no = 1; for (i = 2; i <= n; i++)/*形成其余的n-1个表元*/ { u->link = (struct ele *) malloc(sizeof(struct ele)); u = u->link; u->no = i;/*第i个表元置编号i*/ } u->link = h;/*末表元后继首表元,形成环*/ puts( "\nThe numbers of who will quit the cycle in turn are:"); while (n) { for (i = 1; i < m; i++) /*掠过m-1个表元*/ u = u->link; p = u->link;/*p指向第m个表元*/ u->link = p->link;/*第m个表元从环中脱钩*/ printf("%4d", p->no); free(p);/*释放第m个表元占用的空间*/ n--; } printf("\n\n Press any key to quit...\n"); getchar(); } 当碰到问题,首先考虑这个问题是怎样的类型,第二从解决列表中选择中最合适的方案.以这个问题为例:问题中是一个循环性质,关键点“有n个人围坐一圈”。可选数据结构与算法中的可选方案:队列,栈,线性表,串。队列,栈和串都不大合适。以线性表中的单向循环链表最合适。
回想当时面试时,我使用的是数据组,面试者问我,为什么不使用链表?数组是可以解决问题,但相对麻烦些。思考一下,面试时,要多才考虑一下,这个考题背后的东西,最近一段在看《编程之美》,里面的思路很好,如果能达到书上描述的那样,碰到问题都抽丝剥茧,把能把复杂问题抽象化,简单化,那么编程的水平就能更上一层楼了。 在下一篇中,我将写一下《编程之美》中关于数组右转的问题。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |