zoukankan      html  css  js  c++  java
  • 图的邻接表表示

      要完整地表示一个图,就需要明确图中有什么,很简单,节点和边。

      所以,在用邻接表表示一个图的时候,我们需要分别表示其节点和边,然后用边将节点连接起来即可。

      使用邻接表,文字上的描述就是,将所有节点放入一张邻接表中,对于每个节点的邻接节点,用一个链表将其连接起来。

    1 邻接表中边、节点、图定义

     1 typedef struct Edge
     2 {
     3     int adjvex;
     4     struct Edge *nextEdge;
     5 }Edge;
     6 //顶点表
     7 typedef struct VNode
     8 {
     9     int data;
    10     Edge *firstEdge;
    11 }VNode;
    12 //邻接表
    13 typedef struct AGraph
    14 {
    15     VNode adjlist[MAXSIZE];
    16     int n,e;
    17 }AGraph;

      定义是按照从上往下写的,但是思考的时候,应该从下往上思考。

      我们现在需要一个图,图中是若干节点,有e条边。

      图中的这n和节点,我们需要知道哪些边是和它相接的,所以,对应每个节点(VNode),我们需要一个头指针(firstEdge),指向其第一条边,通过这个指针,邻接表中每个节点就具有了向外延伸的能力。延伸的过程就是建立单向链表。类似于“头插法”。

      邻接表表示,最直观的就是表示了图中的n个节点,以及和每个节点相邻的边,节点存储在顺序表中,边存储在单向链表中。

    2 创建

     1 void creategra(AGraph *g,int n,int e)
     2 {
     3     Edge *s;
     4     g->n = n;
     5     g->e = e;
     6     for(int i=0;i<n;i++)
     7     {
     8         g->adjlist[i].data=i;
     9         g->adjlist[i].firstEdge=NULL;
    10     }
    11     printf("input the edge
    ");
    12     int a,b;
    13     for(int i=0;i<e;i++)
    14     {
    15         scanf("%d%d",&a,&b);  //a到b有路径
    16         s = (Edge *)malloc(sizeof(Edge));
    17         s->adjvex=b;
    18         s->nextEdge=g->adjlist[a].firstEdge;
    19         g->adjlist[a].firstEdge=s;
    20     }
    21 }

      对于一个图,有n个节点,我们假设节点是从0到n-1。将这n个节点放到邻接表中(8行),开始时没有任何边和他们链接(9行)。

      我们有了节点之后,就需要用边将他们连接起来,例如,a到b有路径,我们就申请一块空间存储a->b这条边的信息(16行)。这条边邻接节点是b。将这条边插入到邻接表中(18、19行)。那么,a这个节点的第一条边就是a->b。当我们再连接a和c时,a这个节点的第一条边就是a->c,他的下一条边就是a->b。

  • 相关阅读:
    -Prefix.pch has been modified 的错误修复
    Xcode插件,模板安装
    php 内置函数JSON处理
    OC 创建单例
    UITabBarController 的配置
    execute、executeQuery和executeUpdate之间的区别
    iOS类方法实例方法 与 self
    iOS U7ea2 乱码 转换
    PHP 页面跳转的三种方式
    C#数组 动态添加元素
  • 原文地址:https://www.cnblogs.com/wktwj/p/4892089.html
Copyright © 2011-2022 走看看