数据结构课程设计报告 2Word下载.docx
《数据结构课程设计报告 2Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告 2Word下载.docx(38页珍藏版)》请在冰豆网上搜索。
{
charname[MAX];
//客户姓名
intticketnum;
//客户订票量
charrank[MAX];
//舱位等级
intticket[MAX];
//记录座位号
}Client;
//客户信息
intNO;
//座位号
intflag;
//标记是否被买
}Ticket;
typedefstruct
intfID;
//航班号
charfModel[MAX];
//航班机型
charairFrom[MAX];
//起飞机场
charairTo[MAX];
//降落机场
charweek[MAX];
//起飞时间
charstart[MAX];
charend[MAX];
//降落时间
chartime[MAX];
//飞行时长
floatprice;
//价格
intcount;
//成员定额
intrest;
//余票量
Clientclient[MAX];
//购买该趟航班所有客户信息
intclientnum;
//购买该趟航班的客户数量
}DataType;
//航班数据类型
typedefstructnode
DataTypedata;
Ticketticket[100];
structnode*next;
}SLNode;
b.候补队列结构体:
候补队列没有采用队列,而是采用链表,只是添加数据时在末尾添加,删除数据在首部添加。
//候补客户名称
intnumber;
//候补客户订票量
//候补客户订购的航班号
}QDataType;
//候补信息
typedefstructqnode//候补客服信息链表仿队列
QDataTypedata;
structqnode*next;
}ListQueue;
(2)算法设计
该系统包含五项基本功能:
添加航班,查找航班,删除航班,订票,退票。
添加航班:
输入航班基本信息,申请空间,将客户信息插入链表结尾。
删除航班:
根据输入的航班号在链表里搜索,找到后将该节点删除。
查找航班:
包括按航班号查询,按起点站、终点站查询,按日期查询。
算法均类似,在链表里搜索查询条件,并将航班信息输出,如果搜索到表尾均没有,表示没有该趟航班信息。
订票业务:
根据客户输入的航班号和订票量,在航班信息表中搜素,没有则提示错误,并返回。
有则比较航班的余票量是否满足客户的需求,满足则为该客户订票,将该客户信息存入该趟航班节点中,并检索座位号信息是否被订过,将没有被订的座位号输出,并将该客户的余票量改变。
若不满足客户需求,询问客户是否需要进入候补队列等待买票,客户需要则将该客户的信息存入候补队列中,有客户退票并满足即可订票,不需要就返回。
退票业务:
先提示客户输入航班号和名称,在航班信息里搜索,检查客户输入的信息是否正确(该客户是否存在,该客户退的票数是否比定的票数少或者相等),输入错误就提示并输出,输入正确,若输入的票数和客户订购的票数相等,则将该客户的信息从链表中删除,并将该客户的座位号退回去(将该趟航班的这几个座位号标识记为未定),将订购该趟航班的客户数量加一;
若输入的票数比客户订购的票数少,则将该客户后面部分的票退回去,并将该趟航班的余票量减少,最后将该客户订购的票数减少。
退票就完成了。
然后检索候补队列的信息,依次询问客户是否需要订票,若满足则订票,不满足就询问下一个。
最后添加了一点打印功能,可以将购买某趟航班的客户信息打印出来,以及打印候补队列客户信息,方便随时查询内存情况。
2.设计表示:
(1)函数调用关系图:
(2)函数接口规格说明:
voidSLNodeInit(SLNode**head)//链式表存储航班信息
intSLNodeInsert(SLNode*head,DataTypex)//插入节点
voidSLNodeFirst(SLNode*head)//初始化2趟航班
intSLnodeLength(SLNode*head)//求链表长度
voidListQueueInit(ListQueue**head)//候补客户链表初始化
intListQueueLength(ListQueue*head)//链表长度
ListQueue*ListQueueFind(ListQueue*head,intnumber,intfid)
//按照航班号和票数在链表里查找
voidListQueueDel(ListQueue*head,ListQueue*node)//删除该节点
ListQueue*ListQueueInsertLast(ListQueue*head,charname[],intfid,intnumber)
//客户信息插入候补末尾
SLNode*FlightAdd(SLNode*head)//添加航班
voidFlightPrint(SLNode*head)//打印出航班信息
voidFlightDelete(SLNode*head)//删除航班
voidListQueuePrint(ListQueue*head)//候补名单打印
voidClientFind(SLNode*head,intfid)//查找订购某趟航班的客户信息
intBackFind(SLNode*head,intfid,charname[],intnu//判断退票客户信息是否有误
voidFlightIDFind(SLNode*head,intfid)//按航班号查询
voidFlightStartFind(SLNode*head,charstart[])//按起飞机场查询
voidFlightEndFind(SLNode*head,charend[])/按着陆机场查询
voidFlightDateFind(SLNode*head,chardate[])//按星期查询
ListQueue*TicketOrder(SLNode*head,intfid,inttknum,ListQueue*SS)
//订票
voidTicketBack(SLNode*head,intfid,inttknum,charname[],ListQueue*S)
//退票
3.详细设计:
(1).调试分析:
a.首先写程序我没有把客户信息保存下来,而是单独用一个链表保存,后来写到后面遇到瓶颈,又改为每趟航班都保存客户信息。
b.退票业务没有根据客户姓名退票,在老师的指点下,退票将客户信息与链表中的客户信息对比,输入没有错误才可以退票。
c.座位号是后来老师指点下设置标记为存起来,每次订票和退票都修改标志位,这样座位号才是联系起来的。
(2).用户手册:
a.按照提示输入数据,一定注意数据的格式和数据的个数。
b.输入数据最好先保存在文档中,再复制,不然输入错误一个肯能导致程序运行错误。
(3).测试数据及测试结果:
添加的两趟航班信息:
按航班号查询航班信息:
查询候补客户信息:
退票后为候补客户订票
查询购票客户信息:
题目5:
铁路网最佳经由问题
1.需求分析
铁路运输网络中有铁路线和火车站两个主要概念,譬如:
1号铁路线表示京广线,2号铁路线表示京沪线等。
铁路线对象包括铁路线编号、铁路线名称、起始站编号、终点站编号、该铁路线长度、通行标志(00B客货运禁行,01B货运通行专线,10B客运通行专线,11B客货运通行)。
火车站对象包括所属铁路线编号、车站代码、车站名、车站简称、离该铁路线起点站路程及终点站路程。
要求:
(1)查询某站所属的铁路线。
(2)要求具备新增铁路线的管理功能。
(3)要求具备新增车站的管理功能。
(4)针对客运、货运情况能计算任何一个起始车站到任何一个终点站之间的最短路径。
并且要求能够显示出该最短路径的各个火车站的经由顺序。
(5)能输出全部线路及沿途站点。
二.设计
铁路线采用动态链表存储,包括铁路线编号、铁路线名称、起始站编号、终点站编号、该铁路线长度、通行标志(00B客货运禁行,01B货运通行专线,10B客运通行专线,11B客货运通行)
结构体如下:
intrID;
//铁路线编号
//铁路线名称
intstartID;
//起始站站点编号
intendID;
//终点站编号
longlength;
//铁路线长度
charsign[3];
//通行标志
//铁路线数据
structnode*next;
//铁路线节点
所有站点采用邻接表存储,邻接表的下一个节点包括该站点的站点代码和距离上一个站点的距离,结构体如下:
typedefstructNode2
intsID;
//站点代码
longweight;
//前一个站到这站的距离
structNode2*next;
}Edge;
//两个站点之间的边
typedefstructNode1
intbelong[MAX];
//站点所属的铁路线
introutecount;
//站点所属的铁路线数量
char*name;
//站点名称
char*shortname;
//站点简称
longstartDis;
//距离起始站的距离
longendDis;
//距离终点站的距离
//记录它在数组的第几个位置,方便深度优先算法用
Edge*adj;
//邻接边头指针
}SDataType;
//站点数据
SDataTypedata[MAX];
//每个站点的数据
//记录站点个数
}GNode;
//图节点
(2)算法设计:
该系统采用动态链表存储所有铁路线信息,但是包括的站点只是起点站和终点站,以及该铁路线所有其他信息,铁路线所以站点(包括起点站和终点站)单独采用图的邻接表存储。
系统包括项功能:
添加铁路线,查看铁路线,添加站点,显示全部站点信息及沿途站点,找到任意两点间的最短距离。
添加铁路线:
根据输入的铁路线信息,检查这两个站点是否已经存在,若不存在,申请内存,将数据存入并插入到链表的末尾。
并将两个站点所属的铁路线加入所属铁路线数组中,所属铁路线数量递增。
若存在,则只添加该站点所属的铁路线,并修改邻接表的相关信息。
查询铁路线:
在链表中一次循环,将铁路线信息输出,链表为空则提示错误。
添加站点:
输入站点所属的铁路线,站点信息,上一站代码,距离上一站点的距离,下一站代码,距离下一站点的距离。
先查看是否存在该站点,存在则只修改所属的铁路线,并修改邻接表的相关信息。
显示全部铁路线及沿途站点:
在铁路线链表中依次搜索铁路线信息,并在站点中搜寻,若属于该铁路线就输出这个站点的信息,当搜索到表尾时,就可以输出全部铁路线信息,同时该系统还采用图的深度优先遍历算法输出全部站点信息。
找到任意两点间的距离:
题目要求按照铁路通行情况找到任意两点间的距离,但是我只是采用弗洛伊德算法找到任意两点间的最短距离,后来经老师指点可以将全部站点导出各种通行情况,再用弗洛伊德算法,但是由于时间较短,还没有弄出最终结果,目前只能实现寻找任意两点间的最短距离及经过的沿途站点。
(1).函数关系调用图:
(2).函数接口说明:
#include"
Graph.h"
//站点相关信息
SLNode.h"
//铁路线相关信息
Print.h"
//输出相关信息
voidSLNodeInit(SLNode**head)//初始化链表
voidAddRoute(SLNode*head,intrID,charname[],intstartID,char*sn,char*ss,intendID,char*en,char*es,longlength,charsign[],GNode*G)//添加铁路线
voidPrintRoute(SLNode*head,GNode*G)//输出所有铁路线信息
voidGraphInit(GNode**G)//图初始化
voidAddStation(GNode*G,SLNode*head,intbelong,intsid,char*sn,char*ss,intpreID,longpreDis,intlaterID,longlaterDis)//添加站点
intFirstVertex(GNode*G,intv)//求V的邻接节点
intNextVertex(GNode*G,intv,intw)//求V的临界点w的第一个节点
voidDepthFSearch(GNode*G,intv,intvisited[],voidVist(intsid))//深度优先算法
voidDepthFirstSearch(GNode*G,voidVisit(intsid))//无向图的深度优先算法
2.详细设计:
采用动态链表存储所有铁路线信息,但是包括的站点只是起点站和终点站,以及该铁路
线所有其他信息,铁路线所以站点(包括起点站和终点站)单独采用图的邻接表存储。
采用弗洛伊德算法找到任意两点间的最短距离,后来经老师指点可以将全部站点导出各种通行情况,再用弗洛伊德算法,但是由于时间较短,还没有弄出最终结果,目前只能实现寻找任意两点间的最短距离及经过的沿途站点。
3.调试分析:
a.添加站点信息比较麻烦一点,因为可能要添加的站点已经存在,先要搜索站点,没有则添加,即使有了,还要添加站点所属的铁路线信息。
并且根据站点相邻的站点,要将整个图串联起来,还要算出各个站点间的距离。
b.求两点间的距离采用弗洛伊德算法,但是我存储数据用了邻接表存储,没有找到相应的站点编号,后来在每个新加入的站点中添加编号,根据编号导出二维数组,才能采用弗洛伊德算法求解。
c.根据弗洛伊德算法求出path路径后,我不知道怎么输出所经过的站点,在网上搜索各种方法,终于找到一种方法可行,就是要递归调用path,最终才得到正确的答案。
4.用户手册:
a.添加信息注意数据的格式和数量,否则程序运行会出错,最好用文档保存下来,再复制。
b.添加站点信息,需要提供所属的铁路线,它的上一个站点信息,距离上一站的距离,还要输入它下一个站点的站点信息和距离下一个站点的距离。
c.查找最短距离,还没有分客货运情况,有一点小遗憾,目前只能查看可以通行的路线最短距离。
5.测试数据及测试结果:
这是我用画图工具画出的铁路网信息图(圆圈表示站点代码)
添加铁路线信息:
所有铁路线信息:
添加站点信息:
查询某站信息:
所有站点信息:
查找两点间的最短距离和经过的站点:
题目8:
学生成绩管理系统
学生成绩管理是高等学校教务管理的重要组成部分,主要包括学生注册、考试成绩的录入及修改、成绩的统计分析等等。
设计一个系统实现对学生成绩的管理。
要求系统应具有以下基本功能:
(1)学生注册登记;
(2)增加、删除某一班级的学生;
(3)成绩录入:
输入学生的考试成绩;
要求采用二叉排序树存放学生成绩,一门课程对应一棵二叉排序树;
(4)成绩修改:
若输入错误可进行修改;
(5)统计分析:
对某个班级学生的单科成绩进行统计,求出平均成绩;
求出成绩处于指定分数段内的学生人数;
求出每个学生一学期各科的平均成绩等;
(6)查找:
查找某个学生的某门课程成绩,查找某门课程成绩处于指定分数段内的学生名单等等。
(7)打印:
打印一个班级学生的单科成绩;
打印某一课程成绩处于指定分数段内的学生名单;
打印学生在某一学期的成绩报告单。
1.设计思想:
(1)数据结构设计:
该系统采用链表存储所有学生信息,每个节点表示一个学生信息,包括学生的姓名,班级,学号(唯一),成绩。
其中成绩用采用链表存储,可以动态添加科目及该学生该科目的成绩。
链表结构体如下:
charsubjectname[MAX];
//科目名称
intsorce;
//分数
}DataTypeSub;
typedefstructnode3
DataTypeSubdata;
structnode3*next;
}Subject;
//学生科目和成绩的链表
Subject*subject;
}Grade;
//科目成绩
//学号
//姓名
intcls;
//班级
Gradegrade;
//成绩
//学生信息
typedefstructnode
//学生信息管理链表节点
成绩采用二叉排序树,一科成绩对应一科排序二叉树,但是由于科目可以动态添加,所以我只用了一科树,要查看某科目的排序情况,需要输入科目名称,从链表中取出该科目的成绩,并排出二叉排序树,要查看下一刻目,再输入科目名称,再打印出来。
二叉树结构体如下:
typedefstructnode2
intdata;
structnode2*leftChild;
structnode2*rightChild;
}BiTreeNode;
该系统包括以下几个模块:
注册学生信息:
根据输入的学生学号,姓名,班级,将该学生查询链表末尾,其中学号是唯一的,若存在重复的会提示出错误。
查询所有学生信息:
遍历链表,并输出信息
删除学生信息:
根据提供的要删除的学生学号,在链表中找到信息,并删除节点。
添加成绩:
提示用户输入学生学号,科目名称,并将成绩存入链表相关位置。
修改成绩:
在链表中找到该学生的科目名称,并修改成绩。
打印某一个班级的单科成绩:
遍历链表,找到班号,输出全部学生成绩。
打印某一科目处于指定分数段的学生名单和数目:
这里采用在链表中求名单的方法,不足之处就是没有采用二叉树前序遍历。
打印某一学生本学期的成绩单及平均成绩:
在链表中找到相关学生的信息,并全部输出,同时求出平均成绩。
查找某一学生某一科目的成绩:
在链表中找到相关信息并输出。
将某一科目成绩存入二叉排序树并打印:
这里是先将要打印的科目名称写出来,根据科目名称,取出链表中的全部成绩,并排序,最后打印出来。
相关头文件:
#include"
Student.h"
//学生相关信息
Grade.h"
//成绩相关信息
//要输出的相关函数
Tree.h"
//二叉排序树并打印相关函数
voidSLNodeInit(SLNode**head)//初始化学生信息链表
voidStudentAdd(SLNode*head,intsid,charname[],intcls)//注册学生信息
voidStudentPrint(SLNode*head)//显示所有学生信息
voidStudentDelete(SLNode*head,intsid,intcls)//按学号查删除某个班级的学生
voidStudentSubject(SLNode*head,intsid,charsubjectname[])
//查找某个学生某门科目的成绩
voidS