邻接表的定义、创建

本文介绍了邻接表在有向图中的应用,详细讲解了邻接表的定义、结构(如ArcNode和VNode),以及如何使用C语言实现AdGraph结构并创建带权重的有向图。通过代码实例展示了顶点及其边的输入和边链表的构建过程。
/**
 * 邻接表的定义、创建
 *
 * ①算法思想
 *
 * ②算法设计
 */

#include <stdio.h>
#include <iostream>
#include <cstdio>
#include <malloc.h>
#include <cstdlib>
#define MaxSize 20
#define INF 999999



//2、邻接表
//边链表
struct ArcNode{
    int adjvex;//边链表中的顶点在数组中的下标
    struct ArcNode *next;//边链表的指针
    int weight;//可能会有权值(带权图才用)
};
//每个节点
struct VNode{
    char value;
    struct ArcNode *first;//指向边链表第一个节点的指针
};
//整个图的结构
struct AdGraph{
    VNode vertices[MaxSize];//VNode类型的数组
    int vexnum,arcnum;
};

//创建(有向图、无向图、网)
AdGraph CreatAdGraph(){
    AdGraph G;
    ArcNode *p,*q;//边链表的建立相当于不带头结点的尾插,q用来移动,p维持逻辑
    int NodeEdgeNum,adjvex,weight;
    scanf("%d%d",&G.vexnum,&G.arcnum);
    for (int i = 0; i < G.vexnum; ++i) {//输入整个图的顶点,并将顶点结构中指向边链表第一个节点的指针置空
        scanf("%c%d",&G.vertices[i].value,&NodeEdgeNum);//告诉顶点值和这个顶点的边数
        G.vertices[i].first = NULL;//注意不是G.vertices[i] -> first = NULL;
        for (int j = 0; j < NodeEdgeNum; ++j) {//知道了NodeEdgeNum(这个顶点的边数)就可以知道此时的这个顶点后面的边链表需要malloc多少次
            q = (ArcNode*)malloc(sizeof(ArcNode));
            scanf("%d%d",&adjvex,&weight);
            q -> adjvex = adjvex;
            q -> weight = weight;//没有权值这边就不写
            if(G.vertices[i].first == NULL){
                G.vertices[i].first = q;
                p = q;//p代表链表的尾部
            }else{
                p -> next = q;
                p = q;
            }
        }
        p -> next = NULL;
    }
    return G;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值