数据结构课设——校园导航

为了防止以后可能需要又找不到
还是上传一下吧
内容注释写的比较清楚了

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#define MAX_VEX 100 
#define inf 100000
#define ERROR -1
#define OK 1
#define TRUE 1
#define FLASE 0
using namespace std;
typedef int Status;

typedef struct 
{  
	char vexs[MAX_VEX][MAX_VEX]; //景点向量代号 
	char name[MAX_VEX][MAX_VEX];//景点名称 
	char  ins[MAX_VEX][1000];//景点简介 
    int arcs[MAX_VEX][MAX_VEX]; //邻接矩阵 
	int vexnum;
	int arcnum; //图的当前顶点数和弧数 
} MGraph ; //图的结构定义


int locate(MGraph G,char c[]);//定位点 
MGraph create();//创建无向图 
void print(MGraph G);//打印邻接矩阵 
void browse(MGraph G);//打印全部景点信息 
void shortestd(MGraph G);//查看浏览路线 
void shortestf(MGraph G);//查看浏览路线 
void seeabout(MGraph G);//景点信息查询 
void change(MGraph &G);//更改图的信息 
void add(MGraph &G);//增加景点及边
void mi(MGraph &G);//减少景点及边
void reb(MGraph &G);//重建图 
void allpath(MGraph G);//查询一条一次遍历所有景点的可行路径


int locate(MGraph G,char c[]){//定位 
	int i=0;
	for(i=0;i<G.vexnum;i++){
		if(strcmp(G.vexs[i],c)==0) return i;
	} 
	return -1;
}

MGraph create(){//创建无向图 
	MGraph G;
	int i=0,j=0,k=0;
	char ch1[MAX_VEX],ch2[MAX_VEX];
	int flag[2]={-1};
	int weigh;
	printf("请输入景点个数,边数:");
	scanf("%d %d",&G.vexnum,&G.arcnum);
	getchar();
	while(i<G.vexnum){//输入景点代号以及信息 
		printf("请输入景点代号:");
		scanf("%s",G.vexs[i]);
		getchar();
		printf("请输入景点名字:");
		gets(G.name[i]);
		printf("请输入景点简介:");
		gets(G.ins[i]); 
		i++;
	} 
	for(i=0;i<G.vexnum;i++){//初始化邻接矩阵 
		for(j=0;j<G.vexnum;j++){
			G.arcs[i][j]=inf;
		}
	}
	
	printf("请输入每条边依附的景点代号和距离:\n");//输入各点间关系 
	for(i=0;i<G.arcnum;i++){
		scanf("%s",ch1);
		getchar();
		scanf("%s",ch2);
		getchar(); 
		scanf("%d",&weigh);
		getchar();
		flag[0]=locate(G,ch1);
		flag[1]=locate(G,ch2);
		G.arcs[flag[0]][flag[1]]=weigh;
		G.arcs[flag[1]][flag[0]]=weigh;
	}
	//测试使用初始图 
	/*
	G.vexnum=5;
	G.arcnum=7;
	char str1[5][100]={"a","b","c","d","e"};
	char str2[5][100]={"图书馆","操场","食堂","池塘","教学楼"};
	char str3[5][100]={"图书馆是收集、整理和保存文献资料并向读者提供利用的科学、文化、教育机构","操场是供体育锻炼用的场地,是学校进行体育活动和教学活动的专置场地","食堂是学校教职工用餐的地方","池塘是休闲放松的好地方","教学楼是学生们上课的地方"}; 
	for(int i;i<5;i++){
		strcpy(G.vexs[i],str1[i]);
		strcpy(G.name[i],str2[i]);
		strcpy(G.ins[i],str3[i]);
	}
	int a[5][5]={{inf,10,inf,30 ,100},{10, inf, 50 ,inf ,inf},{inf, 50, inf, 20 ,10},{30, inf ,20 ,inf, 60},{100, inf, 10 ,60 ,inf}};
	for(int i=0;i<5;i++){
		for(int j=0;j<5;j++){
			G.arcs[i][j]=a[i][j];
		}
	}*/
	return G;
}
void browse(MGraph G){//学校景点介绍 
	printf("景点代号\t景点名称\t景点简介\n");
	printf("-------------------------------------------------------\n"); 
	int i;
	for(i=0;i<G.vexnum;i++){
		printf("%s\t\t%s\t\t",G.vexs[i],G.name[i]);
		puts(G.ins[i]);
	} 
} 

