邻接表(转)

转载 2012年03月27日 23:33:53

原文:http://jpkc.xihangzh.com/sjjg/datastru/zxxx/six%20lesson/622.html

邻接表

    邻接矩阵用二维数组即可存取,比较简单,但除完全图外,一般的图不是任意两个顶点都相邻接,因此邻接矩阵也有很多零元素,特别是当n 较大而边数相对完全图的边(n-1)又少得多时,邻接矩阵仍是很稀疏,这样浪费存储空间。

    邻接表(Adjacency List)是图的一种顺序存储与链式存储结合的存储方法,类似于树的孩子链表表示法。由于它只考虑非零元素,因而节省了零元素所占的存储空间。它对于无向图和有向图都适用。

    邻接表示法就是对于图G中的每个顶点放到一个数组中,数组的每个元素存放一个结点并指向一个单链表的指针。链表中存储着与该顶点相邻接的顶点所在的数组元素的下标。在邻接表表示中有两种结点结构,如图6-9所示。

1

(a) 表头结点             (b) 边表结点

图6-9  邻接矩阵表示的结点结构

    在邻接表中,对图中每个顶点建立一个单链表。单链表有一个表头结点,表头结点的结构为图6-9(a)所示。其中,vertex域存放图中某个顶点vi 的信息,link为指针,指向对应单链表中的结点。

    单链表中的结点称为边表结点,边表结点结构如图6-9(b)所示。其中,adjvex域存放与顶点vi相邻接的顶点在二维数组中的序号,next域为指针,指向与顶点vi相邻接的下一个顶点的边表结点。

下图6-10给出无向图6-7对应的邻接表表示。

2

图6-10  图的邻接表表示

邻接表表示的形式描述如下:

结构6-2 邻接表的结构

#define maxvernum 100          //最大顶点数为100

typedef struct node             //边表结点

{ int adjvex;                   //邻接点域

      struct node  * next;          //指向下一个邻接点的指针域

     }Edgenode;                     

typedef struct vnode            //表头结点

{ Vertextype vertex;            //顶点域

      Edgenode  *link;        //边表头指针

     } Vexnode;       

typedef Vexnode adjlist[maxvernum];  //adjlist是邻接表类型

 typedef struct

{  adjlist adjlist;                     //邻接表

        int n,e;                             //顶点数和边数

      } Adjgraph;                 // Adjgraph是以邻接表方式存储的图类型

     建立一个有向图的邻接表存储的算法如下:

     算法6-2 建立邻接表的算法

      void greatealgraph(Adjgraph *g)        //建立有向图的邻接表存储  

      { int i,j,k;

        Edgenode * s;

        printf("请输入顶点数和边数(输入格式为:顶点数,边数):\n");

        scanf("%d,%d",&(g->n),&(g->e));     //读入顶点数和边数

        printf("请输入顶点信息(输入格式为:顶点号<CR>):\n");

        for (i=0;i<g->n;i++)                //建立有n个顶点的顶点表

{ scanf("\n%c",&(g->adjlist[i].vertex));  //读入顶点信息   g->adjlist[i].link=NULL;     //顶点的边表头指针设为空

         }

        printf("请输入边的信息(输入格式为:i,j):\n");

        for (k=0;k<g->e;k++)                //建立边表

    { scanf("\n%d,%d",&i,&j);         //读入边<vi,vj>的顶点对应序号

      s=(Edgenode*)malloc(sizeof(Edgenode));  //生成新边表结点s

      s->adjvex=j;                      //邻接点序号为j

//将新边表结点s插入到顶点vi的边表头部

    s->next=g->adjlist[i].link;      

 g->adjlist[i].link=s;

     }

邻接矩阵转邻接表

邻接矩阵转邻接表 描述 测试说明与提交 提交状态 题目设置 Description 给一个带权有向图的邻接矩阵表示,将之转换为邻接表的表示,并输出对应的邻接表 Input 第一行:两个整数m...
  • qwm8777411
  • qwm8777411
  • 2013年05月29日 18:50
  • 3847

C++_将图二维矩阵形式转为邻接表结构

用二维矩阵表示图的结构我们用c++中的vector容器来表示二维矩阵, #include using std::vector vector Array; 关于vector的基本操作可以参考这...
  • pengjian444
  • pengjian444
  • 2016年03月01日 22:55
  • 702

邻接表转换为邻接矩阵

代码如下,分析详见注释 : #include #include #include #include using namespace std; //------------邻接矩阵----------...
  • Singular__point
  • Singular__point
  • 2016年11月02日 22:43
  • 2295

邻接表转邻接矩阵

假设无向图G采用邻接矩阵存储,编写一个算法输出邻接表。 Description 第一行为一个整数n,表示顶点的个数(顶点编号为0到n-1),接下来是为一个n*n大小...
  • believe__dream
  • believe__dream
  • 2015年05月20日 19:13
  • 986

树转二叉树(邻接矩阵,邻接表)

邻接矩阵: void build(int s) { visit[s]=1;//该点是否访问过 for(int i=1;i
  • y91041
  • y91041
  • 2013年11月05日 17:15
  • 716

邻接表的逆邻接表

/*已知有向图采用邻接表存储,设计算法,求其逆邻接表。*/ #include #include #define max 20 typedef struct ArcNode{ int adjvex; ...
  • CSDN_buyi
  • CSDN_buyi
  • 2017年11月13日 21:30
  • 536

邻接表与逆邻接表(数组实现)

引用头文件:string.h 使用宏定义:#define CLR(arr,val) memset(arr,val,sizeof(arr)) 使用说明:每次使用前必须要先调用Init()函数,AddEd...
  • ygqwan
  • ygqwan
  • 2013年05月10日 09:41
  • 3572

多重邻接表

好好看一遍,数据结构这本书老师很多东西都没有讲,不怪老师,因为下面没人听。所以自己看看,写一下: 给你一幅图你能够画出多重邻接表的结构图你就明白了。 所以给出如下一幅图: 结构图如下: 代...
  • WR_technology
  • WR_technology
  • 2016年07月15日 17:15
  • 1436

数据结构 图的邻接表表示转换成邻接矩阵表示的算法

图的邻接表表示转换成邻接矩阵表示的算法。 下面这个是有向图邻接表表示转换成邻接矩阵 #include #include #include int a[100][100];//邻接矩阵的载体...
  • LZK1997
  • LZK1997
  • 2016年11月04日 20:58
  • 4163

java中使用邻接表返回json树(tree)

我们常常需要将数据库的邻接表转化为树型的json,但一直没有较好的现成可以使用的语句,博主几经思考,决定自己写一个可以将邻接表中的数据数据直接转换成前台可以使用的json的树形语句,请大家参考,语句经...
  • yifanlxj
  • yifanlxj
  • 2017年03月27日 16:13
  • 364
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:邻接表(转)
举报原因:
原因补充:

(最多只允许输入30个字)