数据结构:图的表示和遍历算法C语言实现(带案例)

图的表示

邻接矩阵在边数相对点数较少时会浪费存储空间。使用数组和链表相结合的邻接表存储。

图的存储————邻接矩阵法

有向图中,第i个结点的出(入)度=第i行(列)的非零元素个数,第i个结点的度= 第i行和第i列的非零个数之和
无向图中,第i个结点的度 = 第i行(列)的非零元素个数,无向图的邻接矩阵是对称矩阵可压缩
对于n个顶点和e条边的图,时间复杂度是 O ( n + n 2 + e ) O(n+n^{2}+e) O(n+n2+e)

typedef char VertexType;
typedef int EdgeType;
/*邻接矩阵在边数相对点数较少时会浪费存储空间。使用数组和链表相结合的邻接表存储。*/
typedef struct
{
   
    VertexType vexs[MAXVEX]; //顶点表
    EdgeType arc[MAXVEX][MAXVEX]; //邻接矩阵
    int numVertexes, numEdges; //图中当前的顶点数和边数
}MGraph;
/* 图的存储————邻接矩阵法存储带权图*/
void CreateMGraph(MGraph *G)
{
   
    int i, j, k, w;
    printf("输入顶点数和边数:\n");
    scanf("%d,%d", &(G->numVertexes), &(G->numEdges));
    for (i = 0; i < G->numVertexes; i++)
        scanf(&G->vexs[i]);    /*输入顶点,建立顶点表*/
    for (i = 0; i < G->numVertexes; i++)
        for (j = 0; j < G->numVertexes; j++)
            G->arc[i][j] = INFINITY;   /*邻接矩阵初始化*/
    for (k = 0; k < G->numEdges; k++)  /*读入numEdges条边,建立邻接矩阵*/
    {
   
        printf("输入边(vi,vj)的下标i,下标j,权重w: \n");
        scanf("%d,%d,%d", &i, &j, &w);
        G->arc[i][j] = w;
        G->arc[j][i] = G->arc[i][j];   /*无向网,矩阵对称*/
    }
}

图的存储————邻接表法

//typedef char VertexType; //顶点类型
//typedef int EdgeType; //边上的权值类型
typedef struct EdgeNode     /*边表结点*/
{
   
    int adjvex;				/*邻接点域,顶点对应的下标*/
    EdgeType weight;        /*存储权值,非网图可以不需要*/
    struct EdgeNode *next;  /*链域,指向下一个邻接点*/
}EdgeNode;

typedef struct VertexNode   /*顶点表结点*/
{
   
    VertexType data;  //顶点域,存储顶点信息
    EdgeNode *firstedge;    /*边表头指针*/
}VertexNode, AdjList[MAXVEX];
//邻接表的数据结构
typedef struct
{
   
    AdjList adjList;
    int numVertexes, numEdges;  //图中当前顶点数和边数
}GraphAdjList;

/*建立无向图的邻接表*/
void CreateALGraph(GraphAdjList *G)
{
   
    int i, j, k; //i.j代表邻接的两个点,k表示点的数量
    EdgeNode *e;
    printf("输入顶点数和边数:\n");
    scanf("%d,%d", &(G->numVertexes), &(G->numEdges));
    for (i = 0; i < G->numVertexes; i++)   //读入顶点信息,建立顶点表
    {
   
        scanf(&(G->adjList[i].data));
        G->adjList[i].firstedge = NULL;    //将边表置为空表
    }
    for (k = 0; k < G->numVertexes; k++)   //建立边表
    {
   
        printf("输入边(vi,vj)的顶点序号:\n");
        scanf("%d,%d", &i, &j); //输入边(vi,vj)的顶点序号
        e = (EdgeNode *)malloc(sizeof(EdgeNode
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值