循环链表实现约瑟夫环
2011-09-13 21:49
477 查看
设计一个带头结点的循环单链表类,实现约瑟夫环问题;
问题描述:设编号为1,2,…,n(n>0)个人按顺时针方向围坐-圈,每人持有一个正整数密码。
开始时任意给出一个报数上限值m从第一个人开始顺时针方向自1起顺序报数。
报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人起重新自1起顺序报数.
如此下去,直到所有人全部出列为止。要求设计一个程序模拟此过程,并给出出列人的编号序列。
测试数据:n=7,7个人的密码依次为3,1,7,2,4,8,4 初始报数上限值m=20
正确的顺序:6,1,4,7,2,3,5
问题描述:设编号为1,2,…,n(n>0)个人按顺时针方向围坐-圈,每人持有一个正整数密码。
开始时任意给出一个报数上限值m从第一个人开始顺时针方向自1起顺序报数。
报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人起重新自1起顺序报数.
如此下去,直到所有人全部出列为止。要求设计一个程序模拟此过程,并给出出列人的编号序列。
测试数据:n=7,7个人的密码依次为3,1,7,2,4,8,4 初始报数上限值m=20
正确的顺序:6,1,4,7,2,3,5
#include <stdio.h> #include <malloc.h> struct llist { int number;//编号 int psw;//密码 struct llist *next; }; typedef struct llist node; typedef node *llink; // llink CreateList(int total) // { // llink newNode; // llink before,firstNode; // int i; // // firstNode = (llink)malloc(sizeof(node)); // if(!firstNode) // return firstNode; // firstNode->number = 1; // printf("请输入第1个人的密码:"); // scanf("%d",&firstNode->psw); // firstNode->next = NULL; // before = firstNode; // // for (i=2;i<=total;i++) // { // newNode = (llink)malloc(sizeof(node)); // if(!newNode) // return NULL; // newNode->number = i; // printf("请输入第%d个人的密码:",i); // scanf("%d",&newNode->psw); // newNode->next = NULL; // before->next = newNode; // newNode = before; // } // newNode->next = firstNode; // return firstNode; // } llink CreateList(int total) { llink newNode; llink before,firstNode; int i; firstNode = before = (llink)malloc(sizeof(node)); if(!before) return before; before->number = 1; printf("请输入第1个人的密码:"); scanf("%d",&before->psw); for (i=2;i<=total;i++) { newNode = (llink)malloc(sizeof(node)); if(!newNode) return NULL; newNode->number = i; printf("请输入第%d个人的密码:",i); scanf("%d",&newNode->psw); before->next = newNode; before = newNode; } before->next = firstNode; return firstNode; } void JosePush(llink L) { int i,m; llink p,q,s; p = L; printf("请输入初始密码:"); scanf("%d",&m); printf("出列顺序为:"); while(p->next != p) { for (i=1;i<m;i++) { q = p; p = p->next; } printf("%5d",p->number); m = p->psw; s = p; q->next = p->next; p = p->next; free(s); } printf("%5d",p->number); printf("\n"); } void main() { llink L; int n; printf("实验人数:"); scanf("%d",&n); L = CreateList(n); JosePush(L); }
相关文章推荐
- java循环链表实现约瑟夫环问题
- 约瑟夫环,杀人游戏(静态循环链表实现)
- 循环链表实现约瑟夫环(动态数组实现)
- 约瑟夫环,100个人围成圈圈,逢3退出,求最后剩下的人的编号(分别用数组和双向循环链表实现)
- 约瑟夫环,杀人游戏(静态循环链表实现)
- 循环链表实现 约瑟夫环
- 用循环链表实现约瑟夫环问题
- 循环链表实现Joseph环(约瑟夫环)猴子选大王类似问题
- 循环链表实现约瑟夫环
- Java循环链表实现约瑟夫环
- 约瑟夫环_循环链表实现
- 数据结构练习题 约瑟夫环—用循环链表实现
- Java循环链表实现约瑟夫环
- 约瑟夫环(循环链表实现)
- 基于循环链表的约瑟夫环实现
- 线性表_循环链表(增减删查 + 约瑟夫环问题 代码实现 )
- Java循环链表实现约瑟夫环(搬运)
- 循环链表实现约瑟夫环
- 循环链表实现约瑟夫环
- 约瑟夫环 java循环链表实现