我的第一篇课程设计(交通咨询系统)

我因为当时课设选题的时候,不想随随便便,又我看了下那些题目,也就这个最难,而且我又注意到文档的修改日期,是2017年,所以就认为老师给老课题给我们做,是怕我们交不起作业,也由于老师自己长年教这课设,代码可能都很熟悉,总之我就觉得这次课设很水,但完成这课设还确实花了我一番时间。

附上课程设计说明书:

课程名称:数据结构与算法课程设计

课程设计题目:交通咨询系统

已知技术参数和设计要求:

问题描述:

设计一个交通咨询系统,为自驾游旅行者客咨询从任一个城市到另一个城市之间的最短路径问题。设计分三个部分,一是建立交通网络图的存储结构;二是解决单源最短路径问题;最后再实现两个城市顶点之间的最短路径问题。

基本要求:

1)对城市信息(城市名、城市间的里程)进行编辑:具备添加、修改、删除功能;

2)咨询以用户和计算机对话方式进行,要注意人机交互的屏幕界面。由用户选择输入起点、终点,输出信息:旅行者从起点、终点经过的每一座城市。

3)主程序可以有系统界面、菜单;也可用命令提示方式;选择功能模块执行,要求在程序运行过程中可以反复操作。

测试数据:

1)参考《数据结构(C语言版)》(严蔚敏, 吴伟民编著)7.6节图7.33的交通图。

2)答辩测试数据:北京到乌鲁木齐;北京到昆明;广州到哈尔滨;乌鲁木齐到南昌;沈阳到昆明。

选作内容:

1)考虑由于路况不同,不同城市间自驾旅行每百公里油耗不同,为旅行选择最经济路线。

需求分析

1)功能性需求:

  本次所设计的交通咨询系统需要在功能在实现用户在一个交通线路网中,从一个城市到另一个城市的最短路径,以及在路径中所经历的城市结点,能够根据实际变化(如编辑城市,增删城市或变更路径和选择最佳经济路线)做出一系列的调整,以满足用户在现实中的实际需求。

2)非功能性需求:

       该设计的交通咨询系统可在一般电脑上运行,运行环境在VS2013编译器下搭建的环境,识别用户输入的编码为汉语中文,未来可能扩充的方案为:把整个交通咨询系统里的重要信息都存至数据库文件,能按具体的格式操作数据库以操作交通设计系统。

交通图即为《数据结构(C语言版)》(严蔚敏, 吴伟民编著)7.6节图7.33的交通图。

//头文件
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>


#define MVNum 35 
#define Maxint 9999

typedef int Adjmatrix;

int D1[MVNum], P1[MVNum];
int D[MVNum][MVNum];

P[MVNum][MVNum];//用于存任意两个城市间的最短路径

typedef enum { FALSE, TRUE }boolean;


struct city{
	int id;
	char name[13];
};
typedef struct{
	struct city vexs[MVNum];
	Adjmatrix arcs[MVNum][MVNum];
	int economic_arcs[MVNum][MVNum];
	int length;
	struct list*x;
}MGraph;
//————————————————//单链表实现对删除城市的id和路径存储
struct list{
	struct node*head;
	int length;
};
struct delnode{
	int id;
	int distance;
};
struct node{
	char name[7];
	struct delnode linked[7];//默认一个城市最多与七个城市相连
	struct node*next;
};
 
//-------修改城市信息---------
 
void add(MGraph* G);//添加城市信息
void modify(MGraph*  G);//修改城市信息
void city_allshow(MGraph* G);//展示所有城市信息
 
int getid(char name[], MGraph *G);//根据名字获取城市id
char* getname(int id, MGraph *G);
void del_cityinfo(MGraph  *G);
void del_lane(MGraph*  G);
void add_citylane(MGraph*  G);
void modify_lane(MGraph*  G);
 

//-------修改城市信息------



MGraph* CreateMGraph();// 默认25个城市
void Dijkstra(MGraph *G, int v1, int n,int judge);
void Floyd(MGraph *G, int n, int judge, int head, int real);
void menu();
void mangement_menu();
struct node* is_belong(char name[],MGraph *G);
void present_delcityifo(MGraph *G);
int lonecity(MGraph*G, int id);
int is_real(char name[], MGraph *G);
 

