C语言课程设计报告约瑟夫环胡存夫Word格式.docx
《C语言课程设计报告约瑟夫环胡存夫Word格式.docx》由会员分享,可在线阅读,更多相关《C语言课程设计报告约瑟夫环胡存夫Word格式.docx(19页珍藏版)》请在冰豆网上搜索。
根据课设题目要求,拟将整体程序分为四大模块。
此四个模块相互独立,没有嵌套调用的情况,以下是五个模块:
(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("