zoukankan      html  css  js  c++  java
  • 邻接矩阵(无向网图)- C语言

    方式一【大话数据结构】:

    #include "stdio.h"    
    #include "stdlib.h"   
    #include "io.h"  
    #include "math.h"  
    #include "time.h"
    
    #define OK 1
    #define ERROR 0
    #define TRUE 1
    #define FALSE 0
    #define MAXVEX 100 /* 最大顶点数,应由用户定义 */
    #define INFINITY 65535
    
    typedef int Status;	/* Status是函数的类型,其值是函数结果状态代码,如OK等 */
    typedef char VertexType; /* 顶点类型应由用户定义  */
    typedef int EdgeType; /* 边上的权值类型应由用户定义 */
    typedef struct
    {
    	VertexType vexs[MAXVEX]; /* 顶点表 */
    	EdgeType arc[MAXVEX][MAXVEX];/* 邻接矩阵,可看作边表 */
    	int numNodes, numEdges; /* 图中当前的顶点数和边数  */
    }MGraph;
    
    /* 建立无向网图的邻接矩阵表示 */
    void CreateMGraph(MGraph* G)
    {
    	int i, j, k, w;
    	printf("输入顶点数和边数:
    ");
    	scanf_s("%d,%d", &G->numNodes, &G->numEdges); /* 输入顶点数和边数 */
    	for (i = 0; i < G->numNodes; i++) /* 读入顶点信息,建立顶点表 */
    		scanf_s(&G->vexs[i]);
    	for (i = 0; i < G->numNodes; i++)
    		for (j = 0; j < G->numNodes; j++)
    			G->arc[i][j] = INFINITY;	/* 邻接矩阵初始化 */
    	for (k = 0; k < G->numEdges; k++) /* 读入numEdges条边,建立邻接矩阵 */
    	{
    		printf("输入边(vi,vj)上的下标i,下标j和权w:
    ");
    		scanf_s("%d,%d,%d", &i, &j, &w); /* 输入边(vi,vj)上的权w */
    		G->arc[i][j] = w;
    		G->arc[j][i] = G->arc[i][j]; /* 因为是无向图,矩阵对称 */
    	}
    }
    
    void TraverseGraph(MGraph* G)
    {
    	for (int i = 0; i < G->numNodes; i++)
    	{
    		printf("[");
    		for (int j = 0; j < G->numNodes; j++)
    		{
    			printf(" %d ", G->arc[i][j]);
    		}
    		printf("]
    ");
    	}
    }
    
    //	输入顶点数和边数:
    //	4, 5
    //	输入边(vi, vj)上的下标i,下标j和权w :
    //	0, 1, 1
    //	输入边(vi, vj)上的下标i,下标j和权w :
    //	0, 2, 1
    //	输入边(vi, vj)上的下标i,下标j和权w :
    //	0, 3, 1
    //	输入边(vi, vj)上的下标i,下标j和权w :
    //	1, 2, 1
    //	输入边(vi, vj)上的下标i,下标j和权w :
    //	2, 3, 1
    //	[65535		1		1		1		]
    //	[1			65535	1		65535	]
    //	[1			1		65535	1		]
    //	[1			65535	1		65535	]
    int main(void)
    {
    	MGraph G;
    	CreateMGraph(&G);
    	TraverseGraph(&G);
    	return 0;
    }
    
    
    

    方式二:

    // 邻接矩阵
    #include "stdio.h"
    #include "stdlib.h"
    #include "math.h"
    
    #define MaxVertexNum 100   // 最大顶点数设为100
    #define INFINITY     65535 // ∞设为双字节无符号整数的最大值
    
    typedef int  Vertex;       // 顶点下标(用顶点下标表示顶点)
    typedef int  WeightType;   // 边的权值设为整型
    typedef char DataType;     // 顶点存储的数据类型设为整型
    
    typedef struct GNode* PtrToGNode; // 图结点
    struct GNode {
    	int Nv; // 顶点数
    	int Ne; // 边数
    	WeightType G[MaxVertexNum][MaxVertexNum];	// 邻接矩阵
    	DataType Data[MaxVertexNum];				// 顶点数据,如果顶点无数据,则可以不必定义此变量
    };
    typedef PtrToGNode MGraph; // 以邻接矩阵存储的图类型
    
    typedef struct ENode* PtrToENode;	// 边指针的定义
    struct ENode {						// 边的结构的定义
    	Vertex V1, V2;					// 有向边<V1, V2>
    	WeightType Weight;				// 权重
    };
    typedef PtrToENode Edge;			// 边的定义(边的指针的别名)
    
    MGraph CreateGraph(int VertexNum)
    {
    	// 初始化一个有VertexNum个顶点,但没有边的图
    	Vertex V, W; // 表示顶点下标的临时变量
    	MGraph Graph;
    
    	Graph = (MGraph)malloc(sizeof(struct GNode)); // 创建图
    	Graph->Nv = VertexNum;
    	Graph->Ne = 0;
    
    	// 使用INFINITY初始化图的邻接矩阵的每个坐标点
    	// 邻接矩阵坐标编号:0 --- (Graph->Nv - 1)
    	for (V = 0; V < Graph->Nv; V++)
    	{
    		for (W = 0; W < Graph->Nv; W++)
    		{
    			Graph->G[V][W] = INFINITY;
    		}
    	}
    	return Graph;
    }
    
    // 插入边 - 本质上是针对邻接矩阵表示的边赋权
    void InsertEdge(MGraph Graph, Edge E)
    {
    	// 邻接矩阵为对称矩阵
    	Graph->G[E->V1][E->V2] = E->Weight;
    	// 如果是无向网图,邻接矩阵为对称矩阵
    	Graph->G[E->V2][E->V1] = E->Weight;
    }
    
    MGraph BuildGraph()
    {
    	MGraph Graph;
    	Edge E;
    	Vertex V;
    	int Nv, i;
    
    	printf("输入顶点个数
    ");
    	scanf_s("%d", &Nv); // 读入顶点个数
    	Graph = CreateGraph(Nv); // 初始化有Nv个顶点但没有边的图
    
    	printf("输入边数
    ");
    	scanf_s("%d", &(Graph->Ne)); // 读入边数
    	if (Graph->Ne != 0) {
    		E = (Edge)malloc(sizeof(struct ENode));
    		for (i = 0; i < Graph->Ne; i++) 
    		{
    			printf("输入边(V1, V2, Weight):
    ");
    			scanf_s("%d,%d,%d", &E->V1, &E->V2, &E->Weight); // 通过输入创建一条边
    			InsertEdge(Graph, E); // 将边插入图中
    		}
    	}
    	for (V = 0; V < Graph->Nv; V++) 
    	{
    		printf("输入顶点:
    ");
    		scanf_s(" %c", &(Graph->Data[V])); // 输入各顶点的数据
    		printf("输入顶点值:%d
    ", Graph->Data[V]);
    	}
    	return Graph;
    }
    
    void TraverseGraph(MGraph G)
    {
    	printf("顶点数:
    ", G->Nv);
    	for (int i = 0; i < G->Nv; i++)
    	{
    		printf("[");
    		for (int j = 0; j < G->Nv; j++)
    		{
    			printf(" %d(%c, %c) ", G->G[i][j], G->Data[i], G->Data[j]);
    		}
    		printf("]
    ");
    	}
    }
    //	输入顶点个数
    //	4
    //	输入边数
    //	5
    //	输入边(V1, V2, Weight) :
    //	0, 1, 12
    //	输入边(V1, V2, Weight) :
    //	0, 2, 23
    //	输入边(V1, V2, Weight) :
    //	0, 3, 12
    //	输入边(V1, V2, Weight) :
    //	1, 2, 53
    //	输入边(V1, V2, Weight) :
    //	2, 3, 98
    //	输入顶点 :
    //	a
    //	输入顶点值 : 97
    //	输入顶点 :
    //	b
    //	输入顶点值 : 98
    //	输入顶点 :
    //	c
    //	输入顶点值 : 99
    //	输入顶点 :
    //	d
    //	输入顶点值 : 100
    //	顶点数 :
    //	[65535(a, a)  12(a, b)  23(a, c)  12(a, d)]
    //	[12(b, a)  65535(b, b)  53(b, c)  65535(b, d)]
    //	[23(c, a)  53(c, b)  65535(c, c)  98(c, d)]
    //	[12(d, a)  65535(d, b)  98(d, c)  65535(d, d)]
    int main()
    {
    	MGraph Graph = BuildGraph();
    	TraverseGraph(Graph);
    	return 0;
    }
    
  • 相关阅读:
    gradle3.0新命令
    Android Studio项目生成Jar包
    《图解HTTP》读书笔记
    Java实现多继承
    Unity3d和Android之间互相调用
    《Gradle权威指南》--Android Gradle NDK支持
    《Gradle权威指南》--Android Gradle测试
    《Gradle权威指南》--Android Gradle多渠道构建
    adb命令大全
    SparseArray源码解析
  • 原文地址:https://www.cnblogs.com/neen/p/13745903.html
Copyright © 2011-2022 走看看