课程设计报告.docx
《课程设计报告.docx》由会员分享,可在线阅读,更多相关《课程设计报告.docx(14页珍藏版)》请在冰豆网上搜索。
课程设计报告
课程设计报告
课程设计名称:
数据结构课程设计
课程设计题目:
约瑟夫环
目录
1课程设计介绍1
1.1课程设计内容1
1.2课程设计要求1
2课程设计原理2
2.1课设题目粗略分析2
2.2原理图介绍2
2.2.1功能模块图2
2.2.2流程图分析3
3数据结构分析6
3.1存储结构6
3.2算法描述6
4调试与分析8
4.1调试过程8
4.2程序执行过程8
4.3运行时的界面显示9
参考文献10
附录(关键部分程序清单)11
1课程设计介绍
1.1课程设计内容
编号为1,2···n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。
一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他的顺时针方向的下一个开始重新从1报数,如此下去,直至所有的人全部出列为止,设计一个程序求出出列顺序。
1.2课程设计要求
1.使用单循环链表作为储存结构,并模拟该过程;
2.从键盘输入开始时的总人数、初始报数上限值m及每个人的密码;
3.按照出列顺序输出各人的编号。
2课程设计原理
2.1课设题目粗略分析
演示程序以用户和计算机的对话的方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入相应的数据(即每个人都所持的密码),每个人的序号由程序自动分配。
程序执行的命令包括:
(1)构造链表;
(2)输入数据;
(3)执行报数,储存出列人的序号,删除出列人的信息以及把出列人的密码赋给m;
(4)结束。
本程序包括三个模块:
(1)信息录入(构造链表)模块。
此模块将对数据进行初始化,构造链表,并录入数据以便后续程序的使用。
(2)结果输出模块。
此模块将根据前面所输入的数据对数据进行处理,输出报数号码,删除报数节点,并继续进行处理。
(3)主程序模块。
此模块实现整个程序的进入和退出,及各种初始化处理。
2.2原理图介绍
2.2.1功能模块图
图2.1功能模块图
功能模块如图2.1所示
2.2.2流程图分析
1.此部分为createlist函数。
首先初始化变量,再输出提示性语句,等待用户输入数据,将总人数和初始上限值分别存入num和m。
以num为上限值建立单循环链表,最后返回L。
图2.2createlist函数流程图
2.此部分为printlist函数部分。
定义变量temp=m,从第一个人开始进行报数,指针q和p指向第一个人L,当q->next=p时,q=q->next;否则当q->next!
=q时—temp,直到—temp!
=0时输出p所指向的节点的num;重复以上处理直到q->next!
=q为假时结束该函数。
图2.3printlist函数流程图
3.此部分为主程序部分。
分别调用函数createlist和printlist,所有人输出,程序结束。
并通过while循环对程序进行重复使用。
图2.4主程序流程图
3数据结构分析
3.1存储结构
根据要求首先应该建立一个单循环链表,实现链式存储。
设置结构体存储节点:
用结构体存储全体人数整型变量num和每个人的密码整型变量mm,用以指示下一结点的指针next。
结构体指针Linklist;。
structnode
{
intmark;
intnum;
structnode*next;
};
typedefstructnodeLinklist;
设置结构体指针p和q及表头指针L。
3.2算法描述
1.将人数的编号和相应的密码输入到单循环链表中,应用creatlist函数,输入总人数和初始上限值。
然后依次输入每个人的密码,循环n-1次。
设置指针p=(Linklist*)malloc(sizeof(node));如果头结点为空,将指针p=L=q;每人的号码编号赋值给指针p所指的人数p->num=i;q->next=p;然后将p所指的节点赋给q,q=p;依次循环,直到所有的节点都赋值完成。
赋值完成后,p->next=L;构成单循环链表的要求。
2.进行出圈的过程,所用的函数为Print函数。
因为上限值为全局变量值,所以在Print函数中用一个变量temp代替。
令temp=m;q->next=L;进行循环,条件为q->next!
=q;因为为循环链表,所以判断最后指针是否指向自己,while(q->next!
=q)。
在这循环体中,令变量temp逐步减1,判断是否为一,while(temp--!
=1)。
循环体为q=p;p=p->next;当为1时,选中第一个出圈的人,并输出他的编号,printf("%d",p->num);此时将他的编号赋值为新的上限值,temp=p->mark;q指向的下一结点为p所指向的下一节点,并进行删除节点操作free(p);将q的下一节点再次赋值给p,p=q->next;重复以上的操作,知道所有的人都输出。
3.主程序模块部分,全局变量总人数n和初始上限值m,设置单循环链表的表头L,分别引用函数createlist和printlist,本程序结束。
并通过while循环对程序进行重复使用。
4调试与分析
4.1调试过程
在调试程序是主要遇到一下几类问题:
1.当输入此函数时出现了与&相关的错误,例如后面缺少括号以及分号等等以下的错误;
2.输入每个人的密码值出现连贯相同数字时,程序有可能出现停止;
3.在主程序中main()前不加返回值变量类型,调试时出现逻辑错误;
4.在定义结构体时,定义结构体指针变量为。
但在程序运行时出现了定义的结构体指针不起作用。
4.2程序执行过程
输入总人数:
5
输入上限值:
2
输入第一个人的密码:
1
输入第二个人的密码:
2
输入第三个人的密码:
3
输入第四个人的密码:
4
输入第五个人的密码:
5
出列顺序是:
24513
继续(1.yesor0.no)?
1
*********************
输入总人数:
3
输入上限值:
4
输入第一个人的密码:
1
输入第二个人的密码:
2
输入第三个人的密码:
3
出列顺序是:
123
继续(1.yesor0.no)?
0
*********************
谢谢使用!
4.3运行时的界面显示
参考文献
[1]严蔚敏,吴伟民.数据结构[M].北京:
清华大学出版社,2007.
[2]张长海,陈娟.C程序设计[M].北京:
高等教育出版社,2004.
[3]谭浩强,C程序设计[M].北京:
清华大学出版社,2005.
[4]王杰,数据结构经典算法实现与习题解答[M].北京:
人民邮电大学出版社,2004年
[5]张长海,陈娟.C程序设计[M].北京:
高等教育出版社,2004年
[6]谭浩强,C程序设计[M].北京:
清华大学出版社,2005年
附录(关键部分程序清单)
程序代码
#include
#include
intm=0,num=0;
structnode
{
intmm;
intnum;
structnode*next;
};
typedefstructnodeLinklist;
Linklist*createlist(Linklist*L)//根据人数创建链表
{
intt;
Linklist*p,*q;
printf("请输入总人数:
");
scanf("%d",&num);
printf("请输入初始上限值:
");
scanf("%d",&m);
for(t=1;t<=num;t++)
{
p=(node*)malloc(sizeof(node));
printf("请输入第%d个人的密码:
",t);
scanf("%d",&p->mm);
p->num=t;
if(L==NULL)
L=q=p;
else
{
q->next=p;
q=p;
}
}
p->next=L;
returnL;
}
voidprintlist(Linklist*L)//输出链表
{
inttemp=m;
Linklist*p,*q;
printf("出列顺序是:
\n");
p=q=L;
while(q->next!
=p)
q=q->next;
while(q->next!
=q)
{
while(--temp)
{
q=p;
p=p->next;
}
printf("%d",p->num);
temp=p->mm;
q->next=p->next;
free(p);
p=q->next;
}
printf("%d\n",q->num);//输出最后一个结点
return;
}
voidmain()
{ints=1;
while(s!
=0){
Linklist*L=NULL;
L=createlist(L);
printlist(L);
printf("继续?
(1.yesor0.no)");
scanf("%d",&s);
printf("************************\n");}
printf("谢谢使用!
\n");
}
课程设计总结:
通过本次课程设计使我更加清楚了自己的水平以及以后要努力的方向。
本次课程设计涉及到的范围很广,让本人能够比较系统的对C语言和数据结构进行一次整理和复习。
同时有了很多的体会和经验。
我的课设的题目是约瑟夫环,根据题目的内容与要求,首先得到的是用单链表作为全体人数与每个人的密码的存储结构。
设置结构体指针,并定义了两个指针类型的指针p与q;并编写了两个函数,链表构造函数和输出函数。
对数据结构的理解有待加强,算法的知识面也有待于提高。
不同的人会选择不同的算法,所以即使同样的程序,不同的人必然会设计出不同的方案,所以以后的学习生活中,一定要广泛涉猎,掌握更多更好的解决问题的方法。
在编写程序的过程中要明白程序的好坏是运行的效率如何,所以在编写程序时尽量用简洁的数据结构方法与算法。
同时使程序格式清晰与美观。
通过这次课程设计,我知道要想成为一个合格的程序员,除了要有扎实的专业知识外,还要站在客户的立场上,多为客户考虑。
在编写程序的时候,一定要养成良好的编程习惯。
它让我尝到了学习的快乐,成功的喜悦,更让我懂得了不少做人的道理。
要完成一项任务或把东西学好就必须有足够的信心,持久的耐心,有面对困难无所畏惧的精神,这对我日后的学习和生活产生了深远一个影响。
此外,课设也教会我要有团队精神,不管遇到什么困难,要多和同学讨论,甚至是“争辩”。
在此,也感谢老师的悉心指导!
指导教师评语:
指导教师(签字):
年月日
课程设计成绩