安阳旅游地图

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define MaxNum 10
#define INFINITY 9999
#define MaxStringLength 100
 
typedef struct GNode {
    int NumVertex;
    int NumEdge;
    int Vertexs[MaxNum][MaxNum];
    char VertexData[MaxNum][MaxStringLength];
} Graph;
 
typedef struct view{
    char viewname[100];
    char viewinformation[1000];
}view;
void enter(view v[],char*name,char*information,int i){
    strcpy(v[i].viewname,name);
    strcpy(v[i].viewinformation,information);
}
void print_view(view v[]){
    for(int i=0;i<10;i++){
        printf("景点名称:%s\n",v[i].viewname);
        printf("景点介绍:%s\n",v[i].viewinformation);
        printf("\n");
    }
}
void visit(Graph* graph, int vertex) {
    printf("%s ", graph->VertexData[vertex]);
}
 
Graph* Make_Graph(int NumVertex, int NumEdge) {
    Graph* graph = (Graph*)malloc(sizeof(Graph));
    graph->NumVertex = NumVertex;
    graph->NumEdge = 0;
    for (int i = 0; i < NumVertex; i++) {
        for (int j = 0; j < NumVertex; j++) {
            graph->Vertexs[i][j] = 0;
        }
    }
    return graph;
}
 
void Add_Edge(Graph* graph, int vertex1, int vertex2, int weight) {
    if (graph == NULL || graph->NumVertex == 0) {
        printf("error");
        return;
    }
    graph->Vertexs[vertex1][vertex2] = weight;
    graph->Vertexs[vertex2][vertex1] = weight;
}
 
void Add_Vertex_Data(Graph* graph, int vertex, char* name) {
    if (graph == NULL || vertex > graph->NumVertex - 1 || vertex < 0) {
        printf("error");
        return;
    }
    strcpy(graph->VertexData[vertex], name);
}
 
void DFS(Graph* graph, int vertex, void (*visit)(Graph*, int), bool visited[]) {
    visit(graph, vertex);
    visited[vertex] = true;
    for (int i = 0; i < graph->NumVertex; i++) {
        if (graph->Vertexs[vertex][i] != 0 && !visited[i] && graph->Vertexs[vertex][i] != INFINITY) {
            DFS(graph, i, visit, visited);
        }
    }
}
 
void dijkstra(Graph* graph, int start, bool visited[]) {
    int T[MaxNum][2];
    for (int i = 0; i < graph->NumVertex; i++) {
        T[i][0] = INFINITY;
        T[i][1] = -1;
        visited[i] = false;
    }
    T[start][0] = 0;
    T[start][1] = -1;
    for (int i = 0; i < graph->NumVertex - 1; i++) {
        int mindist = INFINITY;
        int minindex = -1;
        for (int j = 0; j < graph->NumVertex; j++) {
            if (!visited[j] && T[j][0] < mindist) {
                mindist = T[j][0];
                minindex = j;
            }
        }
        visited[minindex] = true;
        for (int k = 0; k < graph->NumVertex; k++) {
            if (!visited[k] && graph->Vertexs[minindex][k] != 0 && T[minindex][0] + graph->Vertexs[minindex][k] < T[k][0]) {
                T[k][0] = T[minindex][0] + graph->Vertexs[minindex][k];
                T[k][1] = minindex;
            }
        }
    }
    int end;
    printf("请输入目的地编号:");
    scanf("%d", &end);
    printf("最短距离为:%dkm\n", T[end][0]);
    printf("最短路线为:%s ", graph->VertexData[end]);
    int temp = T[end][1];
    while (temp != -1) {
        printf("<- %s ", graph->VertexData[temp]);
        temp = T[temp][1];
    }
}
 
