图的遍历过程演示.docx
- 文档编号:6001363
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:28
- 大小:230.87KB
图的遍历过程演示.docx
《图的遍历过程演示.docx》由会员分享,可在线阅读,更多相关《图的遍历过程演示.docx(28页珍藏版)》请在冰豆网上搜索。
图的遍历过程演示
课程设计报告
姓名:
常建明
学号:
131842311
设计题目:
图的遍历
设计题目:
航空订票系统
目录
1.图的遍历
1图的遍历过程演示的要求
2设计思路
3详细设计
4设计与调试分析
2.航空订票系统
1问题的要求
2问题描述
3设计思路
4主要功能函数设计
5编码实现
6运行与测试
图的遍历
图的遍历过程演示的要求
设计程序完成如下功能:
对给定的图结构和起点,产生深度优先遍历和广度优先遍历序列,并给出求解过程的动态演示。
设计思路
首先由于程序中要有对图的数据信息的创建,定义一个全局变量Max,表示最多建立的结点数。
设计实现主要功能的函数有:
创建图的数据信息的函数CreateMGraph();深度优先遍历递归函数DFSM();广度优先遍历递归BFSM;深度优先遍历DFSTraverseM();广度优先遍历BFSTraverseM();然后在main()函数中使用一个switch()语句实现对各个子函数的调用。
抽象数据类型队列的定义如下:
ADTQueue{
数据对象:
D={ai|ai∈ElemSet,i=1,2,3……,n,n≥0}
数据关系:
R1={
约定其中a1端为队列头,an端为队列尾。
基本操作:
InitQueue(&Q)
操作结果:
构造一个空队列Q。
DestroyQueue(&Q)
初始条件:
队列Q已存在。
操作结果:
队列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返回其值。
QueueTraverse(Q,visit())
初始条件:
Q已存在且非空。
操作结果:
从对头到对尾,依次对Q的每个数据元素调用函数visit()。
一旦visit()失败,则操作失败。
}
详细设计
#include
#include
#defineMax10
#defineFALSE0
#defineTRUE1
#defineErrorprintf
#defineQueueSize30
typedefstruct
{
charvexs[Max];
intedges[Max][Max];
intn,e;
}MGraph;/*以邻接矩阵作为图的存储结构*/
intvisited[Max];/*将visited[Max]定义为全局变量并分配最大空间*/
main()
{
MGraph*G,a;
charch1;
inti,j,ch2;
G=&a;
ch1='y';/*设置控制语句标志*/
while(ch1=='y'||ch1=='Y')
{/*菜单栏*/
printf("\n");
printf("\t\t++++++++++++图的遍历过程演示++++++++++++++\n");
printf("\t\t+选择菜单+\n");
printf("\t\t++++++++++++++++++++++++++++++++++++++++++\n");
printf("\t\t+创建图的数据请按:
1+\n");
printf("\t\t+深度优先搜索请按:
2+\n");
printf("\t\t+广度优先搜索请按:
3+\n");
printf("\t\t+退出搜索请按:
0+\n");
printf("\t\t++++++++++++++++++++++++++++++++++++++++++\n");
printf("\n\t\t请选择菜单号(0-3):
");
scanf("%d",&ch2);
getchar();
switch(ch2)
{
case1:
CreateMGraph(G);/*选1创建一个新的图矩阵*/
break;
case2:
DFSTraverseM(G);/*选2进入深度优先搜索*/
break;
case3:
BFSTraverseM(G);/*选3进入广度优先搜索*/
break;
case0:
/*选0结束搜索,退出程序*/
ch1='n';
break;
default:
system("cls");
printf("\n\t\t输入有误!
\n");
break;
}
if(ch2==1||ch2==2||ch2==3)
printf("\n\n\t\t");/*控制格式*/
}
}
typedefstruct
{
intfront;
intrear;
intcount;
intdata[QueueSize];
}CirQueue;/*定义队列的数据结构*/
voidInitQueue(CirQueue*Q)
{
Q->front=Q->rear=0;
Q->count=0;
}
intQueueEmpty(CirQueue*Q)
{
returnQ->count=QueueSize;/*返回队列的最大长度*/
}
intQueueFull(CirQueue*Q)
{
returnQ->count==QueueSize;/*返回队列的最大长度*/
}
voidEnQueue(CirQueue*Q,intx)
{
if(QueueFull(Q))/*队列满则出错*/
{
Error("Queueoverflow");
}
else
{
Q->count++;/*否则count++,将x进队*/
Q->data[Q->rear]=x;
Q->rear=(Q->rear+1)%QueueSize;
}
}
intDeQueue(CirQueue*Q)
{
inttemp;/*定义整型的变量*/
if(QueueEmpty(Q))/*若为真则出错*/
{
Error("Queueunderflow");
}
else/*为假则count--,将队员出队*/
{
temp=Q->data[Q->front];/*用temp返回其值*/
Q->count--;
Q->front=(Q->front+1)%QueueSize;
returntemp;/*返回出队元素值*/
}
}
voidCreateMGraph(MGraph*G)
{
inti,j,k;/*定义整型变量*/
charch1,ch2;/*定义字符型变量*/
printf("\n请输入顶点数,边数(格式:
3,4):
");
scanf("%d,%d",&(G->n),&(G->e));/*输入图的顶点数和边数*/
for(i=0;i
{
getchar();
printf("\n请输入第%d个顶点序号",i+1);
scanf("%c",&(G->vexs[i]));/*输入顶点的序号*/
}
for(i=0;i
{
for(j=0;j
{
G->edges[i][j]=0;/*初始化矩阵*/
}
}
for(k=0;k
{
getchar();
printf("\n请输入第%d条边的顶点序号(格式:
i,j):
",k+1);
scanf("%c,%c",&ch1,&ch2);/*输入边的顶点序号*/
for(i=0;ch1!
=G->vexs[i];i++);
for(j=0;ch2!
=G->vexs[j];j++);
G->edges[i][j]=1;/*有边则赋值为1*/
}
}
voidDFSM(MGraph*G,inti)
{
intj;
printf("%c",G->vexs[i]);
visited[i]=TRUE;/*标记visited[i]*/
/*依次优先搜索访问visited[i]的每个邻接点*/
for(j=0;j
/*若visited[i]的一个有效邻接点visited[j]未被访问过,则从visited[j]出发进行递归调*/
if(G->edges[i][j]==1&&!
visited[j])
DFSM(G,j);
}
voidDFSTraverseM(MGraph*G)
{
inti;
printf("\n深度优先遍历序列:
");
for(i=0;i
{
visited[i]=FALSE;/*访问标志数组初始化*/
}
for(i=0;i
{
if(!
visited[i])/*对尚未访问的顶点调用DFSM*/
{
DFSM(G,i);
}
}
}
voidBFSM(MGraph*G,intk)
{
inti,j;
CirQueueQ;/*定义一个队列Q,初始化队列为空*/
InitQueue(&Q);
printf("%c",G->vexs[k]);/*访问初始点,并将其标记已访问过*/
visited[k]=TRUE;
EnQueue(&Q,k);/*将以访问过的初始点序号k入队*/
while(!
QueueEmpty(&Q))/*队列非空进行循环处理*/
{
i=DeQueue(&Q);/*将队首元素出队*/
for(j=0;j
{
if(G->edges[i][j]==1&&!
visited[j])
{
visited[j]=TRUE;/*标记vexs[j]已访问过*/
EnQueue(&Q,j);/*顶点序号j入队*/
}
}
}
}
voidBFSTraverseM(MGraph*G)
{
inti;
printf("\n广度优先遍历序列:
");
for(i=0;i
{
visited[i]=FALSE;/*访问标志数组初始化*/
}
for(i=0;i
{
if(!
visited[i])/*对尚未访问的顶点调用BFSM*/
{
BFSM(G,i);
}
}
}
7)各个模块之间的调用关系如下:
设计与调试分析
从上面的算法和调用关系可以看出,这个程序的基本样子已经非常的清楚,但是真正的程序中还要考虑各种限制条件。
在调试过程中,程序中出现了许多的错误,有错误的调用、一些变量没有定义、等等。
不断的对程序进行调试以得到最好的结果,程序中特别要注意的是类的对象作为作为参数时要注意如何去调用它,使程序有一个令人满意的结果,具体的调试是在上机过程中进行的,在编写程序的过程中主要有如下错误:
1、在编写程序的过程出现了一些函数名、变量的大小写不统一的错误,导致程序在运行的过程中出现函数名、变量没有被定义等问题;
2、在编写程序的过程中数组的大小写没有被确定;
3、在编写程序的过程中一些变量没有被定义,导致程序出错;
4、数组visited[Max]应定义为全局变量,若不是则会出错;
5、函数的返回类型要确定,是void还是其他类型要十分注意;
6、在编程的过程中,函数里一些控制语句的嵌套使用,括号要引起注意,
这次的课程设计就有一些括号漏了或者多打了,导致括号不配套;
创建数据就是把最开始要输入的数据输入到系统里。
界面如下:
按照深度优先搜索来遍历图。
界面如下:
按照广度优先搜索来遍历图。
界面如下:
重新创建另一个图的数据。
界面如下:
完成任务后,退出的界面如下:
航空订票系统
问题的要求
设计航班信息,订票信息的存储结构,设计程序完成如下功能:
录入:
可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定)
查询:
可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);可以输入起飞抵达城市,查询飞机航班情况;
订票:
(订票情况可以存在一个数据文件中,结构自己设定)可以订票,如果该航班已经无票,可以提供相关可选择航班;
退票:
可退票,退票后修改相关数据文件;
客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。
修改航班信息:
当航班信息改变可以修改航班数据文件
问题描述航空订票的业务活动一般包括查询航线信息、客票预订、办理退票等。
每条航线所涉及的信息由:
终点站名、航班号、飞机号、成员数额、余票量、已订票的客户名单。
设计思路
主要有三个方面的内容,查询航线信息、订票和退票业务。
程序的基本功能有:
(1)查询航线。
根据旅客提出的终点站名输出下列信息:
航班号、飞机号、星期几飞行,最近一天航班的日期和余票数。
(2)承办订票业务。
根据客户提出的要求查询该航班票额情况,若有余票,为客户办理订票手续,输出座位号。
若无票,则须重新询问客户要求。
若需要,可登记排队等候。
(3)退票业务。
根据客户提供的情况,为客户办理退票手续,然后查询该航班是否有人排队等候,首先询问排在第一的客户,若所退票额能瞒住他的要求,则为他办理退票手续,否则依次询问其他排队候补的客户。
主要功能函数设计
(1)总航线信息预览:
通过调用display()预览已经建立的全部航线的相关信息(航班号、飞机号、终点站、飞行日期、定额、余票数、排队等候人数),预览完返回主菜单。
(2)查询单条航线信息:
根据乘客提出的终点站名或航班号调用Search()函数来查询并输出此条航线的相关信息(航班号、飞机号、终点站、飞行日期、定额、余票数、已订票乘客名单、排队等候乘客名单)。
并且查询完后询问乘客是否订票,是就调用订票Book()函数来为乘客进行订票,否就返回主菜单。
(3)办理订票业务:
客户先输入的终点站名、订票数、姓名信息再来调用订票Book()函数,Book()函数根据客户提供的终点站名查询到该航线信息,若客户订票额末超过余票量,订票成功并登记信息,在订票乘员名单链表中添加乘客的信息;如果暂时余票数不足是,询问客户是否要排队等侯,如果是,则在排队等候的队列中增加该乘客的订票信息。
(4)办理退票业务:
调用tuipiao()查询函数,根据客户提供的航线进行搜索根据客户提供的姓名到订票客户名单域进行查询。
退票成功后,重新将航线名单域指向订票单链表的头指针。
根据队列中从出的客户信息判断是否满足要求,如果满足,则将该客户的信息插入到乘客信息链表中。
(5)录入航班信息:
调用CreatPlane()函数,根据输入的航班的相关的信息(航班号、飞机号、终点站、飞行日期、定额、余票数),将此航班加入到原来的航班组中。
(6)退出系统
编码实现
#include
#include
#include
#include
#defineMAXSIZE 100
typedefstructCust//已订票乘客信息
{
charName[15];//乘客姓名
charnumber[10];//乘客所乘飞机航班号
charend[15];//乘客终点
typedefstructwaitNode//排队等候客户信息
{
charname[15];//乘客姓名
intticket;//乘客的订票数
structwaitNode*next;
}waitNode,*waitlink;
typedefstruct
{
waitlinkfront;
waitlinkrear;
}waitQueue;
typedefstructPlane//航班信息
{
charnumber[10];//航班号
intplanenum;//飞机号
charend[15];//终点站
chardate[10];//飞行日期
intdinge;//成员定额
inttick;//剩余票数
intk;//排队等候的人数
Customer*first;//链接已订票客户
waitQueueQ;//链接候补客户
}PlaneLink;
intSearch(PlaneLink*p,intN)
{
inti=0,Q;
cout<<"===========================================\n";
cout<<"1.按终点站名查询\n";
cout<<"2.按航班号查询\n";
cout<<"___________________________________________\n";
cout<<">>>>>>\n";
cout<<"请选择查询方式(1/2):
";cin>>Q;
if(Q==1)
{
charend[10];
cout<<"请您输入要查询的航班的终点站名:
";//按站点名查询航班信息
cin>>end;
while(i { if(strcmp(p[i].end,end)==0)//先查看是否存在到该站点的航班 { cout<<"\n*****************您所查询的航班信息如下******************\n"; cout<<"_________________________________________________________\n"; cout<<"航班号飞机号终点站飞行日期余票数\n"; cout<<""< cout<<"\n=========================================================\n"; break; } i++; } } elseif(Q==2) { charnum[10]; cout<<"请您输入要查询的航班的航班号: ";//按站点名查询航班信息 cin>>num; while(i { if(strcmp(p[i].number,num)==0)//查看是否存在该航班号的航班 { cout<<"\n*****************您所查询的航班信息如下: ****************\n"; cout<<"_________________________________________________________\n"; cout<<"航班号终点飞行日期余票数\n"; cout<<""< cout<<"\n=========================================================\n"; break; } i++; } } display_s(p,i,N);//调用display_s()函数输出该航班的已订票乘客和排队等候乘客的名单信息 if(i { intj; cout<<"是否需要预定该航班的票(1/0): ";cin>>j; if(j==1) { charname[10];intticket; cout<<"请输入订票数目、姓名: "; cin>>ticket>>name; Book(p,p[i].end,ticket,name,N); } } else{cout<<"很抱歉,没有您查询的航班信息! \n";} return0; } intBook(PlaneLink*p,charend[],intticket,charname[],intN) { inti; for(i=0;i {if(strcmp(p[i].end,end)==0)//先找出是否存在要订票的航班 { if(p[i].tick>=ticket)//查看余票数是否>=订票客户订票数 { p[i].tick-=ticket; Customer*t=(Customer*)malloc(sizeof(Customer)); t->ticket=ticket; strcpy(t->Name,name); strcpy(t->number,p[i].number); strcpy(t->end,p[i].end); t->next=p[i].first;p[i].first=t;//此使用的是头插法将订票乘客的信息放入到链表中cout<<"您订票成功! \n"; cout<<"您的航班信息如下: \n"; cout<<"__________________________________________________\n"; cout<<"航班号飞机号终点站飞行日期定额\n"; cout<<"__________________________________________________\n"; cout<<""<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 遍历 过程 演示