//函数的实现
#define _CRT_SECURE_NO_WARNINGS //写具体函数的实现
#include"Traffic_consult.h"
 
 
void add(MGraph *G)//添加城市结点*
{
	int i = 0;
	printf("----正在进行增加城市信息操作——\n");
	printf("输入添加城市的姓名\n");
	char name_add[7];
	scanf("%s", name_add);

	//在回收站中无原信息,添加至数组后

	if (!is_belong(name_add, G))
	{
		printf("未在回收站中找到相同信息,新添加\n");
		G->length++;
		strcpy(G->vexs[G->length].name, name_add);
		G->vexs[G->length].id = G->length;
		printf("id为%d的城市名字为%s\n", G->vexs[G->length].id, G->vexs[G->length].name);
		for (int i = 1; i <= G->length; i++){
			G->arcs[G->length][i] = Maxint;//初始化为增加路径,全设为Maxint
			G->arcs[i][G->length] = Maxint;
			G->economic_arcs[i][G->length] = Maxint;
			G->economic_arcs[G->length][i] = Maxint;



		}

		printf("增加成功\n");
	}

	else//默认油价是1
	{
		int z = getid((is_belong(name_add, G)->name), G);
		if (G->vexs[z].id == 0)
		{

			printf("在回收站中有原信息,将在回收站中重新恢复 \n");

			int j = 1;
			// 测试/*while (m){
			//	printf("%d %s", m->linked[j].id, m->name);
			//	m = m->next;
			///*}*/*/

			G->vexs[z].id = z;
			struct node*a = is_belong(name_add, G);
			int i = 1;
			while (a->linked[i].id != -1){
				G->arcs[z][a->linked[i].id] = a->linked[i].distance;
				G->arcs[a->linked[i].id][z] = a->linked[i].distance;
				G->economic_arcs[a->linked[i].id][z] = a->linked[i].distance;
				G->economic_arcs[z][a->linked[i].id] = a->linked[i].distance;
				i++;
			}

			printf("恢复成功\n");
		}
		else
			printf("该城市已经存在,不需要从回收站中恢复\n");

}
 }
void modify(MGraph*  G){//根据id修改城市名
	int n = 0;
	printf("你想要修改城市的id为:>\n");
	scanf(" %d", &n);
	if (is_real(getname(n, G), G)){
		int i = 1;
		int flag = 0;
		while (i <= G->length){
			if (G->vexs[i].id == n){
				flag = 1;
				break;
			}
			i++;
		}
		if (1 == flag)//找到了
		{

			printf("id为%d的城市名为%s:输入你修改后的城市名:>\n", n, G->vexs[i].name);
			char new_name[13];
			scanf(" %s", new_name);
			strcpy(G->vexs[i].name, new_name);

			printf("修改后的城市名为%s", G->vexs[i].name);
		}
		else
			printf("没有这样的id\n");
	}
	else
	{
		printf("输入的城市不合法\n");
	}
	}

		 
	
void city_allshow(MGraph* G)//展示所有城市信息
{
	int i = 1;
	printf("所以城市的如下\n");
	while (i <= G->length){
		if (G->vexs[i].id){
			printf("id:%d name:%s", G->vexs[i].id, G->vexs[i].name);
			printf("\n");
			i++;
		}
		else
			i++;
	}
	 

}
int getid(char name[], MGraph* G){//此id为数组序号
	int i = 1;
	while (strcmp(G->vexs[i].name, name)!= 0 && i <= G->length){
		i++;
	}

	if (i <= G->length&&!strcmp(G->vexs[i].name, name))
		return i;
	else return 0;
}

	//_______________________________________
	//采用邻接矩阵表示法构造有向图G
	// 表示图的当前顶点数和边数