void prim(Graph* graph, bool intree[]) {
    int parent[MaxNum];
    int dist[MaxNum];
    int totalCost = 0;
    
    // 用于存储最小生成树的边集合
    int treeEdges[MaxNum][3]; // 每行包含两个顶点和边的权重
    int edgeCount = 0;

    for (int i = 0; i < graph->NumVertex; i++) {
        dist[i] = INFINITY;
        intree[i] = false;
        parent[i] = -1;
    }
    dist[0] = 0;

    for (int i = 0; i < graph->NumVertex; i++) {
        int mindist = INFINITY;
        int minindex = -1;
        for (int j = 0; j < graph->NumVertex; j++) {
            if (!intree[j] && dist[j] < mindist) {
                mindist = dist[j];
                minindex = j;
            }
        }
        if (minindex == -1) {
            // 如果没有找到未加入树的顶点,立即退出函数
            return;
        }
        if (parent[minindex] != -1) {
            // 如果该顶点不是起始顶点,记录该边
            treeEdges[edgeCount][0] = parent[minindex];
            treeEdges[edgeCount][1] = minindex;
            treeEdges[edgeCount][2] = mindist;
            totalCost += mindist;
            edgeCount++;
        }
        intree[minindex] = true;
        for (int j = 0; j < graph->NumVertex; j++) {
            if (!intree[j] && graph->Vertexs[minindex][j] != 0 && graph->Vertexs[minindex][j] < dist[j]) {
                parent[j] = minindex;
                dist[j] = graph->Vertexs[minindex][j];
            }
        }
    }

        printf("最小生成树的边集合:\n");
        for (int i = 0; i < edgeCount; i++) {
            printf("%s <-> %s: %d km\n", graph->VertexData[treeEdges[i][0]], graph->VertexData[treeEdges[i][1]], treeEdges[i][2]);
        }
        printf("总距离: %d km\n", totalCost);
}


int main() {
    bool visited[MaxNum];
    for (int i = 0; i < MaxNum; i++) {
        visited[i] = false;
    }
    bool intree[MaxNum];
    for (int i = 0; i < MaxNum; i++) {
        intree[i] = true;
    }
    int NumVertex = 10;
    int NumEdge = 19;
    Graph* graph = Make_Graph(NumVertex, NumEdge);
    for (int i = 0; i < NumVertex; i++) {
        char* name = (char*)malloc(sizeof(char) * 100);
        printf("请输入%d号景点的名称:\n", i);
        scanf("%s", name);
        Add_Vertex_Data(graph, i, name);
    }
    for (int i = 0; i < NumEdge; i++) {
        int v1, v2, weight;
        printf("请输入两个景点的编号和距离:\n");
        scanf("%d %d %d", &v1, &v2, &weight);
        printf("从%d号景点到%d号景点的距离%d:\n", v1, v2, weight);
        Add_Edge(graph, v1, v2, weight);
        printf("\n\n");
    };
    view v[10];
    for(int i=0;i<10;i++){
        char*name=(char*)malloc(sizeof(char)*100);
        char*information=(char*)malloc(sizeof(char)*1000);
        printf("请输入景点名称:"); 
        scanf("%s",name);
        printf("请输入景点信息:");
        scanf("%s",information);
        enter(v,name,information,i); 
    }
    printf("\n\n");
    int choice;
    int start;
    do{
        
        printf("                                                                               \n");
        printf("                                                                               \n");                                 
        printf("                  |-------------0殷墟------1袁林-------2中国文字博物馆         \n");
        printf("                  |              |                  |             |            \n");
        printf("6红旗渠------------              |                  |             |            \n");
        printf("    |             |              |---------------4羑里城-----------            \n");
        printf("    |             |              |                  |             |            \n");
        printf("    |             |              |                  |             |            \n");
        printf("7太行大峡谷-------|-------------3长春观----------5岳飞庙-------   |            \n");
        printf("                                                    |         |   |            \n");
        printf("                                                    |          8二帝陵         \n");
        printf("                                                    |             |            \n");
        printf("                                                    |             |            \n");
        printf("                                                    |----------9明福寺         \n");
        printf("                                                                               \n");
        printf("                                                                               \n");
        printf("*******************************河南安阳旅游地图********************************\n");
        printf("                                                                               \n");
        printf("              【1】景点名称及相关信息\n");
        printf("              【2】深度遍历景点\n");
        printf("              【3】获取最短路径\n");
        printf("              【4】修建高速公路路线\n"); 
        printf("               请输入你的选项:\n");
        scanf("%d",&choice);
        printf("\n\n\n");
        if(choice==1){
            print_view(v);
        } 
        if(choice==2){
            int num;
            printf("请输入作为遍历起点的景点编号:");
            scanf("%d",&num);
            DFS(graph, num, visit, visited);
            printf("\n");
        }
        if(choice==3){
            printf("请输入出发地地点编号:\n");
            scanf("%d", &start);
            dijkstra(graph, start, visited);
            printf("\n");
        }
        if(choice==4){
            printf("高速公路路线:\n");
            prim(graph,intree);
        }
    }while(choice!=0);
    return 0;
}

