完整word版数据结构约瑟夫环实验报告Word格式.docx

上传人:b****2 文档编号:12963574 上传时间:2022-10-01 格式:DOCX 页数:10 大小:87.55KB
下载 相关 举报
完整word版数据结构约瑟夫环实验报告Word格式.docx_第1页
第1页 / 共10页
完整word版数据结构约瑟夫环实验报告Word格式.docx_第2页
第2页 / 共10页
完整word版数据结构约瑟夫环实验报告Word格式.docx_第3页
第3页 / 共10页
完整word版数据结构约瑟夫环实验报告Word格式.docx_第4页
第4页 / 共10页
完整word版数据结构约瑟夫环实验报告Word格式.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

完整word版数据结构约瑟夫环实验报告Word格式.docx

《完整word版数据结构约瑟夫环实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《完整word版数据结构约瑟夫环实验报告Word格式.docx(10页珍藏版)》请在冰豆网上搜索。

完整word版数据结构约瑟夫环实验报告Word格式.docx

=m)和n,从环表的第s个结点开始计数为1,当计数到第n个结点时,输出该第n结点对应的编号,将该结点从环表中消除,从输出结点的下一个结点开始重新计数到n,这样,不断进行计数,不断进行输出,直到输出了这个环表的全部结点为止。

例如,m=10,s=3,n=4。

则输出序列为:

6,10,4,9,5,2,1,3,8,7。

三、程序设计

1、概要设计

为了解决约瑟夫环的问题,我们可以建立单向环表来存储每个人的信息(该人的编号以及其下一个人的编号),及结点,人后通过查找每个结点,完成相应的操作来解决约瑟夫问题。

(1)抽象数据类型定义

ADTJoh{

数据对象:

D=

数据关系:

R1=

基本操作:

create(&

J,n)

操作结果:

构造一个有n个结点的单向环表J。

show(J)

初始条件:

单向环表J已存在。

按顺序在屏幕上输出J的数据元素。

calculate(J,s,n)

初始条件:

单向环表J已存在,s>

0,n>

0,s<

环表结点数。

操作结果:

返回约瑟夫环的计算结果。

}ADTJoh

(2)宏定义

#defineNULL0

#defineOK1

#defineERROR-1

(3)主程序流程

(4)模块调用关系

程序分为下述模块:

1)主函数模块——执行输入调用其他的功能函数

2)创建环表模块——创建单向环表

3)计算处理模块——计算出要出列的标号并输出

4)显示模块——输出建立好的环表

调用关系如下:

主函数模块

创建环表模块

显示模块

计算处理模块

2、详细设计

(1)数据类型设计

typedefintElemType;

//元素类型

typedefstruct{

ElemTypedata;

structJoh*next;

}Joh,*LinkList,*p;

//结点类型,指针类型

(2)操作算法

Statuscreate(LinkList&

J,intn){

//创建一个有n个结点的单向环表

if(n<

=0)

returnERROR;

//n<

0错误

J=(LinkList)malloc(sizeof(J));

J->

data=1;

next=J;

//建立第一个结点

for(inti=n;

i>

1;

--i){

p=(LinkList)malloc(sizeof(J));

p->

data=i;

next=J->

next;

J->

next=p;

//插入到表头

}

returnOK;

}//create

voidshow(LinkListJ){//主要的操作函数

//顺序输出环表J的结点

p=J;

printf("

%d"

p->

data);

p=p->

while(p!

=J){//循环终止条件

printf("

p=p->

}//show

voidcalculate(LinkListJ,ints,intn){

Joh*head=p;

//声明结点

while(p->

data!

=s){

head=p;

}//寻找起始结点

next!

=p){//终止条件

for(inti=0;

i<

n-1;

i++){

//保存前置节点

head->

next=p->

//删除已输出结点

p=head->

if(n!

=1)

%d\n"

else

\n"

);

}//calculate

(3)主函数代码

intmain(){//主函数

Joh*J;

intm,s,n;

Thenumofnodeis:

"

scanf("

%d"

&

m);

create(J,m);

//创建单向环表J

show(J);

//输出J的数据

Thefirstnodewhichyouwantis:

s);

Theinternalwhichyouwantis:

n);

calculate(J,s,n);

//计算并输出结果

return0;

}//main

四、程序调试分析

1、细节决定成败,编程最需要的是严谨,如何的严谨都不过分,往往检查了半天发现错误发生在某个括号,分号,引号,或者数据类型上。

在写主要操作函数caculate()时,在终止条件的书写处不是很清楚,导致我浪费了很多时间。

2、还有一点很大的感触就是,在自己绞尽脑汁都解决不了遇到的问题时,一个很好的手段就是询问同学,寻求其帮助,就比如我在想函数终止条件时,同学一句简单的话语就让我如梦初醒。

这不是什么丢脸的事情,相反的,在快速解决问题的同时,还会收获友谊,不是一举两得吗。

我想,这也是合作学习的真谛吧。

五、用户使用说明

1、本程序的运行环境为Windows操作系统下的MicrosoftVisualC++6.0。

2、在VC环境下打开程序后,按要求键入要求的数字,以等号或空格断开,敲击“回车符”,即可以显示要求的结果。

3、按下任意键以继续。

六、程序运行结果

程序测试1:

程序测试2:

七、程序清单

#include<

stdio.h>

stdlib.h>

//引用函数库

structLNode

{

intnum;

structLNode*next;

};

//定义链表

typedefstructLNodeNODE;

NODE*createlinklist(intn)

//初始化循环链表,并返回头指针

NODE*head,*p,*q;

inti=1;

head=p=(structLNode*)malloc(sizeof(structLNode));

p->

num=i;

for(i=2;

=n;

i++)

{

q=(structLNode*)malloc(sizeof(structLNode));

if(q==0)return(0);

next=q;

p=q;

next=head;

//使链表尾指向链表头,形成循环链表

returnhead;

}

voidjoseph(NODE*p,intn,intm)

//约瑟夫函数,用于输出约瑟夫环

inti,j;

NODE*q;

for(i=1;

for(j=1;

j<

m;

j++)

p=p->

//计算出列者序号

q=p->

next=q->

q->

num);

free(q);

next=NULL;

voidmain()

NODE*head;

intn,s,m;

inti;

//确定计算系数

**********************物理网1班-15180118-刘沛航****************************\n"

围绕圆桌的人数为?

从第几人开始?

数到几的人出列?

//确定头指针

head=createlinklist(n);

if(s==1)

for(i=1;

n;

head=head->

else

s-1;

head=head->

//输出约瑟夫环出列顺序

出列的顺序如下:

joseph(head,n,m);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1