MGraph *  CreateMGraph()//初始化
	{
	printf("正在初始化……\n");
	MGraph *G = (MGraph*)malloc(sizeof(MGraph));
		int i, j;
		for (i = 1; i <= 25; i++)
		{
			G->vexs[i].id = i;
			//输入顶点信息
			 
		}
	 //创建回收链表
		G->length = 25;
		G->x = (struct list*) malloc(sizeof(struct list));
		G->x->head = NULL;
		G->x->length = 0;
	//创建回收链表
		 //初始化25个城市的信息
		strcpy(G->vexs[1].name,"乌鲁木齐");
		strcpy(G->vexs[2].name, "呼和浩特");
		strcpy(G->vexs[3].name, "北京");
		strcpy(G->vexs[4].name, "天津");
		strcpy(G->vexs[5].name, "沈阳");
		strcpy(G->vexs[6].name, "大连");
		strcpy(G->vexs[7].name, "长春");
		strcpy(G->vexs[8].name, "哈尔滨");
		strcpy(G->vexs[9].name, "西宁");
		strcpy(G->vexs[10].name, "兰州");
		strcpy(G->vexs[11].name, "西安");
		strcpy(G->vexs[12].name, "郑州");
		strcpy(G->vexs[13].name, "徐州");
		strcpy(G->vexs[14].name, "成都");
		strcpy(G->vexs[15].name, "武汉");
		strcpy(G->vexs[16].name, "上海");
		strcpy(G->vexs[17].name, "昆明");
		strcpy(G->vexs[18].name, "贵阳");
		strcpy(G->vexs[19].name, "株洲");
		strcpy(G->vexs[20].name, "南昌");
		strcpy(G->vexs[21].name, "福州");
		strcpy(G->vexs[22].name, "南宁");
		strcpy(G->vexs[23].name, "聊州");
		strcpy(G->vexs[24].name, "广州");
		strcpy(G->vexs[25].name, "深圳");
		 
		for (i = 1; i <=25; i++)
		{
			for (j = 1; j <= 25; j++){

				G->arcs[i][j] = Maxint;   //初始化邻接矩阵
				
			}
		}
				G->arcs[3][2] = 668;
				G->arcs[2][3] = 668;
				 


				G->arcs[3][4] = 137;
				G->arcs[4][3] = 137;
				


				G->arcs[4][5] = 704;
				G->arcs[5][4] = 704;
				 
				


				G->arcs[5][6] = 397;
				G->arcs[6][5] = 397;




				G->arcs[5][7] = 305;
				G->arcs[7][5] = 305;




				G->arcs[7][8] = 242;
				G->arcs[8][7] = 242;



				G->arcs[1][10] = 1892;
				G->arcs[10][1] = 1892;



				G->arcs[2][10] = 1145;
				G->arcs[10][2] = 1145;



				G->arcs[9][10] = 216;
				G->arcs[10][9] = 216;



				G->arcs[10][11] = 676;
				G->arcs[11][10] = 676;



				G->arcs[3][12] = 695;
				G->arcs[12][3] = 695;



				G->arcs[11][12] = 511;
				G->arcs[12][11] = 511;



				G->arcs[4][13] = 674;
				G->arcs[13][4] = 674;



				G->arcs[12][13] = 349;
				G->arcs[13][12] = 349;



				G->arcs[11][14] = 842;
				G->arcs[14][11] = 842;



				G->arcs[12][15] = 534;
				G->arcs[15][12] = 534;



				G->arcs[13][16] = 651;
				G->arcs[16][13] = 651;



				G->arcs[14][17] = 1100;
				G->arcs[17][14] = 1100;



				G->arcs[17][18] = 639;
				G->arcs[18][17] = 639;



				G->arcs[14][18] = 967;
				G->arcs[18][14] = 967;

				G->arcs[15][19] = 409;
				G->arcs[19][15] = 409;

				G->arcs[18][19] = 902;
				G->arcs[19][18] = 902;

				G->arcs[16][20] = 825;
				G->arcs[20][16] = 825;

				G->arcs[19][20] = 367;
				G->arcs[20][19] = 367;

				G->arcs[20][21] = 622; 
				G->arcs[21][20] = 622;

				G->arcs[18][23] = 607;
				G->arcs[23][18] = 607;

				G->arcs[19][23] = 672;
				G->arcs[23][19] = 672;

				G->arcs[22][23] = 255;
				G->arcs[23][22] = 255;

				G->arcs[19][24] = 675;
				G->arcs[24][19] = 675;

				G->arcs[24][25] = 140;
				G->arcs[25][24] = 140;

				for (i = 1; i <=G->length; i++){
					for (int j= 1; j <= G->length; j++)
					{
						if (G->arcs[i][j] != Maxint)
						{
							if (i % 2 == 0){
								G->economic_arcs[i][j] = 5 * G->arcs[i][j];//代表路程的油价

							}
							else if (i % 2 == 1){
								G->economic_arcs[i][j] = G->arcs[i][j];

							}

						}
						else
							G->economic_arcs[i][j] = Maxint;

					}
					
				}
				printf("各路径的总油耗价初始化完毕\n");
			
		printf("有向图的存储结构建立完毕! \n");
		return G;
	}

