数据结构课程设计——校园导游咨询系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构课程设计——校园导游咨询系统
1:需求分析:
(1)任务:编制一个为来访客人进行最短路径导游的程序
(2)要求:从学校的平面上选取n个有代表性的景点,根据用户指定的起点和终点输出相应路径。
2:概要设计:
(1)1)a)AdjMGraph.h图操作的函数所放的头文件
b) AdjMGraphCreate.h图的创建函数所放的头文件
c) Dijkstra.h狄克斯特拉函数设计所放的头文件
d) SeqList.h存放顺序表的头文件
2)SchoolGuide.c文件包括以下三个函数
void SgPrint(AdjMGraph g,int n,int distance[],int path[],int j)函数,其功能是将源点到各个结点的最短距离和最短路径的结果输出;
void Sgblueprint()函数,其功能是将校园平面图输出;
void main(void)函数,主函数,功能是调用测试数据值,显示主菜单,根据用户输入的i进行不同功能操作,随后根据用户输入的ch值进行不同功能操作。
(2)该程序所使用的存储结构是顺序存储;
(3)流程图:
图1-1主函数main()流程图
图1-2 SgPrint函数流程图
3:详细设计:
(1)/*顺序表头文件SeqList.h*/
typedef struct
{
DataType list[MaxSize];
int size;
}SeqList;
void ListInitiate(SeqList *L) /*初始化顺序表L*/
{
L->size=0; /*定义初始化数据元素个数*/
}
int ListLength(SeqList L) /*返回顺序表L的当前数据元素个数*/ {
return L.size;
}
int ListInsert(SeqList *L,int i,DataType x)
/*在顺序表L的第i(0≤i≤size)个位置前插入数据元素值x*/
/*插入成功返回1,插入失败返回0*/
{int j;
if(L->size>=MaxSize)
{
printf("顺序表已满无法插入!\n");
return 0;}
else if(i<0||i>L->size)
{
printf("参数i不合法!\n");
return 0;}
else{
/*为插入做准备*/
for(j=L->size;j>i;j--)
L->list[j]=L->list[j-1];
L->list[i]=x;/*插入x*/
L->size++;/*元素个数加1*/
return 1;}
}
int ListDelete(SeqList *L,int i,DataType *x)
{
/*删除顺序表L中位置为i(0≤i≤size-1)的数据元素并存放到x中*/ /*删除成功返回1,删除失败返回0*/
int j;
if(L->size<=0)
{
printf("顺序表已空无数据元素可删!\n");
return 0;}
else if(i<0||i>L->size-1)
{
printf("参数i不合法");
return 0;}
else
{
*x=L->list[i]; /*保存删除的元素到x中*/
/*依次前移*/
for(j=i+1;j<=L->size-1;j++)
L->list[j-1]=L->list[j];
L->size--;
return 1;
}
}
int ListGet(SeqList L,int i,DataType *x)
/*取顺序表L中第i个数据元素存于x中,成功返回1.失败返回0*/
{
if(i<0||i>L.size-1)
{
printf("参数i不合法!\n");
return 0;}
else
{*x=L.list[i];
return 1;}
}
(2)/*AdjMGraph.h图操作的函数所放的头文件*/
#include"Seqlist.h"/*包含顺序表头文件*/
typedef struct
{
SeqList Vertices;/*存放结点的顺序表*/
int edge[MaxVertices][MaxVertices];/*存放边的邻接矩阵*/ int numOfEdges;/*边的条数*/
}AdjMGraph;/*图的结构体定义*/
void Initiate(AdjMGraph *G,int n)/*初始化*/
{
int i,j;
for(i=0;i for(j=0;j { if(i==j) G->edge[i][j]=0; else G->edge[i][j]=MaxWeight; } G->numOfEdges=0;/*边的条数置为0*/ ListInitiate(&G->Vertices);/*顺序表初始化*/ } void InsertVertex(AdjMGraph *G,DataType vertex) /*在图G中插入结点vertex*/ { ListInsert(&G->Vertices,G->Vertices.size,vertex); /*顺序表尾插入*/ } void InsertEdge(AdjMGraph *G,int v1,int v2,int weight) /*在图G中插入边 { if(v1<0||v1>G->Vertices.size||v2<0||v2>G->Vertices.size) { printf("参数v1或v2越界出错!\n"); exit(1); } G->edge[v1][v2]=weight; G->numOfEdges++; } void DeleteEdge(AdjMGraph *G,int v1,int v2)