1、图的遍历过程演示课程设计报告 姓名:常建明 学号:131842311 设计题目 : 图的遍历 设计题目 :航空订票系统目 录1图的遍历 1 图的遍历过程演示的要求 2 设计思路 3 详细设计 4 设计与调试分析 2航空订票系统 1 问题的要求 2 问题描述 3 设计思路 4 主要功能函数设计 5 编码实现 6 运行与测试 图的遍历图的遍历过程演示的要求设计程序完成如下功能:对给定的图结构和起点,产生深度优先遍历和广度优先遍历序列,并给出求解过程的动态演示。 设计思路首先由于程序中要有对图的数据信息的创建,定义一个全局变量Max,表示最多建立的结点数。设计实现主要功能的函数有:创建图的数据信息的
2、函数CreateMGraph();深度优先遍历递归函数DFSM();广度优先遍历递归BFSM;深度优先遍历DFSTraverseM();广度优先遍历BFSTraverseM();然后在main()函数中使用一个switch()语句实现对各个子函数的调用。抽象数据类型队列的定义如下:ADT Queue 数据对象:D=ai| ai ElemSet,i=1,2,3,n,n0数据关系:R1=| ai-1,ai D,i=1,2,3,,n 约定其中a1端为队列头,an端为队列尾。基本操作:InitQueue(&Q) 操作结果:构造一个空队列Q。DestroyQueue(&Q) 初始条件:队列Q已存在。 操
3、作结果:队列Q被销毁,不再存在。ClearQueue(&Q) 初始条件:队列Q已存在。 操作结果:将Q清为空队列。QueueEmpty(Q) 初始条件:队列Q已存在。 操作结果:若Q为空队列,则返回TRUE,否则FALSE。QueueLength(Q) 初始条件:队列Q已存在。操作结果:返回Q的元素个数,即队列的长度。GetHead(Q,&e) 初始条件:Q为非空队列。 操作结果:用e返回Q的对头元素。EnQueue(&Q,e) 初始条件:队列Q已存在。 操作结果:插入元素e为Q的新的队尾元素。DeQueue(&Q,&e) 初始条件:队列Q已存在。 操作结果:删除Q的对头元素,并用e返回其值。
4、QueueTraverse(Q,visit() 初始条件:Q已存在且非空。 操作结果:从对头到对尾,依次对Q的每个数据元素调用函数visit()。一旦visit()失败,则操作失败。详细设计 #include/*头文件*/#include#define Max 10#define FALSE 0#define TRUE 1#define Error printf#define QueueSize 30typedef struct char vexsMax; int edgesMaxMax; int n,e;MGraph;/*以邻接矩阵作为图的存储结构*/int visitedMax;/*将vi
5、sitedMax定义为全局变量并分配最大空间*/ main() MGraph *G,a; char ch1; int i,j,ch2; G=&a; ch1=y;/*设置控制语句标志*/ while(ch1=y|ch1=Y) /*菜单栏*/ printf(n); printf(tt+图的遍历过程演示+n); printf(tt+ 选择菜单 +n); printf(tt+n); printf(tt+ 创建图的数据请按:1 +n); printf(tt+ 深度优先搜索请按:2 +n); printf(tt+ 广度优先搜索请按:3 +n); printf(tt+ 退出搜索请按:0 +n); print
6、f(tt+n); printf(ntt请选择菜单号(0-3):); scanf(%d,&ch2); getchar(); switch(ch2) case 1: CreateMGraph(G);/*选1创建一个新的图矩阵*/ break; case 2: DFSTraverseM(G);/*选2进入深度优先搜索*/ break; case 3: BFSTraverseM(G);/*选3进入广度优先搜索*/ break; case 0:/*选0结束搜索,退出程序*/ ch1=n; break; default: system(cls); printf(ntt输入有误!n); break; if(
7、ch2=1|ch2=2|ch2=3) printf(nntt );/*控制格式*/ typedef struct int front; int rear; int count; int dataQueueSize;CirQueue;/*定义队列的数据结构*/void InitQueue(CirQueue *Q) Q-front=Q-rear=0; Q-count=0; int QueueEmpty(CirQueue *Q) return Q-count=QueueSize;/*返回队列的最大长度*/ int QueueFull(CirQueue *Q) return Q-count=Queue
8、Size;/*返回队列的最大长度*/void EnQueue(CirQueue *Q,int x) if(QueueFull(Q)/*队列满则出错*/ Error(Queue overflow); else Q-count+;/*否则count+,将x进队*/ Q-dataQ-rear=x; Q-rear=(Q-rear+1)%QueueSize; int DeQueue(CirQueue *Q) int temp;/*定义整型的变量*/ if(QueueEmpty(Q)/*若为真则出错*/ Error(Queue underflow); else/*为假则count-,将队员出队*/ tem
9、p=Q-dataQ-front;/*用temp返回其值*/ Q-count-; Q-front=(Q-front+1)%QueueSize; return temp;/*返回出队元素值*/ void CreateMGraph(MGraph *G) int i,j,k;/*定义整型变量*/ char ch1,ch2;/*定义字符型变量*/ printf(n请输入顶点数,边数(格式:3,4):); scanf(%d,%d,&(G-n),&(G-e);/*输入图的顶点数和边数*/ for(i=0;in;i+) getchar(); printf(n请输入第%d个顶点序号,i+1); scanf(%c
10、,&(G-vexsi);/*输入顶点的序号*/ for(i=0;in;i+) for(j=0;jn;j+) G-edgesij=0;/*初始化矩阵*/ for(k=0;ke;k+) getchar(); printf(n请输入第%d条边的顶点序号(格式:i,j):,k+1); scanf(%c,%c,&ch1,&ch2);/*输入边的顶点序号*/ for(i=0;ch1!=G-vexsi;i+); for(j=0;ch2!=G-vexsj;j+); G-edgesij=1;/*有边则赋值为1*/ void DFSM(MGraph *G,int i) int j; printf(%c ,G-ve
11、xsi); visitedi=TRUE;/*标记visitedi*/ /*依次优先搜索访问visitedi的每个邻接点*/ for(j=0;jn;j+) /*若visitedi的一个有效邻接点visitedj未被访问过,则从visitedj出发进行递归调*/ if(G-edgesij=1&!visitedj) DFSM(G,j);void DFSTraverseM(MGraph *G) int i; printf(n 深度优先遍历序列:); for(i=0;in;i+) visitedi=FALSE;/*访问标志数组初始化*/ for(i=0;in;i+) if(!visitedi)/*对尚未
12、访问的顶点调用DFSM*/ DFSM(G,i); void BFSM(MGraph *G,int k) int i,j; CirQueue Q;/*定义一个队列Q,初始化队列为空*/ InitQueue(&Q); printf(%c ,G-vexsk);/*访问初始点,并将其标记已访问过*/ visitedk=TRUE; EnQueue(&Q,k);/*将以访问过的初始点序号k入队*/ while(!QueueEmpty(&Q)/*队列非空进行循环处理*/ i=DeQueue(&Q);/*将队首元素出队*/ for(j=0;jn;j+)/*依次搜索vexsk的每一个可能的邻接点*/ if(G-
13、edgesij=1 &! visitedj) visitedj=TRUE;/*标记vexsj已访问过*/ EnQueue(&Q,j);/*顶点序号j入队*/ void BFSTraverseM(MGraph *G) int i; printf(n 广度优先遍历序列:); for(i=0;in;i+) visitedi=FALSE;/*访问标志数组初始化*/ for(i=0;in;i+) if(!visitedi)/*对尚未访问的顶点调用BFSM*/ BFSM(G,i); 7)各个模块之间的调用关系如下:设计与调试分析从上面的算法和调用关系可以看出,这个程序的基本样子已经非常的清楚,但是真正的程
14、序中还要考虑各种限制条件。在调试过程中,程序中出现了许多的错误,有错误的调用、一些变量没有定义、等等。不断的对程序进行调试以得到最好的结果,程序中特别要注意的是类的对象作为作为参数时要注意如何去调用它,使程序有一个令人满意的结果,具体的调试是在上机过程中进行的,在编写程序的过程中主要有如下错误:1、在编写程序的过程出现了一些函数名、变量的大小写不统一的错误,导致程序在运行的过程中出现函数名、变量没有被定义等问题;2、在编写程序的过程中数组的大小写没有被确定;3、在编写程序的过程中一些变量没有被定义,导致程序出错;4、数组visitedMax应定义为全局变量,若不是则会出错;5、函数的返回类型要
15、确定,是void还是其他类型要十分注意;6、在编程的过程中,函数里一些控制语句的嵌套使用,括号要引起注意,这次的课程设计就有一些括号漏了或者多打了,导致括号不配套;创建数据就是把最开始要输入的数据输入到系统里。界面如下:按照深度优先搜索来遍历图。界面如下:按照广度优先搜索来遍历图。界面如下:重新创建另一个图的数据。界面如下:完成任务后,退出的界面如下: 航空订票系统问题的要求 设计航班信息,订票信息的存储结构,设计程序完成如下功能:录入:可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定)查询:可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票
16、价折扣,确定航班是否满仓);可以输入起飞抵达城市,查询飞机航班情况;订票:(订票情况可以存在一个数据文件中,结构自己设定)可以订票,如果该航班已经无票,可以提供相关可选择航班;退票: 可退票,退票后修改相关数据文件;客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。修改航班信息:当航班信息改变可以修改航班数据文件问题描述航空订票的业务活动一般包括查询航线信息、客票预订、办理退票等。每条航线所涉及的信息由:终点站名、航班号、飞机号、成员数额、余票量、已订票的客户名单。设计思路主要有三个方面的内容,查询航线信息、订票和退票业务。程序的基本功能有:(1)查询航线。根据旅客提出的终点站名输出下
17、列信息:航班号、飞机号、星期几飞行,最近一天航班的日期和余票数。(2)承办订票业务。根据客户提出的要求查询该航班票额情况,若有余票,为客户办理订票手续,输出座位号。若无票,则须重新询问客户要求。若需要,可登记排队等候。(3)退票业务。根据客户提供的情况,为客户办理退票手续,然后查询该航班是否有人排队等候,首先询问排在第一的客户,若所退票额能瞒住他的要求,则为他办理退票手续,否则依次询问其他排队候补的客户。主要功能函数设计(1)总航线信息预览:通过调用display()预览已经建立的全部航线的相关信息(航班号、飞机号 、终点站 、飞行日期 、 定额 、余票数 、排队等候人数),预览完返回主菜单。
18、(2)查询单条航线信息:根据乘客提出的终点站名或航班号调用Search()函数来查询并输出此条航线的相关信息(航班号、飞机号 、终点站 、飞行日期 、 定额 、余票数 、已订票乘客名单、排队等候乘客名单)。 并且查询完后询问乘客是否订票,是就调用订票Book()函数来为乘客进行订票,否就返回主菜单。(3)办理订票业务:客户先输入的终点站名、订票数、姓名信息再来调用订票Book()函数,Book()函数根据客户提供的终点站名查询到该航线信息,若客户订票额末超过余票量,订票成功并登记信息,在订票乘员名单链表中添加乘客的信息; 如果暂时余票数不足是,询问客户是否要排队等侯,如果是,则在排队等候的队列
19、中增加该乘客的订票信息。(4)办理退票业务:调用tuipiao()查询函数,根据客户提供的航线进行搜索根据客户提供的姓名到订票客户名单域进行查询。退票成功后,重新将航线名单域指向订票单链表的头指针。根据队列中从出的客户信息判断是否满足要求,如果满足,则将该客户的信息插入到乘客信息链表中。(5)录入航班信息:调用CreatPlane()函数,根据输入的航班的相关的信息(航班号、飞机号 、终点站 、飞行日期 、 定额 、余票数),将此航班加入到原来的航班组中。(6)退出系统编码实现#include#include#include#include#define MAXSIZE100typedef s
20、truct Cust /已订票乘客信息 char Name15; /乘客姓名 char number10; /乘客所乘飞机航班号 char end15; /乘客终点typedef struct waitNode /排队等候客户信息 char name15; /乘客姓名 int ticket; /乘客的订票数 struct waitNode *next;waitNode,*waitlink;typedef struct waitlink front; waitlink rear;waitQueue;typedef struct Plane /航班信息 char number10; /航班号 in
21、t planenum; /飞机号 char end15; /终点站 char date10; /飞行日期 int dinge; /成员定额 int tick; /剩余票数 int k; /排队等候的人数 Customer *first; /链接已订票客户 waitQueue Q; /链接候补客户PlaneLink;int Search(PlaneLink *p,int N) int i=0,Q; cout=n; cout 1.按终点站名查询n; cout 2.按航班号查询 n; cout_n; coutn; coutQ; if(Q=1) char end10; coutend; while(i
22、N) if(strcmp(pi.end,end)=0) /先查看是否存在到该站点的航班 coutn*您所查询的航班信息如下*n; cout_n; cout 航班号 飞机号 终点站 飞行日期 余票数n; cout pi.numbersetw(7)pi.planenumsetw(12)pi.endsetw(10)pi.datesetw(10)pi.tickendl; coutn=n; break; i+; else if(Q=2) char num10; coutnum; while(iN) if(strcmp(pi.number,num)=0) /查看是否存在该航班号的航班 coutn*您所查询
23、的航班信息如下:*n; cout_n; cout 航班号 终点 飞行日期 余票数n; cout pi.numbersetw(12)pi.endsetw(12)pi.datesetw(12)pi.tickendl; coutn=n; break; i+; display_s(p, i, N); /调用display_s()函数输出该航班的已订票乘客和排队等候乘客的名单信息 if(iN) /如果存在该航班,询问客户是否要预定 该航班的 机票 int j; coutj; if(j=1) char name10; int ticket; coutticketname; Book(p,pi.end,ti
24、cket, name, N); else cout 很抱歉,没有您查询的航班信息!n; return 0;int Book(PlaneLink *p,char end,int ticket,char name,int N) int i; for(i=0;i=ticket) /查看 余票数是否 = 订票客户 订票数 pi.tick-=ticket; Customer *t=(Customer *)malloc(sizeof(Customer); t-ticket=ticket; strcpy(t-Name,name); strcpy(t-number,pi.number); strcpy(t-end,pi.end); t-next=pi.first; pi.first=t; / 此使用的是头插法将订票乘客的信息放入到 链表中 cout 您订票成功!n; cout 您的航班信息如下:n; cout_n; cout 航班号 飞机号 终点站 飞行日期 定额n; cout_n; cout setw(9)pi.numbersetw(6)pi.planenumsetw(12)pi.endsetw(12)pi.datesetw(10)pi.di