データ構造とアルゴリズム総合実験(二)の図と観光地情報管理システムの実践(一)

5026 ワード

実験の目的
1、図の定義と図の記憶構造を把握する.2、図の作成方法と図の応用を把握する.3、C++言語を使用して、図のデータ構造を定義し、反復開発の構想と結びつけて「観光地情報管理システム」を実現する.
注意しなければならないのは、今回の実験はGraphにあります.hでは図の定義がPPTで与えられたものと若干異なり,graphの定義では複数回のリンクの問題を回避するためにexternが宣言する形式を採用している.
main.cppメインプログラムソースファイル
#include"Tourism.h"
#include
using namespace std;
int main() {
	menu();
	return 0;
}

Graph.hヘッダファイル
#ifndef GRAPH_H
#define GRAPH_H
struct Vex {
	int num;    //    
	char name[20];   //    
	char infor[1024];  //    
	/*  ==   
	bool operator==(const Vex &t) {
		return num==t.num;
	}
	*/
};
struct Edge {
	int vex1,vex2;
	int weight; //  
};
struct Graph {
	int map[20][20];   //    
	Vex vexs[20];  //    
	int VexNum;   //    
};
void Init();
int InsertVex(Vex sVex);
int InsertEdge(Edge sEdge);
Vex getVeX(int nVex);
int FindEdge(int nVex, Edge aEdge[]);
int GetVexnum();
#endif 




Graph.cppソースファイル
#include "Graph.h"
#include
Graph graph;
using namespace std;
void Init() {
	for (int i = 0; i < 20; i++) {
		for (int j = 0; j < 20; j++) {
			if (i == j) graph.map[i][j] = 0;
			else graph.map[i][j] = 0xffff;
		}
	}
	graph.VexNum = 0;
}
int InsertVex(Vex sVex) {
	if (graph.VexNum >= 20) return 0;
	graph.vexs[graph.VexNum] = sVex;
	graph.VexNum++;
	return 1;
}
int InsertEdge(Edge sEdge) {
	int num1 = sEdge.vex1;
	int num2 = sEdge.vex2;
	if (num1 != num2) {
		graph.map[num1][num2] = sEdge.weight;
		graph.map[num2][num1] = sEdge.weight;
		return 1;
	}
	else return 0;
}
Vex getVeX(int nVex) {
	return graph.vexs[nVex];
}
int FindEdge(int nVex, Edge aEdge[]) {
	int k = 0;
	for (int i = 0; i < graph.VexNum; i++) {
		if (graph.map[i][nVex] > 0 && graph.map[i][nVex] < 0xffff) {
			aEdge[k].vex1 = nVex;
			aEdge[k].vex2 = i;
			aEdge[k].weight = graph.map[i][nVex];
			k++;
		}
	}
	return k;
}
int GetVexnum() {
	return graph.VexNum;
}

Tourism.h旅行先ファイル
#ifndef TOURISM_H
#define TOURISM_H
void CreateGraph();
void GetSpotInfo();
void menu();
#endif

Tourism.cpp観光ソースファイル
#include
#include
#include"Tourism.h"
#include"Graph.h"
using namespace std;
extern Graph graph;
void CreateGraph() {
	ifstream is;
	Init();
	is.open("Vex.txt");
	int n;
	is >> n;
	cout << "    :" << n << endl;
	cout << "-----    -----" << endl;
	for (int i = 0; i < n; i++) {
		Vex vex;
		is >> vex.num >> vex.name >> vex.infor;
		cout << vex.num << "-" << vex.name << endl;
		if (InsertVex(vex) == 0) {
			cout << "        !" << endl;
			break;
		}
	}
	is.close();
	is.open("Edge.txt");
	Edge edges[190];
	int k = 0;
	cout << "-----   -----" << endl;
	while (is >> edges[k].vex1 >> edges[k].vex2 >> edges[k].weight) {
		cout << " " << edges[k].weight << endl;
		if (InsertEdge(edges[k]) == 0) {
			cout << "        !" << endl;
			break;
		}
		k++;
	}
	for (int i = 0; i < k; i++) {
		int num1 = edges[i].vex1;
		int num2 = edges[i].vex2;
		int weight = edges[i].weight;
		graph.map[num1][num2] = weight;
		graph.map[num2][num1] = weight;
	}
	is.close();
}
void GetSpotInfo() {
	cout << "=====        =====" << endl;
	for (int i = 0; i < graph.VexNum; i++) {
		cout << graph.vexs[i].num << "-" << graph.vexs[i].name << endl;
	}
	cout << "            :";
	int k;
	cin >> k;
	for (int i = 0; i < graph.VexNum; i++) {
		if (graph.vexs[i].num == k) {
			cout << graph.vexs[i].name << endl;
			cout << graph.vexs[i].infor << endl;
			break;
		}
	}
	cout << "-----      -----" << endl;
	Edge aEdges[180];
	int m = FindEdge(k, aEdges);
	cout << m << endl;
	for (int i = 0; i < m; i++) {
		cout << graph.vexs[aEdges[i].vex1].name << "->" << graph.vexs[aEdges[i].vex2].name << " " << aEdges[i].weight << "m" << endl;
	}
}
void menu() {
	cout << "=====          =====" << endl;
	cout << "1.       " << endl;
	cout << "2.      " << endl;
	cout << "3.      " << endl;
	cout << "4.      " << endl;
	cout << "5.      " << endl;
	cout << "0.  " << endl;
	cout << "       (0~5):";
	int i;
	cin >> i;
	switch (i) {
	case 0:exit(0); break;
	case 1: {
		CreateGraph(); 
		cout << "         !" << endl;
		menu();
		break;
	}
	case 2: {
		GetSpotInfo();
		menu();
		break;
	}
	case 3://      
	case 4://      
	case 5://      
	default: {
		cout << "     0~5   :";
		menu();
		break;
	}
	}
}