首页 > 其他分享 >将邻接矩阵转化为邻接表

将邻接矩阵转化为邻接表

时间:2023-05-20 20:31:56浏览次数:31  
标签:adjList EdgeNode int vertexNum 邻接矩阵 转化 邻接 顶点

解决方法

邻接表是一种图的表示方式,可以通过链表来表示每个顶点的邻接点集合。将邻接矩阵转化为邻接表,可以先创建一个顶点数组,然后对于每个顶点,将其对应的行或列中非零元素的列或行号(表示相邻的其他顶点)存储到该顶点的链表中。

代码实现


#include <stdio.h>
#include <stdlib.h>

#define MAX_VERTEX_NUM 50

// 邻接表中的边结构体
typedef struct EdgeNode {
    int adjvex;  // 邻接顶点的下标
    struct EdgeNode *next;  // 指向下一个邻接点的指针
}EdgeNode;

// 邻接表中的顶点结构体
typedef struct VertexNode {
    int data;  // 顶点的数据
    EdgeNode *firstedge;  // 指向第一个邻接点的指针
}VertexNode, AdjList[MAX_VERTEX_NUM];

// 图结构体
typedef struct {
    AdjList adjList;  // 邻接表
    int vertexNum;  // 顶点数
    int edgeNum;  // 边数
}Graph;

// 将邻接矩阵转化为邻接表
void createGraph(Graph *G, int matrix[][MAX_VERTEX_NUM])
{
    int i, j;
    for (i = 0; i < G->vertexNum; i++) {
        G->adjList[i].data = i;  // 顶点的数据为下标
        G->adjList[i].firstedge = NULL;  // 初始化指向第一个邻接点的指针为空
        for (j = 0; j < G->vertexNum; j++) {
            if (matrix[i][j] != 0) {  // 邻接矩阵中元素不为0,表示有边
                // 创建一个邻接点结构体
                EdgeNode *edge = (EdgeNode*)malloc(sizeof(EdgeNode));
                edge->adjvex = j;
                edge->next = G->adjList[i].firstedge;  // 将新创建的邻接点插入到该顶点的链表头
                G->adjList[i].firstedge = edge;  // 更新该顶点的链表头指针
            }
        }
    }
}

int main()
{
    int matrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM] = {  // 邻接矩阵
        {0, 1, 1, 0},
        {1, 0, 0, 1},
        {1, 0, 0, 1},
        {0, 1, 1, 0}
    };
    Graph G;
    G.vertexNum = 4;
    createGraph(&G, matrix);
    // 输出邻接表
    for (int i = 0; i < G.vertexNum; i++) {
        printf("%d: ", G.adjList[i].data);
        EdgeNode *p = G.adjList[i].firstedge;
        while (p) {
            printf("%d ", p->adjvex);
            p = p->next;
        }
        printf("\n");
    }
    return 0;
}

标签:adjList,EdgeNode,int,vertexNum,邻接矩阵,转化,邻接,顶点
From: https://blog.51cto.com/heliotopekxy/6317885

相关文章

  • 邻接表的建立算法
    StatusCreate(ALGraph*G){ inti,j,k; charv1[20],v2[20]; ArcNode*p,*q; printf("请输入顶点数和边数:"); scanf("%d%d",&G->vertices,&G->arcnum); for(i=0;i<G->vexnum;i++) { scanf("%s",G->vertices[i].data)......
  • 将真分数转化为埃及分数
    一问题描述现输入一个真分数,请将该分数分解为埃及分数。2二问题分析真分数(aproperfraction):分子比分母小的分数,叫做真分数。真分数的分数值小于1.如1/2,3/5,8/9等。分子是1的分数,叫单位分数。古代埃及人在进行分数运算时,只使用分子是1的分数。因此这种分数也叫做埃及分数,或者叫单......
  • JavaScript中变量类型间的转化
    转到数值字符串布尔nullundefined数值Number()parsenInt()-0,/1,*1Number(true)→1Number(false)→0Number(null)→0Number(undefind)→NaN字符串String()toString()+""String(true)→trueString(false)→falseError:null.toString()Error:undefined.......
  • 类型转化问题
    类型之间的转换问题  1.同种数据类型之间是可以直接进行赋值操作     例如:    inta=1;intb=a; floatx=3.4;floaty=x;  2.数据类型不同的空间之间的赋值--->转换问题     同种大数据类型之间才能发生转换     基本类......
  • 能量转化
    电能转化为机械能    电动机电能转化为化学能    电解、给电池充电电能转化为内能      电热丝、空调、微波炉内能转化为机械能    热机化学能转化为电能    伏打电池化学能转化为光能    石油燃烧化学能转化为内能  ......
  • vector和string的转化
    C99:int数字_t,t表示它是取另一个名字,不是新的数据类型uint数字_t表示无符号,编译器把这种数据类型看成数字。数字是指单位长度有多少bit1.string转vector<char>用assignstring与数字转化strings=“hellloword!”vector<uint8_t>v;v.assign(s.begin(),s.end()); 2......
  • Python 文件大小(Byte)可读性转化(KB、MB、GB、TB)
    Python文件大小可读性转化file_size_exchange.py#!/usr/bin/envpython#-*-coding:utf-8-*-#@Time:2023/5/1217:52#@Software:PyCharm__author__="JentZhang"KB=1024MB=KB*KBGB=MB*KBTB=GB*KBdefformat_byte_repr(byte_num):&q......
  • sql server 将datetime类型的字段转化成字符串输出
    SELECTOBJID,NAME,CONVERT(varchar(19),CREATIONDATE,120)ASCREATIONDATEFROM[dbo].[SYS_DOCUMENTREV]WHERENAMELIKE'test%.pdf'ORDERBYCREATIONDATEDESC......
  • java8一个List转化为另外一个List
    List<String>filterTags=Lists.newArrayList();List<Promotion>promotionList=filterTags.stream().map(f->{Promotiontag=newPromotion(context);tag.setLabel(f);tag.setCode(f);......
  • Cp56Time2a 日期的相互转化
    直接上代码importcn.hutool.core.date.DateUtil;importcn.hutool.core.util.HexUtil;importjava.util.Calendar;importjava.util.Date;publicclassCp56Time2aUtil{/***Cp56Time2a转时间字符串*@parambytes字符数组*@return时间字符串*/......