- 1
- 0
- 约3.54千字
- 约 3页
- 2021-11-17 发布于天津
- 举报
《约瑟夫环》实验报告
专业:网络工程 班级
学号 姓名
一、问题描述:
约瑟夫问题的一种描述是: 编号为 1,2,……, n 点的 n 个人按顺时针方向
围坐一个圈,每人持有一个密码。一开始选一个正整数作为报数上限值 m,从第
一个人开始从顺时针方向自 1 开始报数, 报到 m时停止。报到 m的人出列, 将他
的密码作为新的 m值,从他在顺时针方向上的下一个人开始从新从 1 报数,如此
下去,直达所有人出列。
基本要求: 利用单向循环链表存储结构模拟此过程, 按照出列的顺序输出各人的
编号。
测试数据: m的初始值为 20;n=7,7 个人的密码依次是 3,1,7,2,4 ,8,4 ,
首先 m的值为 6 (正确的出列顺序为 6,1,4 ,7,2,3,5 )
二、程序设计的基本思想,原理和算法描述:
采用结构体定义单链表,格式为: struct Lnode
{int number;
int password;
struct Lnode *next;
}Lnode,*p,*q,*head;
其中 number 是人的排列序号, password 是各人所持有的密码值, next 是节点指针。
Lnode 是节点变量, p、q 是节点, head 是头指针。
程序的代码:定义变量 n ,i,m,j
输入人的数量 n
If n=0 或 n30
重新输入 n 值
当 0in 时
建立单链表并且输入各人的密码值 p-password
尾指针指向头指针,形成循环链表
输入初始报数上限值 m
当 1=j=n 时
循环找出报 m 的节点 p
输出报 m 节点的编号 p-number
将 p-password 赋给 m 值
删除此节点
结束
三、源程序及注释:
#includestdio.h
#includestdlib.h
struct Lnode /* 定义链表 */
{int number;
int password;
struct Lnode *next;
}Lnode,*p,*q,*head;
int main(void)
{int n; /*n 个人 */
int i;
int m; /* 初始报数上限值 */
int j;
printf(please enter the number of people n:); /* 输入测试人的数量 */
scanf(%d,n);
loop:if(n=0||n30) /* 检验 n 是否满足要求,如不满足重新输入 n 值 */
{printf(\n n is erorr!\n\n);
printf(please enter t
原创力文档

文档评论(0)