约瑟夫环数据结构课程设计Word文档格式.docx

上传人:b****2 文档编号:4595597 上传时间:2023-05-03 格式:DOCX 页数:16 大小:90.77KB
下载 相关 举报
约瑟夫环数据结构课程设计Word文档格式.docx_第1页
第1页 / 共16页
约瑟夫环数据结构课程设计Word文档格式.docx_第2页
第2页 / 共16页
约瑟夫环数据结构课程设计Word文档格式.docx_第3页
第3页 / 共16页
约瑟夫环数据结构课程设计Word文档格式.docx_第4页
第4页 / 共16页
约瑟夫环数据结构课程设计Word文档格式.docx_第5页
第5页 / 共16页
约瑟夫环数据结构课程设计Word文档格式.docx_第6页
第6页 / 共16页
约瑟夫环数据结构课程设计Word文档格式.docx_第7页
第7页 / 共16页
约瑟夫环数据结构课程设计Word文档格式.docx_第8页
第8页 / 共16页
约瑟夫环数据结构课程设计Word文档格式.docx_第9页
第9页 / 共16页
约瑟夫环数据结构课程设计Word文档格式.docx_第10页
第10页 / 共16页
约瑟夫环数据结构课程设计Word文档格式.docx_第11页
第11页 / 共16页
约瑟夫环数据结构课程设计Word文档格式.docx_第12页
第12页 / 共16页
约瑟夫环数据结构课程设计Word文档格式.docx_第13页
第13页 / 共16页
约瑟夫环数据结构课程设计Word文档格式.docx_第14页
第14页 / 共16页
约瑟夫环数据结构课程设计Word文档格式.docx_第15页
第15页 / 共16页
约瑟夫环数据结构课程设计Word文档格式.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

约瑟夫环数据结构课程设计Word文档格式.docx

《约瑟夫环数据结构课程设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《约瑟夫环数据结构课程设计Word文档格式.docx(16页珍藏版)》请在冰点文库上搜索。

约瑟夫环数据结构课程设计Word文档格式.docx

3.1程序中的数据类型………………………………………………2

3.2函数运行过程详解………………………………………………3

4设计和调试分析…………………………………………………………6

4.1调试中遇到的问题………………………………………………6

4.2经验和体会………………………………………………………7

5用户使用说明……………………………………………………………7

6测试数据和测试结果……………………………………………………8

参考文献……………………………………………………………………10

1需求分析

1.1课题内容:

(1)本演示程序中,人数n应为任意的,首先应输入一个值赋给初始报数上限m,程序应能自动保存出列人的序号和将出列的人所持的密码赋给m,再次作为报数上限,如此循环,直至所有人都出列为止。

(2)演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入相应数据(即每个人所持的密码),每个人的序号由程序自动分配。

(3)程序执行的命令包括:

(1)构造链表;

(2)输入数据;

(3)执行报数,储存出列人的序号,删除出列人的信息以及把出列人的密码赋给m;

(4)结束。

(4)测试数据

n=7,7个人的密码依次为:

3,1,7,2,4,8,4,首先m值为6,则这正确的出列顺序为6,1,4,7,2,3,5。

1.2要求:

(1)源程序要有适当的注释,使程序容易阅读;

(2)函数功能要划分好(结构化程序设计);

(3)可以增加新功能模块;

(4)要提供程序测试方案,程序一定要经得起测试,也要能运行起来,不能运行的程序是没有价值的。

2概要设计

该系统采用C语言开发,主要方法是选择合适的程序结构,灵活使用三种程序设计基本结构、函数等编写程序。

2.1本程序包含三个模块,对应关系图为:

(1)主程序模块;

(2)构造链表并输入每个人信息模块;

(3)每个人依序出列打印出列顺序并释放结点模块;

2.2为了实现上述操作,应以单向循环链表为存储结构。

2.3基本操作:

Data_InPut()

操作结果:

构造链表,初始化每个人的相关信息

Data_OutPut()

释放指向出列的人的结点,并重新报数

