欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

邻接矩阵 建图

程序员文章站 2023-12-23 19:51:45
...
#include<stdio.h>
#include<stdlib.h>
#define MAXVEX 100
#define INFINITY 65535

// 邻接矩阵 建图 
// 一个一维数组 存储顶点信息 
// 一个二维数组 存储边及其权重信息
// 带权重的 数组 自身到自身不存在设置为 0  
// 其它有边存在设置为 相应权重 
// 剩下 无边的 设置为 无穷大 (INFINITY)  
//此处为建立无向图
typedef int EdgeType; //权重 类型 
typedef char VertexType;// 顶点类型 
typedef struct GNode* MGraph;
struct GNode{
	VertexType Vex[MAXVEX]; // 节点 
	EdgeType Edge[MAXVEX][MAXVEX];
};

MGraph Initialize(MGraph G, int v) //  图初始化 
	{
		int i, j;
		for(i = 0; i < v; i++ ){
			for(j = 0; j < v; j++ ){
				if(i == j){
					G->Edge[i][j] = 0;// 不存在自己到自己的边  
				}
				else{
					G->Edge[i][j] = INFINITY;
				}
			}
		}
	}
MGraph CreateGraph(int Vnum)
	{
		MGraph G = (MGraph)malloc(sizeof(struct GNode));
		if(G == NULL){
			printf("Error");
			return NULL;
		}
		int Enum, v, e;
		Initialize(G, Vnum); 
		printf("请输入顶点信息 : \n");
		for(v = 0; v < Vnum; v++ ){
			scanf("%c",&G->Vex[v]); // 字符间不要有空格 
		}
		int k;
		printf("请输入边数:\n");
		fflush(stdin); //防止 上面读取信息 错误 
		scanf("%d",&Enum);
		printf("请输入各边及其权值 :\n");
		int i, j, w; //(i, j)代表边  w代表权重 
		for(e = 0; e < Enum; e++ ){
			scanf("%d %d %d",&i, &j, &w);//中间 空格 
			G->Edge[i][j] = w;
			G->Edge[j][i] = G->Edge[i][j]; //无向图 对称性 
		}
		
		return G;	
	}	
void Print(MGraph G, int Vnum)//打印邻接矩阵
	{
		int i, j;
		for(i = 0; i < Vnum; i++ ){
			for(j = 0; j < Vnum; j++ ){
				if(i == j)
					printf(" 0");
				else if(G->Edge[i][j] == INFINITY){
					printf(" #"); 
				}
				else{
					printf("%2d",G->Edge[i][j]);
				}		
			}
			printf("\n");
		}
			
	}	
int main()
	{
		MGraph G;
		int Vnum;
		printf("请输入顶点个数: \n");
		scanf("%d",&Vnum);
		G = CreateGraph(Vnum);
		printf("建图结果:\n");
		Print(G, Vnum);
		return 0;	
	}	
邻接矩阵 建图

上一篇:

下一篇: