1、问题描述:
? ? ? ?有n个人围坐一圈,现从第s个人开始报数,数到m的人出列,接着从出列的下一个人开始重新报数,数到m的人又出列.如此下去,直到所有人都出列为止.试设计确定他们出列次序序列的程序
2、算法步骤:
????????1、确定存储结构:n个人围成一圈,故使用循环单链表来存储序号
????????2、算法实现:
该问题共n、m、s三个未知量,所以可以通过三个循环来实现,第一个循环用来确定最开始第一个报数的人的指针位置(单链表的头节点指针指向第s个人),第二个循环用来控制输出序号的次数(共n次),第三个循环用来数数(每一次循环使指针移动m次)
3、实现源代码:
- # 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;
- }
到此这篇关于C语言版约瑟夫问题算法实现的文章就介绍到这了,更多相关C语言约瑟夫问题内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!