殷墟
袁林
文字博物馆
长春观
羑里城
岳飞庙
红旗渠
太行大峡谷
二帝陵
明福寺
0 1 5
0 2 8
0 3 30
0 4 20
0 6 70
1 2 5
1 4 20
2 4 20
2 8 75
3 4 40
3 5 35
3 6 60
3 7 30
4 5 5
4 8 60
5 8 55
5 9 60
6 7 30
8 9 40
殷墟
殷墟,河南安阳的商朝都城遗址,重要考古发现包括甲骨文,推动了中国信史进展。
袁林
袁林,又称袁坟,是清末民初政治家袁世凯的墓地,位于河南省安阳市。墓地规模宏大,建筑风格独特,是近现代重要史迹及代表性建筑。
文字博物馆
中国文字博物馆是一座位于河南省安阳市的国家级博物馆,以汉字为主题,展示汉字的起源、发展、演变和应用。博物馆旨在收藏、研究、展示和阐释中华优秀语言文化
长春关
河南安阳长春观,道教全真派宫观,历史悠久,明清建筑风格,供奉道教神祇。
羑里城
羑里城,位于河南安阳,是中国最古老的监狱之一,有“司法博物馆”之称。
岳飞庙
纪念南宋抗金名将岳飞,建筑精美,存有岳飞文物,为爱国主义教育场所。
红旗渠
红旗渠,位于河南林州,是新中国成立后人民自力更生、艰苦奋斗的典范,人工修建的大型灌区,被誉为“人工天河”。
太行大峡谷
太行大峡谷,位于河南林州,是太行山内的壮观峡谷,自然景观丰富,有“奇峰万矗”之美誉,是一处著名的自然风光旅游区。
二帝陵
二帝陵,位于河南省安阳市,是相传中华民族的人文始祖炎帝神农氏和黄帝轩辕氏的陵墓,是中华文明的重要遗迹。
明福寺
明福寺,位于中国河南省安阳市,是一座历史悠久的佛教寺庙,始建于唐代,经历代维修和扩建,寺内保存有珍贵的文物和佛教艺术品,是安阳市的重要佛教文化和历史遗迹。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define MaxNum 10
#define INFINITY 9999
#define MaxStringLength 100
 
typedef struct GNode {
    int NumVertex;
    int NumEdge;
    int Vertexs[MaxNum][MaxNum];
    char VertexData[MaxNum][MaxStringLength];
} Graph;
 
typedef struct view{
	char viewname[1000];
	char viewinformation[10000];
}view;
void enter(view v[],char*name,char*information,int i){
		strcpy(v[i].viewname,name);
		strcpy(v[i].viewinformation,information);
}
void print_view(view v[]){
	for(int i=0;i<10;i++){
		printf("景点名称:%s\n",v[i].viewname);
		printf("景点介绍:%s\n",v[i].viewinformation);
		printf("\n");
	}
}