void shortestd(MGraph G){//查看浏览路线 
	int i,j,k,n;
	char v0[MAX_VEX];
	printf("请输入起始景点代号:");//输入景点代号 
	scanf("%s",v0);
	int v=locate(G,v0);//定位 
	if(v==-1){
		printf("输入的代号错误\n");
		return ;
	}
	int final[MAX_VEX]={0},d[MAX_VEX]={0};
	int  p[MAX_VEX];
	for(i=0;i<G.vexnum;i++){
		d[i]=G.arcs[v][i]; 
		p[i]=v;//保存最短路径顶点上一个顶点 
	}
	d[v]=0;//初始化 
	final[v]=1;
	for(i=0;i<G.vexnum;i++){//主循环,每次求到另一个点的最短路径 
		int min=inf;
		n=-1; 
		for(j=0;j<G.vexnum;j++){
			if(!final[j]){
				if(d[j]<min){
					n=j;
					min=d[j];
				}
			}
		} 
		final[n]=1;
		for(j=0;j<G.vexnum;j++){
			if(!final[j]&&(min+G.arcs[n][j]<d[j])){
				d[j]=min+G.arcs[n][j];
				p[j]=n;
			}
		}
	}
	for(i=0; i<G.vexnum; i++)
    {
        int k = i;
        // 顶点sv到其它顶点的路径
        printf("从%s 到 %s的最短距离为 %d\n路径为",G.name[v],G.name[k], d[k]);
        // 最短路径顶点关系
        do
        {
            printf("%s -> ",G.name[k]);
            k=p[k];
        } while( k!= v);  
        printf("%s\n",G.name[k]);
    }
} 

void shortestf(MGraph G){//求两个景点之间的最短路径 
	int i,j,k;
	char ch1[100],ch2[100];
	int d[MAX_VEX][MAX_VEX];
	int p[MAX_VEX][MAX_VEX];
	printf("请输入起点和终点的景点代号:");
	scanf("%s %s",ch1,ch2);
	int v1=locate(G,ch1);
	int v2=locate(G,ch2);
	if(v1==-1||v2==-1){
		printf("起始点代号错误\n");
		return;
	}
	for(i=0;i<G.vexnum;i++){//初始化 
		for(j=0;j<G.vexnum;j++){
			d[i][j]=G.arcs[i][j];
			p[i][j]=j;
		}
	}
	for(i=0;i<G.vexnum;i++){
		for(j=0;j<G.vexnum;j++){
			for(k=0;k<G.vexnum;k++){
				if(d[j][k]>d[j][i]+d[i][k]){
					d[j][k]=d[j][i]+d[i][k];
					p[j][k]=p[j][i];
				}
			}
		}
	}
	k=v1;
	printf("从%s到%s的最短距离为%d\n路径为",G.name[v1],G.name[v2],d[v1][v2]);
	printf("路径为:");
	while(k!=v2){
		printf("%s ->",G.name[v1]);
		k=p[k][v2];
		strcpy(ch1,G.name[k]);
	}
	printf("%s\n",G.name[v2]);
}

void seeabout(MGraph G){//景点信息查询 
	printf("请输入查询的景点代号:");
	char str[100];
	scanf("%s",str);
	printf("景点代号\t景点名称\t景点简介\n");
	printf("-------------------------------------------------------\n"); 
	printf("%s\t\t",str);
	int v=locate(G,str);//定位 
	printf("%s\t\t",G.name[v]); 
	puts(G.ins[v]);//打印 
} 

void add(MGraph &G){//增加景点个数和边 
	printf("请输入新添加的景点个数和边的条数:");
	int n=5,m=7,p=G.vexnum,q=G.arcnum,weigh;
	int flag[2]={-1};
	int i=p,j,k;
	char ch1[100],ch2[100];
	scanf("%d %d",&n,&m);
	G.vexnum+=n;
	G.arcnum+=m;
	getchar();
	while(i<G.vexnum){//输入景点代号以及信息 
		printf("请输入景点代号:");
		scanf("%s",G.vexs[i]);
		getchar();
		printf("请输入景点名字:");
		gets(G.name[i]);
		printf("请输入景点信息:");
		gets(G.ins[i]);
		i++;
	} 
	
	for(i=0;i<G.vexnum;i++){
		G.arcs[i][G.vexnum-1]=inf;
	}
	for(i=p;i<=G.vexnum;i++){
		for(j=0;j<G.vexnum;j++){
			G.arcs[i][j]=inf;
		}
	}
	if(m==0) return ; 
	printf("请输入新增每条边依附的景点代号和距离:\n");//输入各点间关系 
	for(i=q;i<G.arcnum;i++){
		scanf("%s",ch1);
		getchar();
		scanf("%s",ch2);
		getchar(); 
		scanf("%d",&weigh);
		getchar();
		flag[0]=locate(G,ch1);
		flag[1]=locate(G,ch2);
		G.arcs[flag[0]][flag[1]]=weigh;
		G.arcs[flag[1]][flag[0]]=weigh;
	} 
	print(G);
} 

