C语言课程设计报告约瑟夫环胡存夫Word格式.docx

上传人:b****6 文档编号:15960197 上传时间:2022-11-17 格式:DOCX 页数:19 大小:457.46KB
下载 相关 举报
C语言课程设计报告约瑟夫环胡存夫Word格式.docx_第1页
第1页 / 共19页
C语言课程设计报告约瑟夫环胡存夫Word格式.docx_第2页
第2页 / 共19页
C语言课程设计报告约瑟夫环胡存夫Word格式.docx_第3页
第3页 / 共19页
C语言课程设计报告约瑟夫环胡存夫Word格式.docx_第4页
第4页 / 共19页
C语言课程设计报告约瑟夫环胡存夫Word格式.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

C语言课程设计报告约瑟夫环胡存夫Word格式.docx

《C语言课程设计报告约瑟夫环胡存夫Word格式.docx》由会员分享,可在线阅读,更多相关《C语言课程设计报告约瑟夫环胡存夫Word格式.docx(19页珍藏版)》请在冰豆网上搜索。

C语言课程设计报告约瑟夫环胡存夫Word格式.docx

根据课设题目要求,拟将整体程序分为四大模块。

此四个模块相互独立,没有嵌套调用的情况,以下是五个模块:

(1)创建链表模块

voidcreateList(LNode*ppHead,intn)

(2)出队处理模块

voidjose(LNode*ppHead,intm_pwd)

(3)约瑟夫环说明输出模块

voidinstruction()

(4)菜单模块

voidmenu()

(5)主函数模块

intmain()

原理图介绍

2.2.1功能模块图

2.2.2流程图分析

1.

2.

3.voidinstruction()

{

printf("

****************************************************************\n"

);

约瑟夫环:

\n"

编号为1,2,3,4…,n的n个人按顺时针方向围坐一圈,每人持有一个密\n"

码(正整数).一开始任选一个正整数作为报数的上限值m,从第一个人开始\n"

按顺时针方向自1开始顺序报数,报到时停止.报m的人出列,将他的密码\n"

m作为新的m值,从他在顺时针方向上的下一人开始重新从1报数,如此下去,\n"

直到所有人全部出列为止.编程打印出列顺序.\n"

******************************************************\n"

return0;

}

4菜单模块

voidmenu(){

**************************约瑟夫环*****************************\n"

\n"

[1]约瑟夫环问题的阐述\n"

[2]按要求求解约瑟夫环\n"

[0]退出\n"

**************************欢迎使用!

****************************\n"

5.

3调试与分析

3.1调试过程

在调试程序是主要遇到一下几类问题:

这是一个使用循环链表的经典问题。

本程序开始运行界面如下:

选择1进入约瑟夫环问题阐述。

①选择2,输入下列数据测试:

请输入总人数n:

7

请输入开始上限数m:

20;

请依次输入每个人的密码:

3172484

出队顺序:

6147235

②继续选择2,输入下列数据测试:

5

30

34567

53124

③继续选择2,输入下列数据测试:

8

14

345678910

67283514

测试完成,选择0退出。

.

参考文献

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

清华大学出版社,2007.

[2]张长海,陈娟.C程序设计[M].北京:

高等教育出版社,2004.

[3]谭浩强.C程序设计[M].北京:

清华大学出版社,2005..

[4]严蔚敏,吴伟民.《数据结构题集(C语言版)》.清华大学出版社.

[5]《DATASTRUCTUREWITHC++》.WilliamFord,WilliamTopp.清华大学出版社(影印版).

附录(关键部分程序清单)

程序代码

#include<

stdio.h>

//输入输出函数头文件

stdlib.h>

//字符串转短整形函数的头文件10140219

//

typedefstructLNode//定义单循环链表中节点的结构

intnum;

//编号

intpwd;

//password

structLNode*next;

//指向下一结点的指针

}LNode;

/*构造结点*/

LNode*createNode(intm_num,intm_pwd)

LNode*p;

p=(LNode*)malloc(sizeof(LNode));

//生成一个结点

p->

num=m_num;

//把实参赋给相应的数据域

pwd=m_pwd;

next=NULL;

//指针域为空

returnp;

}

/**创建循环链表**/

voidcreateList(LNode**ppHead,intn)

{/*创建单向循环链表ppHead,人数个数为n,并输入每个人的密码值,若

建立失败则生成头结点,让cur指向他,若建立成功则插入结点P,cur指

向的数据元素为p,后续为"

空"

的节点,再把P插入循环链表ppHead中*/

inti,m_pwd;

LNode*p,*cur;

//cur:

浮标指针

for(i=1;

i<

=n;

i++)

{

printf("

输入第%d个人的密码:

"

i);

scanf("

%d"

&

m_pwd);

//输入持有密码

p=createNode(i,m_pwd);

//调用构造结点函数

if(*ppHead==NULL)//如果头结点为空

{

*ppHead=cur=p;

//生成头结点,让cur指向他

cur->

next=*ppHead;

//cur的指针域指向自身

}

else//如果不为空,则插入结点

p->

next=cur->

next;

next=p;

cur=p;

//cur指向新插入结点

}

}

完成创建!

//提示链表创建完成

/*出队处理*/

{/*p指向要删除节点的前一个节点,ppHead指向要删除的节点,使p=ppHead,ppHead再指向要删除节点的下一个节点,使p和ppHead链接,输出p指向节点的编号和密码值,释

放ppHead,如此循环,直至把所有节点都打印和删除为止!

*/

inti,j;

LNode*p,*p_del;

//定义指针变量

p!

=ppHead;

i++){

for(j=1;

j<

m_pwd;

++j){

p=ppHead;

//p赋值为ppHead,p指向要删除结点的前一个结点

ppHead=ppHead->

//ppHead指向下一个元素

p->

next=ppHead->

//p结点与头结点链接

i=ppHead->

pwd;

//i赋值为ppHead->

pwd

j=ppHead->

num;

//j赋值为ppHead->

num,j为要删除的密码值

第%d个人出列,密码:

%d\n"

j,i);

m_pwd=ppHead->

//m_pwd赋值为ppHead->

free(ppHead);

//释放头结点

ppHead=p->

//ppHead重新赋值给p->

next,即释放前的ppHead->

pwd指针//删除报数结点

}

i=ppHead->

j=ppHead->

num

最后一个出列是%d号,密码是:

free(ppHead);

/*主函数模块*/

intmain(){

intn,m,x;

LNode*ppHead=NULL;

menu();

\n请选择要执行的操作:

scanf("

x);

system("

cls"

switch(x){

case1:

printf("

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

当前位置:首页 > 医药卫生 > 药学

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

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