生死者游戏数据结构课设.docx
- 文档编号:23847864
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:21
- 大小:92.90KB
生死者游戏数据结构课设.docx
《生死者游戏数据结构课设.docx》由会员分享,可在线阅读,更多相关《生死者游戏数据结构课设.docx(21页珍藏版)》请在冰豆网上搜索。
生死者游戏数据结构课设
课程设计报告
课程名称《数据结构》
课题名称生死者游戏
专业信息管理与信息系统
班级1301
学号201303110125
姓名肖宏亮
指导教师赵锦元、谢雅、李峰
2014年12月18日
湖南工程学院
课程设计任务书
课程名称数据结构
课题生死者游戏
专业班级1301
学生姓名肖宏亮
学号21303110125
指导老师赵锦元、谢雅、李峰
审批
任务书下达日期2014年11月25日
任务完成日期2014年12月18日
一、设计内容与设计要求
1.设计内容:
[问题描述] 每N(N>k)个旅客同乘一条船,因为严重超载,加上风高浪大,危险万分,因此船长告诉乘客,只有将全船一半的旅客投入海中,其余人才能幸免遇难。
无奈,大家只得同意这种办法,并拟定N个人围城一圈,由第一个人数起,依次报数,数到第k人,便把他投入大海中,然后再从他的下一个人数起,数到第k人,再将他扔进大海中,如此循环地进行,直至剩下N/2个乘客为止。
问哪些位置是将被扔进大海的位置。
[基本功能]
(1)实时显示每仍一个旅客之前,按序号从小到大的顺序显示当前在船上的旅客的编号。
(2)变换N和k的值,看显示结果是否仍然正确。
2.设计要求:
1).设计正确,方案合理。
2).界面友好,使用方便。
3).程序精炼,结构清晰。
4).设计报告5000字以上,含程序设计说明、系统的功能框图、流程图、源程序清单等。
5).实际操作过程中遇到的问题及解决方法:
设计总结及心得体会。
6).上机演示。
二、进度安排
第15周星期二14时:
00分——17时:
30分
星期三14时:
00分——17时:
30分
星期四14时:
00分——17时:
30分
第16周星期二14时:
00分——17时:
30分
星期三14时:
00分——17时:
30分
星期四14时:
00分——17时:
30分
附:
课程设计报告装订顺序:
封面、任务书、目录、正文、评分、附件(A4大小的图纸及程序清单)。
正文的格式:
一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。
正文的内容:
一、课题的主要功能;二、课题的功能模块的划分(要求画出模块图);三、主要功能的实现(至少要有一个主要模块的流程图);四、程序调试;五、总结;六、附件(所有程序的源代码,要求对程序写出必要的注释)。
正文总字数要求在5000字以上(不含程序源代码)。
目录
1.系统需求分析1
1.1问题描述1
1.2功能要求1
2.概要设计1
2.1系统总体设计1
2.2各模块的功能1
3.详细设计2
3.1采用c语言定义相关的数据结构2
3.2mian()函数2
3.3CreateList()函数4
3.4DispList()函数5
3.5ListDelete()函数6
3.6函数关系调用图7
4.系统调试及运行结果8
4.1程序调试中的问题8
4.2运行结果8
5.心得与体会9
6.附录10
6.1源代码10
6.2参考文献15
7.评分表16
1.系统需求分析
1.1问题描述
每N(N>k)个旅客同乘一条船,因为严重超载,加上风高浪大,危险万分,因此船长告诉乘客,只有将全船一半的旅客投入海中,其余人才能幸免遇难。
无奈,大家只得同意这种办法,并拟定N个人围城一圈,由第一个人数起,依次报数,数到第k人,便把他投入大海中,然后再从他的下一个人数起,数到第k人,再将他扔进大海中,如此循环地进行,直至剩下N/2个乘客为止。
问哪些位置是将被扔进大海的位置。
1.2功能要求
(1)实时显示每仍一个旅客之前,按序号从小到大的顺序显示当前在船上的旅客的编号。
(2)变换N和k的值,看显示结果是否仍然正确。
2.概要设计
2.1系统总体设计
程序共有三个子函数和一个主函数
(1)建立循环单链表
(2)选择生者与死者的函数
(3)输出所有生者的函数
(4)主函数则通过调用这些子函数而达到它所要的结果
2.2各模块的功能
(1)LinkList*CreateList(LinkList*head)是用尾插法建立单循环链表的函数,将链表的首尾连起来。
这样定义的链表与一般的链表结构完全一样,数据域用一个整数来表示位置,删除元素时不需要移动大量元素位置,方便操作。
(2)intListDelete(LinkList*head,intt)是选择生者与死者的函数,要删除第k个节点,必须找到第k-1个节点。
P指向第k-1个节点,q指向第k个节点,删除q->data,再p->next=q->next,最后释放q节点。
(3)voiddispList(LinkList*head)是输出生者序号的函数。
3.详细设计
3.1采用c语言定义相关的数据结构
typedefstructLNode//定义结构体
{
intdata;
structLNode*next;
}LinkList;
3.2mian()函数
用来调用个功能函数,实现参与游戏人数的编号,输出有多少人,删除死亡的人数,具体程序如下
voidmain()//主函数
{
charx='y';//设定游戏是否继续的字符'y'
intt;
printf("\t**************************************************************");
printf("\n\n\n\n\t\t\t--------欢迎进入生死者游戏--------\n\n\n\n");
printf("\t**************************************************************\n\n\n\n");
system("pause");
system("cls");
printf("\n\n游戏规则:
\n-----1.请输入大于0的人数以保证船上的人不为空-----\n");
printf("-----2.请输入的死亡数字限不能大于船上的人数-----\n");
system("pause");
system("cls");
while(x=='y')
{
LinkList*L=NULL;
printf("请输入参与游戏的人数:
\n");
scanf("%d",&t);
T=t;
while(t<=0)
{
printf("输入错误,请重输\n");
scanf("%d",&t);
T=t;
}
printf("请输入死亡数字:
\n");
scanf("%d",&k);
while(k<=0)
{
printf("输入错误,请重输\n");
scanf("%d",&k);
}
while(k>T)
{
printf("输入有误请重输\n");
printf("请输入参与游戏的人数:
\n");
scanf("%d",&t);
T=t;
printf("请输入死亡数字:
\n");
scanf("%d",&k);
}
printf("******************************************\n");
printf("参与游戏的人员编号如下:
\n");
L=CreateList(L);//调用创建链表函数
ListDelete(L,t);//调用删除函数
printf("******************************************\n");
printf("是否继续游戏(是:
请输入y否:
请输入其它)");
getchar();
scanf("%c",&x);
system("pause");
system("cls");
}
}
3.3CreateList()函数
先定义一个始终指向头结点的链表,在定义一个报数i,如果头结点为空的话,创建头结点,并将它赋给另外一个头结点为空的链表p,头结点已经创建,在创建一个新的链表q,并把它连接在头结点之后,具体程序如下
LinkList*CreateList(LinkList*head)//创建循环单链表
{
LinkList*p,*q=NULL;
inti=1;
while(i<=T)
{
if(head==NULL)//当头节点为空时
{
head=(LinkList*)malloc(sizeof(LinkList));
head->data=i++;p=head;
}
else//当头节点已存在时
{
q=(LinkList*)malloc(sizeof(LinkList));
q->data=i++;
p->next=q;
p=q;
}
}
p->next=head;//构成循环单链表
returnhead;
}
3.4DispList()函数
在输出循环单链表时,先判断头结点是否为空,在不为空的情况下,定义一个变量i,i从1直到T开始循环,输出循环单链表,具体程序如下
voidDispList(LinkList*head)//显示循环链表
{
LinkList*p=head;
inti;
if(p)//当头结点存在时输出单链表
{
for(i=1;i<=T;i++)
{
printf("%3d",p->data);
p=p->next;
if(i%10==0)
printf("\n");
}
}
}
3.5ListDelete()函数
在删除循环单链表中结点,我们需要注意的问题是删除的是否为第一个结点的情况,这种情况则需要单独考虑,再者,我们需要注意的是由于创建的是一条始终指向头结点的循环单链表,所以当删除的是第一个结点的时候,我们要将头指针往后移,保持链表的完整性。
具体程序如下
intListDelete(LinkList*head,intt)//删除单链表
{
LinkList*p,*q;
p=q=head;
if(!
head)//当头结点为空时
return0;
else
{//当头结点不为空时
while(T>t/2)
{
DispList(head);
printf("\n******************************************\n");
if(k==1)//当删除的是第一个结点时
{
p=q->next;
printf("\n被扔下海的人为:
%3d",q->data);
head=head->next;
free(q);
q=p;
T--;
printf("\n船上剩余人为:
\n");
}
else
{
for(inti=1;i p=p->next; q=p->next; printf("\n被扔下海的人为: %3d",q->data); if(head->data==q->data) head=head->next; p->next=q->next; free(q); T--; p=p->next; printf("\n船上剩余人为: \n"); } } DispList(head); printf("\n"); return1; } } 3.6函数关系调用图 4.系统调试及运行结果 4.1程序调试中的问题 (1)程序初具雏形时,存在着几个语法错误,比如说定义结构体时使类型不一致,导致后面所用到的类型缺少定义。 还有经常混淆中英文的标点符号,使得程序出错,不过这些都是小问题,在以后写程序的过程中细心即能克服。 (2)在写输出函数dispList(head)时候,开始运用的是用while来判断头结点是否为空,这样就忽略了头结点为空的时候,所以应该将while改成if。 考虑到输出时的界面问题,用if(i%10==0)printf("\n");语句来规范化界面。 (3)在写创建链表函数CreateList(head)时,首先我将0赋给count,但是后面我定义的是head->data=count++,这样就导致最后一个人员的游戏信息无法输出,这时应该将1赋给count或者将函数中的语句定义为head->data=++count,这样就能改正错误, (4)在主函数中,程序执行的时候,没有办法继续输入,这样的话,我在程序的输入语句之前添加一条语句getchar(),这样的话,程序就能连续进行。 4.2运行结果 (1)进入游戏,友好界面 (2)游戏规则 (3)游戏人数10,死亡数字3,及他们的编号 (4)一次筛选的结果 5.心得与体会 课程设计诚然是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门辩思课,给了我许多道,给了我很多思,给了我莫大的空间。 同时,设计让我感触很深。 使我对抽象的理论有了具体的认识。 不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。 更重要的是,在实验课上,我们学会了很多学习的方法。 而这是日后最实用的,真的是受益匪浅。 要面对社会的挑战,只有不断的学习、实践,再学习、再实践。 这对于我们的将来也有很大的帮助。 实验过程中,也对团队精神的进行了考察,让我们在合作起来更加默契,在成功后一起体会喜悦的心情。 果然是团结就是力量,只有互相之间默契融洽的配合才能换来最终完美的结果。 6.附录 6.1源代码 #include #include #include intT,k;//定义全局变量,其中T为参与游戏的总人数,K为死亡数字 typedefstructLNode//定义结构体 { intdata; structLNode*next; }LinkList; LinkList*CreateList(LinkList*head)//创建循环单链表 { LinkList*p,*q=NULL; inti=1; while(i<=T) { if(head==NULL)//当头节点为空时 { head=(LinkList*)malloc(sizeof(LinkList)); head->data=i++;p=head; } else//当头节点已存在时 { q=(LinkList*)malloc(sizeof(LinkList)); q->data=i++; p->next=q; p=q; } } p->next=head;//构成循环单链表 returnhead; } voidDispList(LinkList*head)//显示循环链表 { LinkList*p=head; inti; if(p)//当头结点存在时输出单链表 { for(i=1;i<=T;i++) { printf("%3d",p->data); p=p->next; if(i%10==0) printf("\n"); } } } intListDelete(LinkList*head,intt)//删除单链表 { LinkList*p,*q; p=q=head; if(! head)//当头结点为空时 return0; else {//当头结点不为空时 while(T>t/2) { DispList(head); printf("\n******************************************\n"); if(k==1)//当删除的是第一个结点时 { p=q->next; printf("\n被扔下海的人为: %3d",q->data); head=head->next; free(q); q=p; T--; printf("\n船上剩余人为: \n"); } else { for(inti=1;i p=p->next; q=p->next; printf("\n被扔下海的人为: %3d",q->data); if(head->data==q->data) head=head->next; p->next=q->next; free(q); T--; p=p->next; printf("\n船上剩余人为: \n"); } } DispList(head); printf("\n"); return1; } } voidmain()//主函数 { charx='y';//设定游戏是否继续的字符'y' intt; printf("\t**************************************************************"); printf("\n\n\n\n\t\t\t--------欢迎进入生死者游戏--------\n\n\n\n"); printf("\t**************************************************************\n\n\n\n"); system("pause"); system("cls"); printf("\n\n游戏规则: \n-----1.请输入大于0的人数以保证船上的人不为空-----\n"); printf("-----2.请输入的死亡数字限不能大于船上的人数-----\n"); system("pause"); system("cls"); while(x=='y') { LinkList*L=NULL; printf("请输入参与游戏的人数: \n"); scanf("%d",&t); T=t; while(t<=0) { printf("输入错误,请重输\n"); scanf("%d",&t); T=t; } printf("请输入死亡数字: \n"); scanf("%d",&k); while(k<=0) { printf("输入错误,请重输\n"); scanf("%d",&k); } while(k>T) { printf("输入有误请重输\n"); printf("请输入参与游戏的人数: \n"); scanf("%d",&t); T=t; printf("请输入死亡数字: \n"); scanf("%d",&k); } printf("******************************************\n"); printf("参与游戏的人员编号如下: \n"); L=CreateList(L);//调用创建链表函数 ListDelete(L,t);//调用删除函数 printf("******************************************\n"); printf("是否继续游戏(是: 请输入y否: 请输入其它)"); getchar(); scanf("%c",&x); system("pause"); system("cls"); } } 6.2参考文献 [1]李春葆.数据结构教程[M].清华大学出版社.2002. [2]唐皓强.C语言程序设计[M].清华大学出版社1997. 7.评分表 计算机与通信学院课程设计评分表 课程名称: 数据结构 项目 评价 设计方案的合理性与创造性 设计与调试结果 设计说明书的质量 答辩陈述与回答问题情况 课程设计周表现情况 综合成绩 教师签名: 日期:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 生死 游戏 数据结构