void mi(MGraph &G){// 减少景点个数和边 
	printf("请输入减少的景点个数和边的条数(不包括减少的景点所包含的路径):");
	int n,m,t;
	int flag[2]={-1};
	int i,j,k,v[MAX_VEX];
	char ch1[100],ch2[100];
	scanf("%d %d",&n,&m);
	getchar();
	printf("请输入减少的景点代号:");
	for(i=0;i<n;i++){
		scanf("%s",ch1);
		v[i]=locate(G,ch1);
		for(j=v[i]+1;j<G.vexnum-i;j++){
			strcpy(G.vexs[j-1],G.vexs[j]);
			strcpy(G.ins[j-1],G.ins[j]);
			strcpy(G.name[j-1],G.name[j]); 
		}
		for(t=0;t<G.vexnum;t++){
			for(j=v[i];j<G.vexnum-i-1;j++){
				G.arcs[t][j]=G.arcs[t][j+1];
			}
		}
		for(t=0;t<G.vexnum;t++){
			for(j=v[i];j<G.vexnum-i-1;j++){
			    G.arcs[j][t]=G.arcs[j+1][t];
			}
		}
	}
	G.vexnum-=n;    
	G.arcnum-=m;
	if(m!=0){
		printf("请输入减少每条边依附的景点代号:\n");
		for(i=0;i<m;i++){
			scanf("%s",ch1);
			getchar();
			scanf("%s",ch2);
			getchar(); 
			flag[0]=locate(G,ch1);
			flag[1]=locate(G,ch2);
			G.arcs[flag[0]][flag[1]]=inf;
			G.arcs[flag[1]][flag[0]]=inf;
		} 
	}
	print(G); 
} 

void reb(MGraph &G){//重建图 
	int i=0,j=0,k=0;
	char ch1[MAX_VEX],ch2[MAX_VEX];
	int flag[2]={-1};
	int weigh;
	printf("请输入景点个数,边数:");
	scanf("%d %d",&G.vexnum,&G.arcnum);
	getchar();
	while(i<G.vexnum){//输入景点代号以及信息 
		printf("请输入景点代号:");
		scanf("%s",G.vexs[i]);
		getchar();
		printf("请输入景点名字:");
		gets(G.name[i]);
		printf("请输入景点信息:");
		gets(G.ins[i]);
		i++;
	} 
	for(i=0;i<G.vexnum;i++){//初始化邻接矩阵 
		for(j=0;j<G.vexnum;j++){
			G.arcs[i][j]=inf;
		}
	}
	
	printf("请输入每条边依附的景点代号和距离:\n");//输入各点间关系 
	for(i=0;i<G.arcnum;i++){
		scanf("%s",ch1);
		getchar();
		scanf("%s",ch2);
		getchar(); 
		scanf("%d",&weigh);
		getchar();
		flag[0]=locate(G,ch1);
		flag[1]=locate(G,ch2);
		G.arcs[flag[0]][flag[1]]=weigh;
		G.arcs[flag[1]][flag[0]]=weigh;
	} 
	print(G);
}

void change(MGraph &G){//更改图的信息 
	printf("1.增加新的景点及边\n2.减少新的景点及边\n3.重建图\n");
	int op;
	printf("请输入操作:");
	scanf("%d",&op);
	switch(op){
		case 1:add(G);break;
		case 2:mi(G); break;
		case 3:reb(G); break;
	} 
} 

void allpath(MGraph G){//查询一条一次遍历所有景点的可行路径
	char ch1[100];
	int flag[100]={0},a[100],front,rear,i,j,p;
	printf("\n请输入从哪个景点代号开始:");
	scanf("%s",ch1);
	front=rear=0;
	i=locate(G,ch1);
	a[rear++]=i;
	flag[i]=1;
	while(rear>front){
		p=a[front++];
		printf("%s ",G.name[p]);
		for(j=0;j<G.vexnum;j++){
			if(flag[j]==0&&G.arcs[p][j]!=inf){
				flag[j]=1;
				a[rear++]=j;
			}
		}
	}
	printf("\n");
}


void print(MGraph G){//打印邻接矩阵 
	int i,j;
	printf("\n图的邻接矩阵为:\n");
	printf(" \t"); 
	for(i=0;i<G.vexnum;i++) printf("%s\t",G.name[i]);
	printf("\n");
	for(i=0;i<G.vexnum;i++){
		printf("%s\t",G.name[i]);
		for(j=0;j<G.vexnum;j++){
			if(G.arcs[i][j]==inf) printf("∞\t");
			else printf("%d\t", G.arcs[i][j]);
		}
		printf("\n");
	}
} 

int main(){
	
	MGraph G=create();
	while(1){
		printf("------------------欢迎使用校园导游系统-------------------\n");
		printf("\n                   欢迎来到青岛大学\n");
		printf("\n                     菜 单 选 择\n"); 
		printf("\n\t1.学校景点介绍\t\t2.查看游览路线\n");
		printf("\t3.查询景点间最短路径\t4.景点信息查询\n");
		printf("\t5.更改图信息\t \t6.查询一条一次遍历所有景点的可行路径\n");
		printf("\t7.打印邻接矩阵\t\t8.退出\n"); 
		printf("请输入您的选择:");
		int op;
		scanf("%d",&op);
		switch(op){
			case 1: browse(G);break;
			case 2: shortestd(G);break;
			case 3: shortestf(G);break;
			case 4: seeabout(G);break;
			case 5: change(G);break;
			case 6: allpath(G);break;
			case 7: print(G);break;
			case 8: printf("退出系统\n");exit(0);break;
			default: printf("命令错误请重新输入\n");break;
		}
	}
	return 0; 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值