void visit(Graph* graph, int vertex) {
    printf("%s ", graph->VertexData[vertex]);
}
 
Graph* Make_Graph(int NumVertex, int NumEdge) {
    Graph* graph = (Graph*)malloc(sizeof(Graph));
    graph->NumVertex = NumVertex;
    graph->NumEdge = 0;
    for (int i = 0; i < NumVertex; i++) {
        for (int j = 0; j < NumVertex; j++) {
            graph->Vertexs[i][j] = 0;
        }
    }
    return graph;
}
 
void Add_Edge(Graph* graph, int vertex1, int vertex2, int weight) {
    if (graph == NULL || graph->NumVertex == 0) {
        printf("error");
        return;
    }
    graph->Vertexs[vertex1][vertex2] = weight;
    graph->Vertexs[vertex2][vertex1] = weight;
}
 
void Add_Vertex_Data(Graph* graph, int vertex, char* name) {
    if (graph == NULL || vertex > graph->NumVertex - 1 || vertex < 0) {
        printf("error");
        return;
    }
    strcpy(graph->VertexData[vertex], name);
}
 
void DFS(Graph* graph, int vertex, void (*visit)(Graph*, int), bool visited[]) {
    visit(graph, vertex);
    visited[vertex] = true;
    for (int i = 0; i < graph->NumVertex; i++) {
        if (graph->Vertexs[vertex][i] != 0 && !visited[i] && graph->Vertexs[vertex][i] != INFINITY) {
            DFS(graph, i, visit, visited);
        }
    }
}
 
void dijkstra(Graph* graph, int start, bool visited[]) {
    int T[MaxNum][2];
    for (int i = 0; i < graph->NumVertex; i++) {
        T[i][0] = INFINITY;
        T[i][1] = -1;
        visited[i] = false;
    }
    T[start][0] = 0;
    T[start][1] = -1;
    for (int i = 0; i < graph->NumVertex - 1; i++) {
        int mindist = INFINITY;
        int minindex = -1;
        for (int j = 0; j < graph->NumVertex; j++) {
            if (!visited[j] && T[j][0] < mindist) {
                mindist = T[j][0];
                minindex = j;
            }
        }
        visited[minindex] = true;
        for (int k = 0; k < graph->NumVertex; k++) {
            if (!visited[k] && graph->Vertexs[minindex][k] != 0 && T[minindex][0] + graph->Vertexs[minindex][k] < T[k][0]) {
                T[k][0] = T[minindex][0] + graph->Vertexs[minindex][k];
                T[k][1] = minindex;
            }
        }
    }
    int end;
    printf("请输入目的地编号:");
    scanf("%d", &end);
    printf("最短距离为:%dkm\n", T[end][0]);
    printf("最短路线为:%s ", graph->VertexData[end]);
    int temp = T[end][1];
    while (temp != -1) {
        printf("<- %s ", graph->VertexData[temp]);
        temp = T[temp][1];
    }
}
 
