约瑟夫环

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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"); // 输入为零,重新输入

相关文档
最新文档