欢迎来到61范文网!
您现在的位置:首页 > 综合范文

约瑟夫环实验报告

时间:2024-04-23 11:19:01 综合范文

  一、需求分析

  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. 用户交互:程序以用户和计算机的对话方式执行,即在计算机终端上显示提示信息之后,由用户在键盘上输入演示程序中需要输入的数据,运算结果显示在其后。