[转]用单向循环链表解决约瑟夫环问题
2010-06-21 22:16
381 查看
设有n个人围坐一圈,现以某个人开始报数,数到m的人出列,接着从出列的下一个人开始重新报数,数到m的人又出列,如此下去,直到所有人都出列为止.按出列顺序输出.
这段代码是从网上找来的,在此特别说明!!!!!
C代码
#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个人围坐一圈”。
可选数据结构与算法中的可选方案:队列,栈,线性表,串。队列,栈和串都不大合适。以线性表中的单向循环链表最合适。
这段代码是从网上找来的,在此特别说明!!!!!
C代码
#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();
}
#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个人围坐一圈”。
可选数据结构与算法中的可选方案:队列,栈,线性表,串。队列,栈和串都不大合适。以线性表中的单向循环链表最合适。
相关文章推荐
- 用单向循环链表解决约瑟夫环(Joseph)问题
- 循环链表解决约瑟夫环问题
- C语言单向循环链表解决约瑟夫问题
- 单循环链表解决约瑟夫环问题
- C语言单向循环链表解决约瑟夫问题
- 单循环链表 解决约瑟夫环的问题
- PHP实现单向链表解决约瑟夫环问题
- 约瑟夫环(用单向循环链表解决)
- 循环链表 CircleList的实现并解决约瑟夫环问题
- 循环链表解决约瑟夫环问题
- 用个循环链表解决约瑟夫环问题
- 使用C#循环链表解决约瑟夫环的问题
- PHP实现的基于单向链表解决约瑟夫环问题示例
- 循环链表解决约瑟夫环问题
- 第十课 循环链表,约瑟夫环问题的解决
- 循环链表-约瑟夫环问题
- 用C++实现单向循环链表的解决方法
- c语言数据结构之单向循环链表约瑟夫问题
- 2746 约瑟夫问题(单向循环链表解法)
- 用单向循环链表解决约瑟夫问题