数据结构课程设计之校园导游系统

数据结构课程设计之校园导游系统

放假到现在终于安下心来要搞点学习了,现在对放假前一周的数据结构课设做一个总结,快放假的时候搞数据结构课设,当时满脑子都是期末考试忙着复习,根本没啥心思去做。所以课设一共用了两天时间,基本功能都实现了,麻雀虽小五脏俱全,但是和其他有图形界面的人来说,我的就比较垃圾了,但是用来交差还是可行的。而且c语言弄图形库也是比较麻烦,建议你有充足的时间去做,下面是我对我的课程设计的分析及总结。

设计题目 :校园导游系统

设计目的:在校园建设不断完善的现在,为在校学生提供合适的行走路径,为来访的客人提供各种服务的信息;对于这些问题,可用图结构来表示校园交通网络,编写程序完成校园导游系统。

设计内容: 提供用户以及管理员功能,用户可以对校园地点进行查询,而管理员可以对交通图进行增删查改,同时管理员可以登陆、修改密码等待操作,有一定的交互界面。

设计要求:校园导游图涉及了地点和道路两方面信息,地点信息以及道路信息应存储在文件中,文件的存储格式自己设计。对这两方面进行查找、增加、修改、删除等操作,并同步更新文件。

看完设计要求我们知道,这个课程设计如果不包括图形界面的话,其他的功能就是一些图的操作,例如:图的建立,图的遍历,图的最小生成树,图的最短路径,在就是一些文件的增加和删除。有了这些东西,所有的基本功能就都实现了。

下面是分析及代码展示:

1.图的建立
图的建立有邻接表和邻接矩阵两种,两种建立方式在代码的处理和复杂度上综合来看是差不多的,所以选哪个都一样,我选用的是邻接矩阵。

//邻接矩阵创建无向图
void Creat(MGraph *G)
{
	FILE *fp;
	int i = 0,j = 0,k,m,index1,index2,weight;
	char name1[30], name2[30];
	fp=fopen("文件点.txt", "rt");  //文件中读取结点
	if (fp == NULL)
	{
		printf("文件为空,或者文件遭破坏,请呼叫工作人员。按任意退出...");
		getchar();
		exit(1);
	}
	while (fscanf(fp, "%s %s", G->vex[i].name,G->vex[i].build_describe) != EOF)
	{
		G->vex[i].num = i;
		i++;
	}
	fclose(fp);
	G->vexnum = i;

	for (m = 0; m < G->vexnum; m++)   //初始化邻接矩阵
		for (k = 0; k < G->vexnum; k++)
			G->arcs[m][k] = INFINITY;

	fp = fopen("文件边.txt", "rt");  //文件中读取边
	if (fp == NULL)
	{
		printf("文件为空,或者文件遭破坏,请呼叫工作人员。按任意退出...");
		getchar();
		exit(1);
	}
	while (fscanf(fp, "%s %s %d", name1,name2,&weight) != EOF)
	{
		index1 = Index(G, name1);
		index2 = Index(G, name2);
		G->arcs[index1][index2] = weight;
		G->arcs[index2][index1] = weight;
		j++;
	}   
	fclose(fp);
	G->arcnum = j;
}

2.显示图的基本信息
就是将整个图遍历输出

void Display(MGraph *G)  //显示图信息
{
	int i, j;
	printf("校园各个路径的情况为:\n");
	for (i = 0; i < G->vexnum; i++)
		for (j = 0; j < i; j++)
		{
			if (G->arcs[i][j] != INFINITY)
				printf("%s<------>%s:%10dm\n", G->vex[i].name, G->vex[j].name, G->arcs[i][j]);
		}
}

3.任意两点的最短路径长度
使用Dijkstra算法实现

//Dijkstra算法求从起点到终点的最短路径
void Dijkstra(MGraph *G, int start, int end, int dist[], int path[][MAXVEX])
{
	//dist记录各条最短路径长度,path数组记录对应路径上的各顶点
	int mindist, i, j, k, t = 1;
	for (i = 0; i < G->vexnum; i++)      //初始化
	{
		dist[i] = G->arcs[start][i];
		if (G->arcs[start][i] != INFINITY)
			path[i][1] = start;
	}
	path[start][0] = 1;
	for (i = 1; i < G->vexnum; i++)
	{
		mindist = INFINITY;
		for(j=0;j<G->vexnum;j++)  //选择最小权值路径
			if (!path[j][0] && dist[j] < mindist)
			{
				k = j;
				mindist = dist[j];
			}
		if (mindist == INFINITY)
			return;
		path[k][0] = 1;
		for (j = 0; j < G->vexnum; j++)  //修改路线
		{
			if (!path[j][0] && G->arcs[k][j] < INFINITY&&dist[k] + G->arcs[k][j] < dist[j])
			{
				dist[j] = dist[k] + G->arcs[k][j];
				t = 1;
				while (path[j][t] != 0)  //记录新的最短路径
				{
					path[j][t] = path[k][t];
					t++;
				}
				path[j][t] = k;
				path[j][t + 1] = 0;
			}
		}
	}
	for (i = 0; i < G->vexnum; i++)
		if (i == end)
			break;
	printf("从%s<------>%s的最短路线为:从%s", G->vex[start].name, G->vex[end].name, G->vex[start].name);
	for (j = 2; path[i][j] != 0; j++)
		printf("->%s", G->vex[path[i][j]].name);
	printf("->%s , 距离为: %dm\n", G->vex[end].name, dist[i]);
}

4.提供图中所有地点的最佳布网方案(最小生成树)
使用prim算法实现

void Shortlink(MGraph *G) //寻找最短路线
{
	system("cls");
	char name[20];
	int start, end;
	int dist[MAXVEX], path[MAXVEX][MAXVEX] = { 0 };
	printf("请输入起点建筑:");
	scanf("%s", name);
	start = Index(G, name);
	printf("请输入终点建筑:");
	scanf("%s", name);
	end = Index(G, name);
	Dijkstra(G, start, end, dist, path);
}

void Prim(MGraph *G, int start)  //prim算法求最小生成树
{
	struct
	{
		int adjvex;
		int lowcost;
	}closedge[MAXVEX];
	int i, e, k, m, min;
	closedge[start].lowcost = 0;
	for(i=0;i<G->vexnum;i++)
		if (i!=start)
		{
			closedge[i].adjvex = start;
			closedge[i].lowcost = G->arcs[start][i];
		}
	for (e = 0; e < G->vexnum - 1; e++)
	{
		//选择最小权值的边
		min = INFINITY;
		for (k = 0; k < G->vexnum; k++)
		{
			if (closedge[k].lowcost != 0 && closedge[k].lowcost < min)
			{
				m = k;
				min = closedge[k].lowcost;
			}
		}
		printf("从%s<------>%s:%dm\n", G->vex[closedge[m].adjvex].name, G->vex[m].name, closedge[m].lowcost);
		closedge[m].lowcost = 0;
		//当m加入后,更新closedge数组信息
		for (i = 0; i < G->vexnum; i++)
		{
			if (i != m && G->arcs[m][i] < closedge[i].lowcost)
			{
				closedge[i].lowcost = G->arcs[m][i];
				closedge[i].adjvex = m;
			}
		}
	}
}

这是整个系统的基本功能,增删改除等功能由于篇幅太长就不一一列举了。总的来说通过这次课设,使我对于数据结构这门学科有了更深入的了解,并且运用了其中的存储类型进行了实战,虽然只用了两天时间,图形界面没有运用比较遗憾,但是c语言的图形界面不是很好用,有兴趣的话你可以了解一下。

源代码链接

你可能感兴趣的:(c数据结构)