【大话数据结构C语言】39 图的存储结构(邻接表)

举报
CodeAllen 发表于 2021/10/29 23:46:25 2021/10/29
【摘要】 我的公众号是【CodeAllen】,程序员技术交流①群:736386324,转载请注明出处 上一篇说的临接矩阵是不错的图存储结构,但是对于边数相对顶点较少的图,这种结构是存在对存储空间极大浪费的 因此可以考虑另外一种存储结构:比如把数组和链表结合一起来存储   临接表无向图的处理方法: 1.图中顶点用一...

我的公众号是【CodeAllen】,程序员技术交流①群:736386324,转载请注明出处

上一篇说的临接矩阵是不错的图存储结构,但是对于边数相对顶点较少的图,这种结构是存在对存储空间极大浪费的

因此可以考虑另外一种存储结构:比如把数组和链表结合一起来存储

 

临接表无向图的处理方法:

1.图中顶点用一个一维数组存储,当然,顶点也可以用单链表来存储,不过数组可以较容易地读取顶点信息,更加方便

2.图中每个顶点Vi的所有邻接点构成一个线性表,由于邻接点的个数不确定,所以我们选择用单链表来存储

 

临接表有向图的处理方法:

以把顶点当弧尾建立的临接表,这样很容易可以得到每个顶点的出度

 

临接表网的处理方法:

对于带权值的网图,可以在边表结点定义中在增加一个数据域来存储权值即可

 

代码实现:


  
  1. #define MAXVEX 100
  2. typedef struct EdgeNode         // 边表结点
  3. {
  4.     int adjvex;                 // 邻接点域,存储该顶点对应的下标
  5.     int weight;                 // 用于存储权值,对于非网图可以不需要
  6.     struct EdgeNode *next;      // 链域,指向下一个邻接点
  7. } EdgeNode;
  8. typedef struct VertexNode       // 顶点表结点
  9. {
  10.     char data;                  // 顶点域,存储顶点信息
  11.     EdgeNode *firstEdge;        // 边表头指针
  12. } VertexNode, AdjList[MAXVEX];
  13. typedef struct
  14. {
  15.     AdjList adjList;
  16.     int numVertexes, numEdges;  // 图中当前顶点数和边数
  17. } GraphAdjList;
  18. // 建立图的邻接表结构
  19. void CreateALGraph(GraphAdjList *G)
  20. {
  21.     int i, j, k;
  22.     EdgeNode *e;
  23.     printf("请输入顶点数和边数:\n");
  24.     scanf("%d %d", &G->numVertexes, &G->numEdges);
  25.     // 读取顶点信息,建立顶点表
  26.     for( i=0; i < G->numVertexes; i++ )
  27.     {
  28.         scanf("%c", &G->adjList[i].data);
  29.         G->adjList[i].firstEdge = NULL;     // 初始化置为空表
  30.     }
  31.     for( k=0; k < G->numEdges; k++ )
  32.     {
  33.         printf("请输入边(Vi,Vj)上的顶点序号:\n");
  34.         scanf("%d %d", &i, &j);
  35.         e = (EdgeNode *)malloc(sizeof(EdgeNode));
  36.         e->adjvex = j;                      // 邻接序号为j
  37.         e->next = G->adjList[i].firstEdge;
  38.         G->adjList[i].firstEdge = e;
  39.         e = (EdgeNode *)malloc(sizeof(EdgeNode));
  40.         e->adjvex = i;                      // 邻接序号为i
  41.         e->next = G->adjList[j].firstEdge;
  42.         G->adjList[j].firstEdge = e;
  43.     }
  44. }

 

 

 

 

 

 

 

 

 

 

 

文章来源: allen5g.blog.csdn.net,作者:CodeAllen的博客,版权归原作者所有,如需转载,请联系作者。

原文链接:allen5g.blog.csdn.net/article/details/116310626

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。