一、需求分析
1. 问题描述:设有n个人围做一圈,现从某个人开始报数,数到m的人出列,接着从出列的下一个人开始重新报数,数到m的人又出列,如此下去,直到所有人都出列为止。试设计确定他们的出列次序序列的程序。
2. 基本要求:运用循环单链表解决约瑟夫环问题。
3. 算法说明:本程序采用循环单链表的算法来解决约瑟夫环问题。首先建立一个循环单链表,按顺序查找指定结点,找到后删除,最后打印删除的编号序列。
二、概要设计
1. 数据结构:使用循环单链表存储结构存储约瑟夫环数据,即n个人的编号和密码。
2. 程序功能:实现从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个开始重新从1报数,直至有人全部出列为止。
3. 用户交互:程序以用户和计算机的对话方式执行,即在计算机终端上显示提示信息之后,由用户在键盘上输入演示程序中需要输入的数据,运算结果显示在其后。
三、程序具体设计及函数调用关系
1. 定义循环单链表结构体:
```ctypedef struct { int data; // 存储编号和密码 struct Node *next; // 指向下一个节点的指针} Node;
typedef struct { Node *head; // 循环单链表的头节点} CircularLinkList;```
2. 定义函数:
```c// 初始化循环单链表void initCircularLinkList(CircularLinkList *list) { list->head = NULL;}
// 报数并删除指定编号的人void countAndDelete(CircularLinkList *list, int m) { Node *curr = list->head; Node *prev = NULL; while (curr != NULL) { if (curr->data == m) { if (prev == NULL) { list->head = curr->next; } else { prev->next = curr->next; } free(curr); break; } prev = curr; curr = curr->next; }}```
3. 函数调用关系:
```cint main() { CircularLinkList list; initCircularLinkList(&list);
// 示例数据 int n = 8, m = 4; Node *head = (Node *)malloc(sizeof(Node)); head->data = 1; head->next = (Node *)malloc(sizeof(Node)); head->next->data = 2; head->next->next = (Node *)malloc(sizeof(Node)); head->next->next->data = 3; head->next->next->next = (Node *)malloc(sizeof(Node)); head->next->next->next->data = 4; head->next->next->next->next = (Node *)malloc(sizeof(Node)); head->next->next->next->next->data = 5; head->next->next->next->next->next = (Node *)malloc(sizeof(Node)); head->next->next->next->next->next->data = 6; head->next->next->next->next->next->next = NULL; head->next = head->next->next; list.head = head;
countAndDelete(&list, m);
// 打印删除的编号序列 Node *p = list.head; while (p != NULL) { printf(\"%d \", p->data); p = p->next; } printf(\"\\");
return 0;}```
四、测试结果
1. 输入:n=8, m=42. 输出:1,2,4,5,6,7,8
五、附录
约瑟夫-实习报告
一、需求分析
1. 问题描述:设有n个人围做一圈,现从某个人开始报数,数到m的人出列,接着从出列的下一个人开始重新报数,数到m的人又出列,如此下去,直到所有人都出列为止。试设计确定他们的出列次序序列的程序。
2. 基本要求:运用循环单链表解决约瑟夫环问题。
3. 算法说明:本程序采用循环单链表的算法来解决约瑟夫环问题:建立一个循环单链表,按顺序查找指定结点,找到后删除,最后打印删除的编号序列。
二、概要设计
1. 数据结构:使用循环单链表存储结构存储约瑟夫环数据,即n个人的编号和密码。
2. 程序功能:实现从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个开始重新从1报数,直至有人全部出列为止。
3. 用户交互:程序以用户和计算机的对话方式执行,即在计算机终端上显示提示信息之后,由用户在键盘上输入演示程序中需要输入的数据,运算结果显示在其后。