参考:算法: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\n", 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("\n");
}
} #endif

  对各个函数的简单测试:

#include"graph.h"

int main()
{
printf("\tgraph of matrix test:\n");
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("\n"); graph* cg = graphCopy(g);
graphDestroy(g);
graphRemove(cg, e[1]);
graphShow(cg);
printf("\n"); for (int i = 0; i < 5; ++i)
printf("%d: %d\n", e[i].v, e[i].w);
printf("\n"); edge ee[10];
int cnt=graphEdge(cg, ee);
for (int i = 0; i < cnt; ++i)
printf("%d,%d\n", ee[i].v, ee[i].w);
printf("\n"); }

  

图的邻接矩阵实现(c)的更多相关文章

  1. 数据结构(12) -- 图的邻接矩阵的DFS和BFS

    //////////////////////////////////////////////////////// //图的邻接矩阵的DFS和BFS ////////////////////////// ...

  2. java 图的邻接矩阵

    有向图 在有向图中,结点对<x ,y>是有序的,结点对<x,y>称为从结点x到结点y的一条有向边,因此,<x,y>与<y,x>是两条不同的边.有向图中的 ...

  3. Java图的邻接矩阵实现

    /** * * 图的邻接矩阵实现 * @author John * * @param <T> */ class AMWGraph<T> { private ArrayList& ...

  4. 图的邻接矩阵存储实现,C++描述

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  5. 稠密图(邻接矩阵),并查集,最短路径(Dijkstra,spfa),最小生成树(kruskal,prim)

    全部函数通过杭电 1142,1162,1198,1213等题目测试. #include<iostream> #include<vector> #include<queue ...

  6. _DataStructure_C_Impl:图的邻接矩阵存储

    //_DataStructure_C_Impl:邻接矩阵 #include<stdio.h> #include<stdlib.h> #include<string.h&g ...

  7. c_ 数据结构_图_邻接矩阵

    程序主要实现了图的深度遍历和广度遍历. #include <stdio.h> #include <stdlib.h> #include <string.h> #de ...

  8. 数据结构-图-Java实现:有向图 图存储(邻接矩阵),最小生成树,广度深度遍历,图的连通性,最短路径1

    import java.util.ArrayList; import java.util.List; // 模块E public class AdjMatrixGraph<E> { pro ...

  9. 数据结构学习笔记05图 (邻接矩阵 邻接表-->BFS DFS、最短路径)

    数据结构之图 图(Graph) 包含 一组顶点:通常用V (Vertex) 表示顶点集合 一组边:通常用E (Edge) 表示边的集合 边是顶点对:(v, w) ∈E ,其中v, w ∈ V 有向边& ...

随机推荐

  1. (转)MarginTop 为何影响父元素的 MarginTop

    这个问题困惑了很久,虽然没有大碍早就摸出来怎么搞定它,但始终不明白原因出在哪里,如果只是IE有问题我也不会太在意,可问题是所有上等浏览器都表现如此,这样叫我怎能安心?今天总算下狠心查出来怎么回事,居然 ...

  2. 02js高级Function

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  3. <转>Java的一些历史

      Java是一种固执己见的语言,它具有很好的可读性,初级程序员很容易上手,具有长期稳定性和可支持性.但这些设计决定也付出了一定的代价:冗长的代码,类型系统与其它语言相比显得缺乏弹性. 然而,Java ...

  4. HOOK钩子 - 钩子函数说明

    翻译参考自MaybeHelios的blog: http://blog.csdn.net/maybehelios/ 通过SetWindowsHookEx方法安装钩子,该函数指定处理拦截消息的钩子函数(回 ...

  5. juce 中的WeakReference分析

    juce中的WeakReference设计得比较巧妙,巧妙就是使用delete之后就可以通知道WeakReference,原理其实也很间单,其实就是在对象里添加了一个子对象masterReferenc ...

  6. go learning notes

    1)  cgo $go install test.go # command-line-arguments /usr/bin/ld: unrecognized option '--build-id=no ...

  7. 前端中的SEO

    前端中的SEO: mate.title META标签分两大部分:HTTP标题信息(HTTP-EQUIV)和页面描述信息(NAME). <Meta name="Keywords" ...

  8. list 、set 、map 粗浅性能对比分析

    list .set .map 粗浅性能对比分析   不知道有多少同学和我一样,工作五年了还没有仔细看过list.set的源码,一直停留在老师教导的:"LinkedList插入性能比Array ...

  9. 如何在Root的手机上开启ViewServer,使得HierachyViewer能够连接

    前期准备: 关于什么是Hierarchy Viewer,请查看官方文档:http://developer.android.com/tools/debugging/debugging-ui.html.个 ...

  10. 《C语言深度剖析》学习笔记----C语言中的符号

    本节主要讲C语言中的各种符号,包括注释符.单引号双信号以及逻辑运算符等. 一.注释符 注释符号和注释在程序的预编译期就已经被解决了,在预编译期间,编译器会将注释符号和注释符号之间的部分简单的替换成为空 ...