3详细设计

3.1程序中定义的数据类型

typedefstructLNode{

ElemTypenum;

//各人的编号

ElemTypedata;

//各人的密码

structLNode*next;

//指向下一个节点的指针

}LNode,*LinkList;

程序中定义了一个节点的结构体,每次新分配一个节点内存,即为新增一个人,data为人的密码,num是人的编号。

3.2每个函数的过程详解

3.2.1voidmain();

函数原型:

voidmain()

函数源程序:

{

LinkListL=NULL;

intm,n=30;

//m为报数上限,n为人的个数

inti=0;

//常用变量

printf("

\t约瑟夫环问题\n\n"

);

printf("

请输入m的值(要求m<

=30):

"

scanf("

%d"

&

m);

//将m重新赋值

请输入人数n:

n);

//确定人的个数,即n得值

while(n>

30||n<

0)//人数异常处理

{

printf("

请输入小于30的正整数:

scanf("

}

\n"

//换行

//调用数据录入函数

Data_InPut(L,n);

//调用数据输出函数

Data_OutPut(L,n,m);

}

函数功能及实现:

此为主函数,先输入m和n的值,即确定初始上限m和人数n,并对人数进行防出错处理,之后调用函数Data_InPut(L,n)对n个人编号和输入对应密码,再调用函数Data_OutPut(L,n,m)按照要求对各个人依次出列,打印相关信息到屏幕上。

3.2.2LinkListData_InPut(LinkList&

L,intk);

LinkListData_InPut(LinkList&

L,intk)

LinkListR,P,Q;

L=(LinkList)malloc(sizeof(LNode));

//创建一个节点

R=L;

for(inti=0;

i<

k;

i++)//通过for循环录入数据

R->

data);

//依次输入每个人的密码

R->

num=i+1;

//输入每个人的编号

P=(LinkList)malloc(sizeof(LNode));

//创建新节点

P->

next=NULL;

Q=R;

next=P;

//连接新的节点

R=P;

free(P);

//释放无用结点

Q->

next=L;

return(L);

//返回循环链表

先定义结构体指针变量R,P,Q,L,创建一个新节点赋值给指针L,并将L赋值给R,通过for循环再创建n个节点,并录入每个人对应编号,通过scanf函数录入每个人的密码,因为创建了一个节点。

并将新创建的节点连到链表尾端,形成一个单链表。

最后创建的一个节点是多余的,需要删除,所以通过free函数释放最后一个节点。

之后将单链表的尾指针指向第一个节点,形成一个单循链表。

最后通过return函数返回循环链表,继续执行主函数。

3.2.3voidData_OutPut(LinkList&

L,intk,intb);

voidData_OutPut(LinkList&

函数原程序:

L,intk,intb)

\n出列顺序为:

i++)//通过循环输出数据

R=L;

while(--b)//通过while循环找到密码做指向的那个人

{

Q=R;

//加入Q方便寻找出列的人的上一个节点

R=R->

next;

//指针后移

}

第%d个出列%d\n"

i+1,R->

num);

//输出所找人的编号

b=R->

data;

//刷新b值,将所找到人的密码赋值给b

Q->

next=R->

//将出列人的前一个节点和后一个节点连接形成新环

L=R->

free(R);

//释放已出列结点

该函数首先定义了指针变量R,P,Q,L方便对节点的操作。

通过for循环以确定所有人都会被出列,在while循环中,b的值最初是给定的报数上限,通过自减操作找到所要出列的那个人,打印其编号,将其密码重新赋值给b,并删除代表该人的节点,并释放该节点,形成一个新的约瑟夫环,进行下一次循环,最终所有人出列后完成for循环,打印出列顺序,返回大主函数。

4设计和调试分析

4.1调试中遇到的问题

(1)在用scanf函数给普通变量输入数据时,在变量名前漏写地址运算符&

  

如:

scanf(″%d%d″, 

x, 

y);

(2)输入数据时的数据形式与要求不符。

用scanf函数输入数据时,必须注意要与scanf语句中的对应形式匹配。