void Dijkstra(MGraph *G, int v1, int n,int judge){

	if (lonecity(G, v1) ){
		int D2[MVNum];//逐步更新其最短路径
		int P2[MVNum];
		int v, i, w, min;
		boolean S[MVNum];
		for (v = 1; v <= n; v++)
		{
			S[v] = FALSE;
			D2[v] = G->arcs[v1][v];
			if (D2[v] < Maxint){
				P2[v] = v1;//存放前驱

			}
			else
				P2[v] = 0;
		}
		D2[v1] = 0;
		S[v1] = TRUE;
		//开始循环,每次求得v1到某个v顶点的最短路经,并将v加到S集总
		for (i = 2; i < n; i++)
		{
			min = Maxint;
			for (w = 1; w <= n; w++){
				if (!S[w] && D2[w] < min)
				{
					v = w;
					min = D2[w];

				}
			}
			S[v] = TRUE;

			for (w = 1; w <= n; w++){
				if (!S[w] && (D2[v] + G->arcs[v][w] < D2[w]))
				{
					//修改D2[w]和P2[w],w属于V-S 
					D2[w] = D2[v] + G->arcs[v][w];
					P2[w] = v;
				}//end_if
			}
		}//end_for
		printf("路经长度--路经\n");
		for (i = 1; i <= n; i++)
		{

			if (G->vexs[i].id)
			{

				printf("%5d", D2[i]);
				printf("    %2s", getname(i, G));

				v = P2[i];
				while (v != 0)
				{
					printf("<-%s", getname(v, G));
					v = P2[v];
				}
			}
			printf("\n");
		}
	}
	else
		printf("该城市为孤立城市,无任何路径\n");

}


	/*弗洛伊德算法*/
void Floyd(MGraph* G, int n,int judge,int head,int real)
{
	if (judge){
		 
		int i, j, k;
		for (i = 1; i <= n; i++){
			for (j = 1; j <= n; j++)
			{

				D[i][j] = G->arcs[i][j];
				P[i][j] = j;
			}
		}

		//做k次迭代,每次迭代均试图将顶点k扩充到当前求得的从i到j的最短路经Pij上 
		for (k = 1; k <= n; k++)//五行关键代码
		{
			for (i = 1; i <= n; i++){
				for (j = 1; j <= n; j++)
				{
					if (D[i][k] + D[k][j] < D[i][j])
					{
						D[i][j] = D[i][k] + D[k][j];	//修改长度 
						P[i][j] = P[i][k];
					}
				}

			}

		}

		printf("\n%s -> %s 的最小路径为:%d\n", getname(head,G), getname(real,G), D[head][real]);
		k = P[head][real];
		printf("path: %s", getname(head,G));//打印起点
		while (k != real){
			printf("-> %s", getname(k,G));//打印中间点
			k = P[k][real];
		}
		printf("-> %s\n", getname(real,G));//打印终点


	}
	else {

		int i, j, k;
		for (i = 1; i <= n; i++){
			for (j = 1; j <= n; j++)
			{

				D[i][j] = G->economic_arcs[i][j];
				P[i][j] = j;
			}
		}

		//做k次迭代,每次迭代均试图将顶点k扩充到当前求得的从i到j的最短路经Pij上 
		for (k = 1; k <= n; k++)//五行关键代码
		{
			for (i = 1; i <= n; i++){
				for (j = 1; j <= n; j++)
				{
					if (D[i][k] + D[k][j] < D[i][j])
					{
						D[i][j] = D[i][k] + D[k][j];	//修改长度 
						P[i][j] = P[i][k];
					}
				}

			}

		}

		printf("\n%s -> %s 的最小路径为:%d\n", getname(head, G),getname(real,G), D[head][real]);
		k = P[head][real];
		printf("path: %s", getname(head, G));//打印起点
		while (k != real){
			printf("-> %s", getname(k,G));//打印中间点
			k = P[k][real];
		}
		printf("-> %s\n", getname(real,G));//打印终点
		}

}


