时间:2022-06-24 09:00:08 | 栏目:C代码 | 点击:次
有n个人围坐一圈,现从第s个人开始报数,数到m的人出列,接着从出列的下一个人开始重新报数,数到m的人又出列.如此下去,直到所有人都出列为止.试设计确定他们出列次序序列的程序
1、确定存储结构:n个人围成一圈,故使用循环单链表来存储序号
2、算法实现:
该问题共n、m、s三个未知量,所以可以通过三个循环来实现,第一个循环用来确定最开始第一个报数的人的指针位置(单链表的头节点指针指向第s个人),第二个循环用来控制输出序号的次数(共n次),第三个循环用来数数(每一次循环使指针移动m次)
# include <stdio.h> # include <malloc.h> typedef struct Node { int number; struct Node * pNext; }NODE, *PNODE; PNODE creat_list(int n); int main (void) { int n,m,s; printf("约瑟夫环问题:\n"); printf("设有n(编号为“0 1 2 3 .....n-1 n”)个人围坐一圈,现从第s个人开始报数,数到m的人出列,\n求最后的出列顺序。\n"); printf("请设置n, s, m :\n"); printf("n = "); scanf("%d", &n); printf("s = "); scanf("%d", &s); printf("m = "); scanf("%d", &m); //问题引导提示代码段 PNODE pHead = NULL; pHead = creat_list(n); pHead->number = 1; //创建单链表 PNODE p = pHead; //定义头指针 int i,j,k; //定义循环参数 for(j = 1; j < s; j++) { p = p->pNext; } //第一个循环确定第一个报数的人在循环单链表中的位置 for(i = 1; i <= n; i++) //外部循环代表遍历到最后一个所需要的循环次数 { for(k = 1; k < m; ) //内部循环代表遍历出列的人 { if(p -> pNext -> number != 0) { p = p -> pNext; k++; } else { p = p -> pNext; } } printf("%d ",p -> number); p -> number = 0; do { p = p -> pNext; }while(p -> number == 0); } printf("\n"); return 0; } PNODE creat_list(int n) //单链表的创建 { PNODE pHead = (PNODE)malloc(sizeof(NODE)); PNODE pTail = pHead; int i; for(i = 2; i <= n; i++) { PNODE pNew = (PNODE)malloc(sizeof(NODE)); pNew->number = i; pTail->pNext = pNew; pNew->pNext = pHead; pTail = pNew; } return pHead; }