1、沈 阳 工 程 学 院课 程 设 计设计题目: 数据结构及算法的设计与实现 系 别 信息系 班级 学生姓名 学号 指导教师 职称 起止日期:2009年12月28日起-至2010年1月8日止沈 阳 工 程 学 院计算机组成原理课程设计成绩评定表系(部): 信息工程系 班级: 学生姓名: 指 导 教 师 评 审 意 见评价内容具 体 要 求权重评 分加权分调研论证能独立查阅文献,收集资料;能制定课程设计方案和日程安排。0。15432工作能力态度工作态度认真,遵守纪律,出勤情况是否良好,能够独立完成设计工作, 0。25432工作量按期圆满完成规定的设计任务,工作量饱满,难度适宜。0.25432说明书
2、的质量说明书立论正确,论述充分,结论严谨合理,文字通顺,技术用语准确,符号统一,编号齐全,图表完备,书写工整规范。0。55432指导教师评审成绩(加权分合计乘以8) 分加权分合计指 导 教 师 签 名: 年 月 日评 阅 教 师 评 审 意 见评价内容具 体 要 求权重评 分加权分查阅文献查阅文献有一定广泛性;有综合归纳资料的能力0。25432工作量工作量饱满,难度适中.0.55432说明书的质量说明书立论正确,论述充分,结论严谨合理,文字通顺,技术用语准确,符号统一,编号齐全,图表完备,书写工整规范。0.35432评阅教师评审成绩(加权分合计乘以4)分加权分合计评 阅 教 师 签 名: 年
3、月 日答 辩 小 组 评 审 意 见评价内容具 体 要 求权重评 分加权分学生汇报汇报准备充分,思路清晰;语言表达准确,概念清楚,论点正确,有层次,有重点,基本上反映了所完成任务的全部内容;时间符合要求。0.55432答 辩思路清晰;回答问题有理论依据,基本概念清楚;主要问题回答准确,深入,有说服力。0。55432答辩小组评审成绩(加权分合计乘以8)分加权分合计答辩小组教师签名: 年 月 日数据结构课程设计任务书一、 设计目的数据结构是计算机专业的核心课程,是一门实践性很强的课程。课程设计是加强学生实践能力的一个强有力手段,要求学生掌握数据结构的应用、算法的编写、类C语言的算法转换成C(C+)
4、程序并上机调试的基本方法,还要求学生在完成程序设计的同时能够写出比较规范的设计报告.严格实施课程设计这一环节,对于学生基本程序设计素养的培养和软件工作者工作作风的训练,将起到显著的促进作用.二、设计要求1、课程设计题目每组三题,每个学生必须独立完成;2、课程设计时间为2周;3、设计语言C(C+)不限;4、课余时间完成源程序和课程设计报告等文档书写工作,上机时间只能做调试工作。上机时带上源程序、数据结构教材、C语言教材.5、上机任务1)选择合适的数据结构,并定义数据结构的结构体;2)根据程序所要完成的基本要求,设计出完整的算法;3)设计出主程序(main函数),使其成为完整的程序。 6、上机时间
5、:按照实验室上机时间安排计划执行 7、无论在校外、校内,都要严格遵守学校和所在单位的学习和劳动纪律、规章制度,学生有事离校必须请假。课程设计期间,无故缺席按旷课处理;缺席时间达四分之一以上者,其成绩按不及格处理。三、报告书写格式1封皮2成绩单3任务书4目录5正文6参考文献四、成绩评定评定成绩根据课程设计表现、成绩测验、课程设计报告等进行综合评定。评定等级:不及格、及格、中、良好、优秀。五、设计题目设计题目一 教学计划安排检验程序(拓扑排序)【问题描述】针对学院的计算机系本科课程,根据课程之间的依赖关系,制定课程安排计划,并满足各学期课程数大致相同。按照用户输入的课程数,学期数,课程间的先后关系
6、数目以及课程间两两间的先后关系,程序执行后会给出每学期应学的课程。(1)输入的形式和输入值的范围:输入间用空格隔开。要求用户输入的课程数小于20,学期数小于或是等于8,课程名的长度小于等于10个字符。(2)程序所能达到的功能:按照用户的输入,给出每学期应学的课程。(3)测试数据:输入:学期数:,课程数:12,课程间的先后关系数:16,课程的代表值:v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12。课程间两两间的先后关系:v1 v2,v1 v3, v1 v4,v1 v12,v2 v3,v3 v5,v3 v7,v3 v8,v4 v5, v5 v7,v6 v8,v9 v1
7、0, v9 v11 , v9 v12,v10 v12,v11 v6输出:第1学期应学的课程:v1 v9第2学期应学的课程:v2 v4 v10 v11第3学期应学的课程:v3 v6 v12第4学期应学的课程:v5 v8第5学期应学的课程:v7设计题目二 停车场问题【基本要求】停车场是一条可以停放n辆车的狭窄通道,且只有一个大门汽车停放安到达时间的先后依次由北向南排列(大门在最南端,最先到达的第一辆车停在最北端)若停车场已经停满n辆车,后来的汽车在便道上等候,一旦有车开走,排在便道上的第一辆车可以开入;当停车场的某辆车要离开时,停在他后面的车要先后退为他让路,等它开出后其他车在按照原次序开入车场,
8、每两停在车场的车要按时间长短缴费。 要求:以栈模拟停车场,以队列车场外的便道,按照从终端输入的数据序列进行模拟管理。每一组数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码、以及到达或离去的时刻。对每一组数据进行操作后的信息为:若是车辆到达,则输出汽车在停车场的内或便道上的位置:若是车辆离去则输出汽车在停车场内的停留时间和应缴纳的费用(在便道上的停留时间不收费)。栈以顺序结构实现,队列以链表结构实现.设计题目三 编写一个猜数字游戏,有一定的容错功能,界面友好,功能齐全。游戏规则:a,一个四位数,各位上的数字不重复,从1到9。b,按以下提示猜出这个四位数。c,每次猜测输入的数据给出类似
9、的提示AB。d,其中A前的代表你本次猜对了多少个数字。e,其中B前的代表你本次猜对的数字并且位置正确的个数。设计题目四 设计实现关键路径的程序设计内容与步骤选择合适的数据结构结点结构的设计算法设计与分析程序设计、实现、调试课程设计说明书进度安排设计工作4学时实现与调试12学时课程设计说明书4学时设计考核要求考勤20%课程设计说明书50答辩30%五、参考书目1 佟伟光,杨政 实用数据结构(第二版) 科学出版社2 严蔚敏 数据结构(C语言版) 清华大学出版社3 李保春编著,数据结构习题与解析,清华大学出版 2001年第一版4 徐孝凯编著,数据结构课程实验,清华大学出版 2002年第一版5 张乃笑编
10、著,数据结构与算法,电子工业出版社 2004年10月6 王卫东编著,数据结构辅导课,西安电子科技大学出版社 2001年7 陈文博 朱青著,数据结构与算法,机械工业出版社 1996年8 赵文静等编,数据结构辅导,西安交通大学出版社 1999年摘 要 “数据结构”是一门专业技术基础课。它的教学要求是:学会分析研究计算机加工的数据结构的特征,以便为应用涉及的数据选择适当的逻辑结构、存储结构及其相应的算法,并初步掌握算法的时间分析和空间分析的技术.另一方面,本课程的学习过程也是复杂程序设计的训练过程,要求学生编写的程序结构清楚和正确易读,符合软件工程的规范。在学习中,先要学习程序设计课程的目的掌握设计
11、程序的思路,学习会用计算机语言编写程序,以实现所需要处理的任务。要正确处理算法与语法的关系,算法是程序的核心、是灵魂,语法是外壳、是工具。不应把学习重。点放在语法规则上,语法是重要的,不掌握语法规则就无法编写出正确的程序.一定要把重点放在解题的思路上,通过思考,和大量的阅读,来构造一个完整的程序.请记住:重要的是学会编程,而不是背语法。程序设计是为了锻炼我们的实际动手能力,在一定程度上,又增加了我们的各方面的知识,特别是一些联系实际的课程设计,它的完成需要自己平时积累的大量知识、并且需要勤于思考的能力和无限的激情。本次课设主要是学习程序设计的方法,进行程序设计的基本训练,大多数的学生应该把精力
12、放在最基本,最常用的内容上,学好基本功。最后,感谢老师在我们程序设计的过程中辛勤的指导和不倦的教诲。关键词 :线性表,栈和队列,二叉树,图,查找,排序目 录数据结构及算法课程设计成绩评定表。.。课程设计任务书.。摘要。.。1.停车场问题。21.1问题分析.。21.2数据结构与算法分析.21。3。核心代码。41。4运行结果112。关键路径的程序。.。.。.142.1问题分析。.。.142.2数据结构与算法分析.。.142.3核心代码152.4运行结果193。教学计划安排检验程序(拓扑排序).213.1问题分析.。.213。2数据结构与算法分析 。.213。3核心代码223。4运行结果.。274.
13、猜数字游戏.。294。1问题分析.,.。294。2数据结构与算法分析.。.294.3核心代码。.。294。4运行结果33结论.。.35致谢.。.。.361停车场问题1。1问题分析 停车场是一条可以停放n辆车的狭窄通道,且只有一个大门汽车停放安到达时间的先后依次由北向南排列(大门在最南端,最先到达的第一辆车停在最北端)若停车场已经停满n辆车,后来的汽车在便道上等候,一旦有车开走,排在便道上的第一辆车可以开入;当停车场的某辆车要离开时,停在他后面的车要先后退为他让路,等它开出后其他车在按照原次序开入车场,每两停在车场的车要按时间长短缴费。 要求:以栈模拟停车场,以队列车场外的便道,按照从终端输入的
14、数据序列进行模拟管理。每一组数据包括三个数据项:汽车“到达或“离去信息、汽车牌照号码、以及到达或离去的时刻.对每一组数据进行操作后的信息为:若是车辆到达,则输出汽车在停车场的内或便道上的位置:若是车辆离去则输出汽车在停车场内的停留时间和应缴纳的费用(在便道上的停留时间不收费)。栈以顺序结构实现,队列以链表结构实现。1。2数据结构与算法分析 本任务要求应用动态存储结构,并且需要两个栈和一个队列,栈用来模拟停车场,队列模拟便道。栈的特点是后进先出,队列的特点是先进先出。本任务应用了C语言中的类来自定义头文件,将任务分成多个的模块,增强了可读性和简单性,同时为日后的编写,调试,维护提供了极大地方便。
15、该程序的基本流程图如图1-1所示。主要流程图如图12所示。图11 基本流程图图1-2 主流程图1.3核心代码include#includestring.hdefine MAX 2/车库容量 为了便于观察这里把车库容量设置为2#define price 0.05 /每分钟每辆车的费用typedef struct time int hour; int min;Time;/时间结点typedef struct nodechar num10; Time reach; Time leave;CarNode;/车辆信息结点typedef struct NODE CarNode *stackMAX+1; i
16、nt top;SeqStackCar;/模拟车站typedef struct car CarNode *data; struct car *next;QueueNode;typedef struct Node QueueNode *front; QueueNode rear;LinkQueueCar;/模拟通道/*定义方法/void InitStack(SeqStackCar);/初始化车站int InitQueue(LinkQueueCar);/初始化便道int Arrival(SeqStackCar*,LinkQueueCar*);/车辆到达void Leave(SeqStackCar,S
17、eqStackCar,LinkQueueCar);/车辆离开void List(SeqStackCar,LinkQueueCar);/显示存车信息/主函数/void main() SeqStackCar Enter,Temp; LinkQueueCar Wait; int ch; InitStack(&Enter);/构造一个空栈 InitStack(Temp);/ InitQueue(&Wait);/构造一个空队列 while(1) /printf(”n请选择:1 2 3 4n”); printf(n& 1。 车辆到达 & ); printf(”n& 2. 车辆离开 &); printf(n
18、& 3. 列表显示 &); printf(n& 4。 退出系统 &n”); scanf(”d”,ch); if(ch1&ch4)/当不符合要求时重新进行选择 break; else /否则则进行方法的操作 switch(ch) case 1: Arrival(&Enter,&Wait);break;/车辆到达的操作 case 2: Leave(&Enter,&Temp,&Wait); break;/车辆离开的操作 case 3: List(Enter,Wait); break;/列表显示的操作 case 4: exit(0);/退出系统的操作 default: break; /车场的初始化 栈
19、/ void InitStack(SeqStackCar s)/ int i; s-top=0;/栈为空 for(i=0;i=MAX;i+) s-stacks-top=NULL;/初值为空/便道的初始化 队列的链式结构*/ int InitQueue(LinkQueueCar Q) Q-front=(QueueNode*)malloc(sizeof(QueueNode); if(Qfront!=NULL) Qfront-next=NULL;/队列头结点为空 Qrear=Qfront; return (1); else return (0); /*离站所进行的操作*/ void PRINT(Ca
20、rNode *p,int room) int A1,A2,B1,B2; printf(”n请输入离开的时间:); scanf(”%d:d”,&(pleave。hour),&(p-leave。min)); printf(”n离开车辆的车牌号为:”); puts(pnum); printf(”n其到达时间为:%d:%d,p-reach.hour,preach。min); printf(”离开时间为:d:d,p-leave。hour,p-leave。min); A1=preach。hour; A2=preach.min; B1=pleave.hour; B2=pleave.min; printf(n
21、应缴费用为:%2。1f元,((B1A1)*60+(B2A2)price); free(p);/*车辆到达/ int Arrival(SeqStackCar *Enter,LinkQueueCar *W) CarNode p; QueueNode *t; p=(CarNode )malloc(sizeof(CarNode);/生成结点 /flushall();/清除所有缓冲区 printf(n请输入车牌号:”); scanf(%s”,&p-num);/得到车牌号 if(Entertoptop+;/top指针加一 printf(n车辆在停车场内的第d位置”,Enter-top); printf(”
22、n请输入到达时间:); scanf(d:d,(preach。hour),(p-reach.min)); EnterstackEnter-top=p;/车辆进栈 return (1); else printf(”n该车须在便道等候!”); t=(QueueNode)malloc(sizeof(QueueNode)); tdata=p;/把车辆信息存入队列的结点 即车辆停在便道 tnext=NULL;/t结点的下一个结点为空 W-front-next=t;/头指针的下一个为t W-rear=t;/尾指针指向t return (1); /*出栈/ void Leave(SeqStackCar Ent
23、er,SeqStackCar Temp,LinkQueueCar *W) int i,room; CarNode p,t; QueueNode q; /判断车场内是否有车/ if(Enter-top0) while(1) printf(”n请输入车在车场的位置:,Enter-top); scanf(”d,room); if(room1&room=Entertop) break; while(Enter-toproom) Temptop+;/top指针加一 TempstackTemptop=Enter-stackEntertop;/把停车场里的车放 入temp中 EnterstackEntert
24、op=NULL;/把停车场里的位置清空 Enter-top-;/top指针减一同时 p=EnterstackEntertop; Enter-stackEntertop=NULL; Enter-top; while(Temptop=1) Entertop+;/当车出去后原来的车回到停车场 Enter-stackEnter-top=TempstackTemptop; Temp-stackTemptop=NULL; Temptop-; PRINT(p,room);/离开停车场的信息 if(W-front!=W-rear)&Enter-topfront-next;/把便道里的车赋给q t=qdata;
25、/车的信息赋给t Enter-top+; printf(n便道的s号车进入车场第%d位置。,tnum,Enter-top); printf(n请输入现在的时间:”); scanf(d:%d,(t-reach。hour),&(t-reach.min)); Wfrontnext=qnext;/头指针指向q的下一个 if(q=Wrear)/如果便道里没车 Wrear=W-front;/清空 EnterstackEnter-top=t;/进入停车场 printf(n便道里没车n); free(q); break; else printf(n车场里没车。”); break; /*列表的显示信息*/ vo
26、id List1(SeqStackCar *s) int i; if(stop0) printf(n车场); printf(n位置 到达时间 车牌号n”); for(i=1;i=stop;i+) printf(”d%10d:d %sn, i, s-stackireach.hour, sstacki-reach.min,s-stacki-num); / puts(s-stacki-num); else printf(”n车场里没车”); /便道里的信息/ void List2(LinkQueueCar w) QueueNode *p; p=wfrontnext; if(wfront!=wrear
27、) printf(”n等待的车辆的号码为:); while(p!=NULL) puts(p-data-num); printf(”n); p=pnext; else printf(n便道里没有车。”); /void List(SeqStackCar s,LinkQueueCar w) int flag,m;flag=1; while(flag) printf(n请选择 1 2 3); printf(n1。车场 n2.便道 n3.返回”); while(1) scanf(”d,m); if(m=1|m=3) break; else printf(n”); switch(m) case 1: Li
28、st1(&s); break; case 2: List2(&w); break; case 3: flag=0; break; default: break; 1.4运行结果1。运行程序,打开停车场主菜单,如图13所示。图1-3 主菜单2。根据菜单提示,输入“1”,然后输入停车车牌“辽A888888”和时间“8:30,如图1-4所示。图14 输入停车信息3.程序默认两个车道,当要求继续停车时,就停入便道里,如图15所示。图15 便道停车4.根据提示,输入“3后,再分别输入“1”和“2”,输出车道信息和便道信息,分别如图1-6和1-7所示。图16 车道信息图17 便道信息5.返回主菜单后,输入
29、“2,然后输入车离开的位置和时间,便显示车离开的信息费用以及便道的车进入车道要求输入信息,如图18所示,完成后便显示便道车的信息,如图19所示.图18 车离开图19 便道车进入停车场2 关键路径2。1问题分析关键路径(CPM)是管理科学中的一个重要方法,广泛应用于大型工程计划工作,也称之为“统筹法”。关键路径法采用边表示活动的网络,简称为AOE网络。AOE网络是一个带权的有向无环路图,其中,每个顶点代表一个事件,事件说明某些活动或某些活动的完成,即阶段的结果。通常,利用AOE网络可以研究一下两个问题:完成整个工程至少需要多少时间哪些活动是影响工程进度的关键但是完成整个工程所需的时间取决于从开始
30、点到结束点的最长路径长度,此长度最大路径称作为关键路径.2.2数据结构与算法分析 首先得构造一个图来存储整个工程的顶点数和活动数。在描述关键路劲的算法时,设a活动由弧(j,k)表示,要确定如下几个相关的量:事件V的最早出现时间和活动的最早开始时间,从源点v1到顶点v的最长路径长度称作事件j的最早出现时间,表示成ej。活动a的最迟开始时间:在不影响整个工程按时完成的前提下,此项活动最迟的必须开始时间,表示成Li。只要某活动a有Li=ei的关系,就称a为关键活动。事件j的最迟出现时间:事件j在不延误整个工程的前提下允许发生的最迟时间,表示为Lj。对某条指向顶点V的边所代表的活动a 可得到Li=Lj(活动a所需时间)。该程序的主要流程图如图2-1所示.图21 关键路径主要流程图2。3核心代码#includestdio。h#includeincludeiomanip。hinclude process。htypedef struct node int adjvex; int dut; struct node *next;edgenode;typedef struct int projectname; int