功能:创建图,邻接矩阵的建立,图的深度优先搜索和广度优先搜素,克鲁斯卡尔算法和普里姆算法生成最小生成树等
#include<stdio.h> #include<stdlib.h> #include <string.h> #define INF 65535 #define MAXSIZE 100 int index=1; int k = 1; typedef struct Graph { char node[MAXSIZE]; //顶点集合 int nodeSize; //顶点数 int edgSize; //边数 int disMatrix[MAXSIZE][MAXSIZE]; //距离矩 }graph; //edge typedef struct Edge { char start; //边的起点 char end; //边的终点 int weight; //边的权重 }edge; // * 创建图(用已提供的矩阵) void create_example_graph(graph* pG){ char node[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'}; int disMatrix[][7] = { /*A*//*B*//*C*//*D*//*E*//*F*//*G*/ /*A*/ { 0, 12, INF, INF, INF, 16, 14}, /*B*/ { 12, 0, 10, INF, INF, 7, INF}, /*C*/ { INF, 10, 0, 3, 5, 6, INF}, /*D*/ { INF, INF, 3, 0, 4, INF, INF}, /*E*/ { INF, INF, 5, 4, 0, 2, 8}, /*F*/ { 16, 7, 6, INF, 2, 0, 9}, /*G*/ { 14, INF, INF, INF, 8, 9, 0}}; int vlen = 7; int i, j; // 输入"顶点数"和"边数" // 初始化"顶点数" pG->nodeSize = vlen; // 初始化"顶点" for (i = 0; i < pG->nodeSize; i++) pG->node[i] = node[i]; // 初始化"权重" for (i = 0; i < pG->nodeSize; i++) for (j = 0; j < pG->nodeSize; j++) pG->disMatrix[i][j] = disMatrix[i][j]; // 统计边的数目 pG->edgSize = 0; for (i = 0; i < pG->nodeSize; i++) for (j = 0; j < pG->nodeSize; j++) if (i!=j && pG->disMatrix[i][j]!=INF) pG->edgSize++; pG->edgSize /= 2; } //寻找temp节点的第一个邻节点,失败就返回-1 int first_node(graph * G, int temp){ int i; if(temp <= 0 || temp > G->nodeSize-1){ return -1; } for(i = 0;i<G->nodeSize; i++ ){ if(G->disMatrix[temp][i] != INF && G->disMatrix[temp][i] != 0){ return i; } } return -1; } //寻找temp节点相对与w邻接节点的第一个邻节点,失败就返回-1 int next_node(graph * G, int temp, int w){ int i; if(temp < 0 || temp > G->nodeSize-1 || w < 0 || w > G->nodeSize-1){ return -1; } for(i = w+1;i<G->nodeSize; i++ ){ if(G->disMatrix[temp][