【数据结构】图的存储--邻接表

邻接表(Adjacency List)是图的一种顺序存储和链式存储相结合的存储方式。对于图中的每个顶点i,将所有邻接于i的顶点链接成一个单向链表,这个单向链表就称为顶点i的邻接表,再将所有邻接表的表头放到一个数组中,由此就构成了图的邻接表。

下面给出邻接表的结构声明
#define MaxVertexNum 100 //最大顶点数为100
enum GraphType {DG,UG,DN,UN} ; //图的类型
typedef struct Node{          //边表结点
    int AdjV;                  //邻接点域
    struct Node *Next;         //指针域
    //如果需要表示边上的权值信息,可以增加一个数据域Weight
} EdgeNode;

typedef struct VNode{        //顶点表结点
    char Vertex;             //顶点域
    EdgeNode *FirstEdge;     //边表头指针
} VertexNode;

typedef struct ALGraph{
    VertexNode AdjList[MaxVertexNum]; //邻接表
    int Visited[MaxVertexNum]; //记录访问过的顶点
    int n,e;                  //顶点数和边数
    enum GraphType GType;     //图的类型
}* ALGraph;
 以有向图为例,给出邻接表的构造算法
ALGraph CreateALGraph()
{
    ALGraph G;
    EdgeNode *edge;
    G = (ALGraph)malloc(sizeof(struct ALGraph));
    G->GType = DG;
    printf("输入顶点数和边数(用空格隔开):\n");
    scanf("%d %d",&G->n,&G->e);
    getchar();
    printf("输入顶点信息(用空格隔开):\n");
    for(int i = 0; i < G->n; i++){
        scanf("%c",&G->AdjList[i].Vertex); //录入信息
        getchar();
        G->AdjList[i].FirstEdge = NULL; //顶点的边表设置为空
    }
    printf("输入边的两个端点(用空格隔开):\n");
    for(int i,j,k = 0; k < G->e; k++){
        scanf("%d %d", &i,&j);
        edge = (EdgeNode*)malloc(sizeof(EdgeNode)); //生成新的边表结点
        edge->AdjV = j;                             //录入邻接点序号
        edge->Next = G->AdjList[i].FirstEdge;       //新的边表结点插入顶点i的头部
        G->AdjList[i].FirstEdge = edge;
    }
    return G;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值