void menu(){
		printf("丨——————————————--—————丨\n");
		printf("丨——1:解决单源路径问题—————————丨\n");
		printf("丨————————————————————丨\n");
		printf("丨——2:解决任意两个城市的最短路径问题—-丨\n");
		printf("丨————————————————————丨\n");
		printf("丨——3:查看城市及其城市的代号------------丨\n");
		printf("丨——------------------------------------丨\n");
		printf("丨——5:选择最经济的路线------------------丨\n");
		printf("丨————————————————--———丨\n");
		printf("丨——7:进入系统管理员模式------—--———丨\n");
		printf("丨————————————————--———丨\n");
		printf("丨——0:退出交通咨询系统---------————丨\n");
	}



void del_cityinfo(MGraph * G)//删除城市结点(删除不修改城市长度)
{
	char name[13];
	int i = 0;
	printf("输入要被删除的城市名\n");
	scanf(" %s", name);
	 
	int del = getid(name, G);
	 
	struct node*p = (struct node*)malloc(sizeof(struct node));
	strcpy(p->name, name);
	for (i = 1; i < sizeof(p->linked)/sizeof(p->linked[0]); i++)//初始化被删除的结点
	{
		p->linked[i].id = -1;
		p->linked[i].distance = -1;
	}
	int j = 1;
	for (i = 1; i <= G->length; i++){//将原路径全设为0,默认从1开始
		if (G->arcs[i][G->vexs[del].id] != Maxint){
			p->linked[j].distance = G->arcs[i][G->vexs[del].id];
			G->arcs[i][G->vexs[del].id] = Maxint;
			G->arcs[G->vexs[del].id][i] = Maxint;

			G->economic_arcs[i][G->vexs[del].id] = Maxint;
			G->economic_arcs[G->vexs[del].id][i] = Maxint;
			//将被删除城市的id和路径存链表中

			p->linked[j].id = i;
			j++;
		}
	}
	p->next = G->x->head;//头插法
	G->x->head = p;
	//test
	 
	G->vexs[del].id = 0;//删除节点id为0
	 
	printf("删除成功\n");

	

}
void del_lane(MGraph * G){//删除路径
	printf("输入被删除路径的两个城市名\n");
	char name5[7];
	scanf(" %s", &name5);
	//getchar();
	char name6[7];
	scanf(" %s", &name6);
	if (is_real(name5, G) && is_real(name6, G)){
		int id1 = getid(name5, G);
		int id2 = getid(name6, G);
		int real1 = G->vexs[id1].id;
		int real2 = G->vexs[id2].id;
		printf("id:%d real:%d", id1, real1);
		if (G->arcs[id1][id2] != Maxint){
			printf("%s与%s间有路径,可以进行删除路径操作\n", G->vexs[id1].name, G->vexs[id2].name);
			G->arcs[real1][real2] = Maxint;
			G->arcs[real2][real1] = Maxint;
			G->economic_arcs[real2][real1] = Maxint;
			G->economic_arcs[real1][real2] = Maxint;
			printf("删除成功\n");
		}
		else
			printf("%s与%s间没有路径,删除失败\n", G->vexs[id1].name, G->vexs[id2].name);
	}
	else
	{
		printf("输入的城市不合法\n");
	}
}
void add_citylane(MGraph  *G){//增加路径
	int t = 0;
	printf("输入增加路径的两个城市名\n");
	char name1[7];
	char name2[7];

	scanf(" %s", &name1);
	//getchar();
	 
	scanf(" %s", &name2);
	if (is_real(name1, G) && is_real(name2, G)){
		int id1 = getid(name1, G);
		int id2 = getid(name2, G);
		if (G->arcs[id1][id2] == Maxint)
		{
			printf("%s与%s之间没有路径\n", G->vexs[id1].name, G->vexs[id2].name);

			int real1 = G->vexs[id1].id;
			int real2 = G->vexs[id2].id;
			printf("增加的路径的长度为:\n");
			scanf(" %d", &t);

			G->arcs[real1][real2] = t;
			G->arcs[real2][real1] = t;
			G->economic_arcs[real1][real2] = t;//默认价格为1单位/公里
			G->economic_arcs[real2][real1] = t;
			printf("添加成功\n");

		}
		else
			printf("%s与%s间已有路径,增加失败\n", G->vexs[id1].name, G->vexs[id2].name);
	}
	else
		printf("输入城市不在库中\n");

}
void modify_lane(MGraph  *G){//修改路径
	int t = 0;
	printf("输入修改路径的两个城市名\n");
	char name3[7];
	scanf(" %s", &name3);
	//getchar();
	char name4[7];
	scanf(" %s", &name4);
	int id1 = getid(name3, G);
	int id2 = getid(name4, G);
	int real1 = G->vexs[id1].id;
	int real2 = G->vexs[id2].id;
	if (G->arcs[id1][id2] != Maxint){



		printf("%s与%s间已有路径,将原有路径修改为:\n",G->vexs[id1].name,G->vexs[id2].name);
		scanf(" %d", &t);

		G->arcs[real1][real2] = t;
		G->arcs[real2][real1] = t;
		G->economic_arcs[real1][real2] = t;
		G->economic_arcs[real2][real1] = t;
		printf("修改成功\n");
	}
	else 
		printf("%s与%s间没有路径:\n", G->vexs[id1].name, G->vexs[id2].name);
}
 