int main() { 
	FILE *fp;
	fp=fopen("data.txt","r");
    bool visited[MaxNum];
    for (int i = 0; i < MaxNum; i++) {
        visited[i] = false;
    }
    int NumVertex = 10;
    int NumEdge = 19;
    Graph* graph = Make_Graph(NumVertex, NumEdge);
    for (int i = 0; i < NumVertex; i++) {
        char* name = (char*)malloc(sizeof(char) * 100);
        printf("请输入%d号景点的名称:\n", i);
        fscanf(fp,"%s", name);
        Add_Vertex_Data(graph, i, name);
    }
    for (int i = 0; i < NumEdge; i++) {
        int v1, v2, weight;
        printf("请输入两个景点的编号和距离:\n");
        fscanf(fp,"%d %d %d", &v1, &v2, &weight);
        printf("从%d号景点到%d号景点的距离%d:\n", v1, v2, weight);
        Add_Edge(graph, v1, v2, weight);
        printf("\n\n");
    };
    view v[10];
    for(int i=0;i<10;i++){
    	char*name=(char*)malloc(sizeof(char)*100);
    	char*information=(char*)malloc(sizeof(char)*1000);
    	printf("请输入景点名称:"); 
    	fscanf(fp,"%s",name);
    	printf("请输入景点信息:");
    	fscanf(fp,"%s",information);
		enter(v,name,information,i); 
	}
    printf("\n\n");
    int choice;
	int start;
	system("cls");
    do{
    	
        printf("                                                                               \n");
        printf("                                                                               \n");                                 
        printf("                  |-------------0殷墟------1袁林-------2中国文字博物馆         \n");
        printf("                  |              |                  |             |            \n");
        printf("6红旗渠------------              |                  |             |            \n");
        printf("    |             |              |---------------4羑里城-----------            \n");
        printf("    |             |              |                  |             |            \n");
        printf("    |             |              |                  |             |            \n");
        printf("7太行大峡谷-------|-------------3长春观----------5岳飞庙-------   |            \n");
        printf("                                                    |         |   |            \n");
        printf("                                                    |          8二帝陵         \n");
        printf("                                                    |             |            \n");
        printf("                                                    |             |            \n");
        printf("                                                    |----------9明福寺         \n");
        printf("                                                                               \n");
        printf("                                                                               \n");
        printf("*******************************河南安阳旅游地图********************************\n");
        printf("                                                                               \n");
    	printf(" 【1】景点名称及相关信息\n");
    	printf(" 【2】深度遍历景点\n");
		printf(" 【3】获取最短路径\n");
		printf(" 【0】退出程序\n"); 
		printf("  请输入你的选项:");
		scanf("%d",&choice);
		printf("\n\n\n");
		if(choice==1){
			print_view(v);
			printf("\n");
		}else if(choice==2){
			int num;
			printf("请输入作为遍历起点的景点编号:");
			scanf("%d",&num);
			DFS(graph, num, visit, visited);
		}else if(choice==3){
			printf("请输入出发地地点编号:");
            scanf("%d", &start);
            dijkstra(graph, start, visited);
            printf("\n");
		}else if(choice==0){
			printf("谢谢使用!\n");
			break;
		}else{
			printf("无效选择,请再次选择\n");
		}
	}while(choice!=0);
	fclose(fp);
    return 0;
}

  • 16
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
安阳工学院的数据结构课程设计是该学院计算机科学与信息工程学院开设的课程之一。数据结构课程设计旨在培养学生对数据结构的理解和应用能力,通过实践项目来加深对数据结构的掌握。 具体的课程设计内容可能因学年和教师而有所不同,以下是一个可能的数据结构课程设计的例子: 设计题目:实现一个简单的学生信息管理系统 设计要求: 1. 使用合适的数据结构存储学生的基本信息,包括学号、姓名、性别、年龄等。 2. 实现基本的增删改查功能,包括添加学生信息、删除学生信息、修改学生信息和查询学生信息。 3. 使用合适的算法对学生信息进行排序,例如按学号或姓名进行排序。 4. 提供用户友好的界面,可以通过命令行或图形界面进行操作。 设计步骤: 1. 定义学生信息的数据结构,可以使用数组、链表、树等数据结构来存储学生信息。 2. 实现添加学生信息的功能,可以通过用户输入来添加学生信息,并将其存储到合适的数据结构中。 3. 实现删除学生信息的功能,可以通过学号或姓名来删除指定的学生信息。 4. 实现修改学生信息的功能,可以通过学号或姓名来修改指定的学生信息。 5. 实现查询学生信息的功能,可以通过学号或姓名来查询指定的学生信息。 6. 实现排序功能,可以根据学号或姓名对学生信息进行排序。 7. 设计用户界面,可以使用命令行或图形界面来展示学生信息和进行操作。 通过完成这个课程设计,学生可以加深对数据结构的理解和应用能力,同时也提高了编程和问题解决的能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值