如:

scanf(″%d,%d″,&

&

若按以下形式输入数据:

       

4

  是不合法。

数据2和4之间应当有逗号。

(3)输入、输出时的数据类型与所用格式说明符不匹配。

  例如有以下说明语句:

int 

x=1;

char 

y=’a’;

  则运行时执行语句

      

printf(″x=%c, 

y=%d\n″, 

  将给出与原意不符的结果:

(在TURBO 

2.0 

下运行)

(4)对于复合语句,忘记加花括号。

  例如:

i=1;

a=0;

while 

(i<=10)

        a+=i;

i++;

        printf(″a=%d\n″,a);

的上限值是数组定义时元素个数减1。

(5)对指针的操作要小心谨慎,比如初始化和赋值等问题值得加以注意。

4.2经验和体会

通过这次数据结构课程设计,我感受最深的就是对于循环链表的使用,可以说对循环链表有了比以前更进一步的认识,以前只是一知半解的,如果只给个题目自己根本不能把程序完整地编写出来,所以这次课程设计最大的收获就在于对循环链表有了一定的理解,包括其中的一系列操作,如建立一个循环链表,删除链表中的一个结点,增加一个结点等。

在这次课程设计过程中需要我们一边设计一边探索,这这个过程当中我发现自己在数据结构方面知识掌握不够深入,对一些基本概念不能很好的理解,对一些数据结构不能够熟练的进行上机实现,这是自己比较薄弱的。

学好基础知识是理论付诸实践的前提,这样理论和实践才能充分地结合起来。

在以后的学习中,我还要努力改正,充分利用上机实验的机会提高自己。

在程序的输入的时候,因为自己对键盘的不熟练,代码又很多很繁琐,常常会产生放弃的念头,从中我也感受到只有坚持到底,胜利才会出现。

在调试程序的时候我也有所体会,虽然约瑟夫环问题不是很难,但调试的时候还是会出现很多错误,因此我们不能认为容易就不认真对待。

在以后的学习中,要能不断发现问题,提出问题,解决问题,从不足之处出发,在不断学习中提高自己。

5用户使用说明

(1)根据正确的提示安装软件。

(2)Intel486以上系列、AMDK6以上系列等PC台式机和便携式电脑都可运行。

(3)打开该程序系统,根据提示首先输入初始报数上限和约瑟夫环的人数,然后输入各个人的密码,完成输入后,按回车键即可显示约瑟夫环内各人的出列顺序。

6测试数据和测试结果

(1)进入系统界面

系统提示输入m的值,即报数上限,为测试所给数据,将m的值设为20。

(2)输入约瑟夫环的人数

输入人数后,若输入人数大于30则提示输入错误,重新输入,这里为检测所给数据,设定人数为7。

(3)输入7人的密码

根据题目所给数据,7人的密码依次为3,1,7,2,4,8,4,输入完毕后回车。

(4)显示结果

测试的出列顺序为6,1,4,7,2,3,5符合题目要求,与算得的结果一致,证明程序正常运行,能够解决一般的约瑟夫环问题。

参考文献

[1]谭浩强.C程序设计(第二版).北京:

清华大学出版社,1999.12

[2][美]KennethA.Reek著,徐波译.C和指针.北京;

人民邮电出版社2008.4

[3]严蔚敏,吴伟民.数据结构.北京:

清华大学出版社,1997

[4][美]HMDeitel,PJDeitel著,薛万鹏等译.C语言程序设计教程.北京:

机械工业出版社,2000.07

附录源程序清单

/*约瑟夫环问题设计与实现*/

//函数头文件

#include"

stdio.h"

malloc.h"

#include"

stdlib.h"

//自定义数据类型

typedefintStatus;

typedefintElemType;

//定义节点结构体

//函数原型

L,intk,intb);

//主函数

//数据输入函数

请输入第%d个人的密码:

\t"

i+1);

//调用数据输出函数

第%d个出列为:

%d\n"

忽略此处..

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

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

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2