• 图的邻接矩阵实现(c)


    参考:算法:c语言实现 一书

    图的邻接矩阵实现

    #ifndef GRAPH
    #define GRAPH
    
    /*
    	图的邻接矩阵实现
    */
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    
    struct edge{
    	int v;
    	int w;
    };
    
    struct graph{
    	int v;
    	int e;
    	int **adj;
    };
    
    edge EDGE(int v, int w)
    {
    	edge e;
    	e.v = v; e.w = w;
    	return e;
    }
    
    int** matrixInit(int r, int c, int val)
    {
    	int **t = (int**)malloc(r*sizeof(int*));
    	for (int i = 0; i < r; ++i)
    		t[i] = (int*)malloc(c*sizeof(int));
    	for (int i = 0; i < r; ++i)
    		for (int j = 0; j < c; ++j)
    			t[i][j] = val;
    	return t;
    }
    
    graph* graphInit(int v)
    {
    	graph* g = (graph*)malloc(sizeof(graph));
    	g->v = v;
    	g->e = 0;
    	g->adj = matrixInit(v, v, 0);
    	return g;
    }
    
    void graphInsert(graph* g, edge e)
    {
    	int v = e.v, w = e.w;
    	if (g->adj[v][w] == 0) ++g->e;
    	g->adj[v][w] = 1;
    	g->adj[w][v] = 1;
    }
    
    void graphRemove(graph* g, edge e)
    {
    	int v = e.v, w = e.w;
    	if (g->adj[v][w] == 1) --g->e;
    	g->adj[v][w] = 0;
    	g->adj[w][v] = 0;
    }
    
    int graphEdge(graph* g, edge a[])
    {
    	int e = 0;
    	for (int v = 0; v < g->v; ++v)
    		for (int w = 0; w < g->v; ++w)
    			if (g->adj[v][w] == 1)
    				a[e++] = EDGE(v, w);
    	return e;
    }
    
    graph* graphCopy(graph* g)
    {
    	graph *cg = graphInit(g->v);
    	cg->v = g->v;
    	cg->e = g->e;
    	for (int i = 0; i < g->v; ++i)
    		for (int j = 0; j < g->v; ++j)
    			(cg->adj)[i][j] = (g->adj)[i][j];
    	return cg;
    }
    
    void graphDestroy(graph* &g)
    {
    	for (int i = 0; i < g->v; ++i)
    		free((g->adj)[i]);
    	free(g->adj);
    	free(g); 
    }
    
    void graphShow(graph* g)
    {
    	printf("%d vertices, %d edges
    ", g->v, g->e);
    	for (int i = 0; i < g->v; ++i){
    		printf("%2d:", i);
    		for (int j = 0; j < g->v; ++j)
    			if ((g->adj)[i][j] == 1) printf("%2d", j);
    		printf("
    ");
    	}
    }
    
    
    #endif
    

      对各个函数的简单测试:

    #include"graph.h"
    
    int main()
    {
    	printf("	graph of matrix test:
    ");
    	srand(time(NULL));
    	graph* g = graphInit(10);
    	edge e[5];
    	for (int i = 0; i < 5; ++i){
    		e[i].v = rand() % 10;
    		e[i].w = rand() % 10;
    		graphInsert(g, e[i]);
    	}
    	graphShow(g);
    	printf("
    ");
    
    	graph* cg = graphCopy(g);
    	graphDestroy(g);
    	graphRemove(cg, e[1]);
    	graphShow(cg);
    	printf("
    ");
    
    	for (int i = 0; i < 5; ++i)
    		printf("%d: %d
    ", e[i].v, e[i].w);
    	printf("
    ");
    
    	edge ee[10];
    	int cnt=graphEdge(cg, ee);
    	for (int i = 0; i < cnt; ++i)
    		printf("%d,%d
    ", ee[i].v, ee[i].w);
    	printf("
    ");
    
    
    }
    

      

  • 相关阅读:
    A1066 Root of AVL Tree (25 分)
    A1099 Build A Binary Search Tree (30 分)
    A1043 Is It a Binary Search Tree (25 分) ——PA, 24/25, 先记录思路
    A1079; A1090; A1004:一般树遍历
    A1053 Path of Equal Weight (30 分)
    A1086 Tree Traversals Again (25 分)
    A1020 Tree Traversals (25 分)
    A1091 Acute Stroke (30 分)
    A1103 Integer Factorization (30 分)
    A1032 Sharing (25 分)
  • 原文地址:https://www.cnblogs.com/jokoz/p/4755776.html
Copyright © 2020-2023  润新知