void mangement_menu(){//管理系统/菜单

	printf("丨———1 增加城市——--—---------------————丨\n");
	printf("丨———2 修改城市有关信息-————--—-———-—丨\n");
	printf("丨———3 删除城市-----------——--———----——丨\n");
	printf("丨—----4 增加路径--------——--————-------—丨\n");
	printf("丨——--5 修改城市路径--------————-----------丨\n");
	printf("丨------6 删除路径---------———--------------—丨\n");
	printf("丨——--7 查看被删除城市及其路径-----------------丨\n");
	printf("丨——--0 exit------------——--—————-------丨\n");
}
char* getname(int id, MGraph *G){
	 
	int i = 1;
	while (G->vexs[i].id != id&&i <= G->length){//被删除的id为0则无法获取
		i++;
	}
	if (G->vexs[i].id == id&&i<=G->length)//
		return G->vexs[i].name;
	else return  NULL;
}
struct node*is_belong(char name[], MGraph *G){
	struct node*s = G->x->head;
	if (!s){
		return NULL;
	}
	else{
		while (s&&strcmp(s->name, name)!= 0){
			s = s->next;
		}
		if (s != NULL)
		{
			return s;
		}
		else 
			return NULL;
	}
	 
}
void present_delcityifo(MGraph *G){
	printf("被删除的城市的信息\n");
	struct node*p = G->x->head;
	if (!p){
		printf("没有被删除的城市\n");
	}
	else{
		 
		while (p){
			int i = 1;
			while (p->linked[i].id != -1){
				printf("被删除的城市名为%s,与它相连的第%d个城市的为%s\n", p->name, i, getname(p->linked[i].id,G));
				i++;
			}
			p = p->next;

		}
	}
}
int lonecity(MGraph*G, int id){
	int i = 1;
	int flag = 1;
	while (i <=G->length)
	{
		if (G->arcs[G->vexs[id].id][i] == Maxint){
			i++;
		}
		else if (G->arcs[G->vexs[id].id][i]!= Maxint){

			flag = 0;
			break;
		}

	}
	if (flag == 0)
		return 1;
	else
		return 0;
	

}
int is_real(char name[], MGraph *G){
	int i = 1;
	int flag = 0;
	while (i<= G->length){//
		if (strcmp(name, G->vexs[i].name) == 0 && G->vexs[i].id != 0){
				flag = 1;
				break;
			
		}
		i++;
	}
	if (flag == 1)
		return 1;
	else
		return 0;
}

 //main函数文件

