约瑟夫环
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实习报告
题目 : 实现一个约瑟夫环程序
班级: 05计(1)姓名:学号:
完成日期:2007.10.12
一、需求分析
1.本演示程序中,利用单向循环链表存储结构存储约瑟夫环数据(即n个人的编号和密码)。
2.演示程序以用户和计算机的对话方式执行,即在计算机终端上显示"提示信息"之后,由用户在键盘上输入演示程序中需要输入的数据,运算结果显示在其后。
3.程序执行的命令包括:
1)构造单向循环链表;2)进行数值的输入,并作判断分析;3)约瑟夫算法的实现与结果输出;4)结束。
4.测试数据
m 的初值为20;n=7,7个人的密码依次为:3,1,7,2,4,8,4,(正确的出列顺序为6,1,4,7,2,1,3,5)。
二、概要设计
1.单向循环链表的抽象数据类型定义为:
ADT List{
数据对象:D={ai | ai↔正整数,I=1,2,......,n,n≥0}
数据关系:R1={< ai-1,ai > |,ai-1,ai↔D,I=1,2,......,n}
基本操作:
Init List(&L)
操作结果:构造一个空的线性表L。
List Insert(&L,i,e)
初始条件:线性表L已存在,1≤i≤List Length(L)+1.
操作结果:在L中第i个位置之前插入新的数据元素e,L长度加1。
List Delete(&L,i,&e)
初始条件:线性表L存在非空,1≤i≤List Length(L).
操作结果:删除L的第i个元素,并用e返回其值,L长度减1。
2.程序包含四个模块:
1)主程序模块:
void main( )
{
初始化;
for(; ;)
{}
while(命令=开始)
{
接受命令;
处理命令;
}
for(; ;)
{ }
}
2)有序表单元模块——实现有序表的抽象数据类型;
3)节点结构单元模块——定义有序表的节点结构;
4)数据输入分析模块——判断输入数据正确有效;
各模块之间的调用关系如下:
主程序模块
↓
有序表结构模块
↓
节点结构单元模块
↓
数据输入分析模块
三、详细设计
1、结点类型,指针类型
Typedef struct LNode{
int code,date; //code 为人所在位置 date为人持有的密码struct LNode *next;
}; // 结点类型,指针类型
2、构造单向循环链表
struct LNode *p,*head,*q; //定义头节点,和指针
for(i=2;i<=n;i++)
{
struct LNode *s=(struct LNode *)malloc (sizeof(struct LNode)); //分配
新结点空间
s->code=i;
input(s->date);
p->next=s;
p=p->next;
}
p->next=head; //根据输入的人数,进行单项循环链表的创建,p指向最后一个结点,并与头节点链接,形成单项循环链表
3、约瑟夫环的程序实现部分
while(n!=1) //判断输入人数,如为1则直接输出结果,不循环
{
for(i=1,m=m%n;i 的前驱 { p=p->next; } q=p->next; //找到要删除节点 p->next=q->next; //找到要删除节点的后继,并连接新环 m=q->date; //找到下一个密码 printf("%d",q->code); free(q); //释放已删除节点空间 n--; //链表长度减一 } printf("%d",p->code); //约瑟夫环的结果输出 4、其他函数代码 数值的输入限制 int input() { int y,k,z=0; char c; //元素类型 char a[4]; //数组初始化 if(!z) //输入判断,确定位数字或控制字符且位置和密码不为零 { for(y=0;y<4;y++) { c=getch(); if(c>=48&&c<=57) //确定为输入数字 {a[y]=c; putch(c); } else { y--; if(c=='\r') //确定输入为控制字符即回车或者删除 break; else if(c==8) {a[y]='\n'; y--;} continue; } } k=atoi(a); //确定最终输入数字的值 printf("\n"); z=k; if(z==0) printf("ERROR! The number couldn't be 0! \n"); // 输入为零,重新输入