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

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

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

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

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

 

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

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

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

 

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

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

 

临接表网的处理方法:

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

 

代码实现:


      #define MAXVEX 100
      typedef struct EdgeNode         // 边表结点
      {
          int adjvex;                 // 邻接点域,存储该顶点对应的下标
          int weight;                 // 用于存储权值,对于非网图可以不需要
          struct EdgeNode *next;      // 链域,指向下一个邻接点
      } EdgeNode;
      typedef struct VertexNode       // 顶点表结点
      {
          char data;                  // 顶点域,存储顶点信息
          EdgeNode *firstEdge;        // 边表头指针
      } VertexNode, AdjList[MAXVEX];
      typedef struct
      {
          AdjList adjList;
          int numVertexes, numEdges;  // 图中当前顶点数和边数
      } GraphAdjList;
      // 建立图的邻接表结构
      void CreateALGraph(GraphAdjList *G)
      {
          int i, j, k;
          EdgeNode *e;
          printf("请输入顶点数和边数:\n");
          scanf("%d %d", &G->numVertexes, &G->numEdges);
          // 读取顶点信息,建立顶点表
          for( i=0; i < G->numVertexes; i++ )
          {
              scanf("%c", &G->adjList[i].data);
              G->adjList[i].firstEdge = NULL;     // 初始化置为空表
          }
          for( k=0; k < G->numEdges; k++ )
          {
              printf("请输入边(Vi,Vj)上的顶点序号:\n");
              scanf("%d %d", &i, &j);
              e = (EdgeNode *)malloc(sizeof(EdgeNode));
              e->adjvex = j;                      // 邻接序号为j
              e->next = G->adjList[i].firstEdge;
              G->adjList[i].firstEdge = e;
              e = (EdgeNode *)malloc(sizeof(EdgeNode));
              e->adjvex = i;                      // 邻接序号为i
              e->next = G->adjList[j].firstEdge;
              G->adjList[j].firstEdge = e;
          }
      }
  
 

 

 

 

 

 

 

 

 

 

 

 

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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