#define _CRT_SECURE_NO_WARNINGS 
#include"Traffic_consult.h"

 
int main()
{
	int flag7 = 0;
	int temp;

	int t = 0;
	const char secret[4] = "ccsu";
	 
	
	MGraph*G=CreateMGraph();
	t = G->length;
	
	do{

		menu();
		printf("please choose:\n");
		scanf(" %d", &temp);
		switch (temp)
		{
		case(1) :
		{
					flag7 = 1;
					printf("求单源路经,输入起点的城市名 : \n");
					char name[7];
					int v = 0;
					scanf("%s", name);
					if (is_real(name, G)){
						v = getid(name, G);
						printf("%s的id为%d\n", name, v);
						Dijkstra(G, G->vexs[v].id, G->length,flag7);
						printf("感谢您的使用\n");

					}
					else
					{
						printf("输入城市不合法\n");
					}
					break;

		}
		case(2) : {
					  flag7 = 1;
					  
					  int temp1 = 0;
					  int temp2 = 0;
					  printf("解决任意两个城市的最短路径问题\n");
					  printf("输入两个城市的名字:>\n");
					  char name1[7];
					  scanf(" %s", name1);
					  temp1 = G->vexs[getid(name1, G)].id;
					  char name2[7];
					  scanf(" %s", name2);
					  temp2 = G->vexs[getid(name2, G)].id;
					  if (is_real(name1, G) && is_real(name2, G)){

						  Floyd(G, G->length, flag7, temp1, temp2);
						  if (D[temp1][temp2] == Maxint)
						  {
							  printf("%s与%s间无路径\n", G->vexs[getid(name1, G)].name, G->vexs[getid(name2, G)].name);

						  }
						  else if (D[temp1][temp2] != Maxint)
						  {
							  printf("%s与%s间的最短路径为%d\n", G->vexs[getid(name1, G)].name, G->vexs[getid(name2, G)].name,D[temp1][temp2]);

						  }
						  printf("感谢您的使用\n");
						  
					  }
					  else {
						  printf("输入城市不合法\n");
						 
					  }
					  break;
		}
		case(3) : {
					  printf("查看城市及其城市的代号:\n");
					  

					  city_allshow(G);


					  break;


		}
		case(5) : {
					  printf("选择最经济的路线\n");
					  flag7 = 0;//标志
					 
					  int temp1 = 0;
					  int temp2 = 0;
					  printf("解决任意两个城市的最短路径问题\n");
					  printf("输入两个城市的名字:>\n");
					  char name1[7];
					  scanf(" %s", name1);
					  temp1 = G->vexs[getid(name1, G)].id;
					  char name2[7];
					  scanf(" %s", name2);
					  temp2 = G->vexs[getid(name2, G)].id;
					  if (is_real(name1, G) && is_real(name2, G)){
						  Floyd(G, G->length, flag7,temp1,temp2);//求出任意两个城市间的最短路径

						  if (D[temp1][temp2] == Maxint)
						  {
							  printf("%s与%s间无路径,,故没有最佳经济路线\n", G->vexs[getid(name1, G)].name, G->vexs[getid(name2, G)].name);

						  }
						  else if (D[temp1][temp2] != Maxint)
						  {
							  printf("%s与%s间的佳经济方案的总油耗价钱为%d\n", G->vexs[getid(name1, G)].name, G->vexs[getid(name2, G)].name, D[temp1][temp2]);

						  }
						  printf("感谢您的使用\n");
					  }
					  break;

		}
		case(7) : {
					  printf("进入管理员模式\n");
					  char secret_code[7];
					  int zx = 0;

					  printf("验证身份,请输入管理员密码:\n");
					  scanf("%s", secret_code);
					  if (!strncmp(secret, secret_code, sizeof(secret) / sizeof(secret[0])))
					  {
						  printf("验证成功\n");

						  do{
							  mangement_menu();
							  printf("please choose:\n");
							  scanf(" %d", &zx);
							  switch (zx){
							  case(1) : {
											printf("添加城市信息\n");
											add(G);
											break;

							  }
							  case(2) : {
											printf("修改城市信息\n");
											modify(G);
											break;

							  }
							  case(3) : {
											del_cityinfo(G);
											printf("删除城市信息\n");

											break;

							  }
							  case(4) : {
											printf("增加路径\n");
											add_citylane(G);
											break;
							  }
							  case(5) : {

											printf("修改路径\n");
											modify_lane(G);
											break;
							  }
							  case(6) : {
											printf("删除路径\n");
											del_lane(G);
											break;
							  }
							  case(7) : {
											present_delcityifo(G);
											break;

							  }
							  case(0) : {
											printf("exit the model of manger");
											break;
							  }

							  }

						  } while (zx);

						  break;

					  }
					  else
					  {

						  printf("验证失败");
						  break;
					  }





		case(0) : {
					  printf("退出系统");
					  break;

		}




		}


		}
	} while (temp);


	return 0;

}

















管理员密码应该在程序中能得到吧,截图就免了,挺麻烦的

但还是放几张图:

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值