/**
* 邻接表的定义、创建
*
* ①算法思想
*
* ②算法设计
*/
#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;
}
邻接表的定义、创建
于 2022-09-07 19:28:52 首次发布
本文介绍了邻接表在有向图中的应用,详细讲解了邻接表的定义、结构(如ArcNode和VNode),以及如何使用C语言实现AdGraph结构并创建带权重的有向图。通过代码实例展示了顶点及其边的输入和边链表的构建过程。

3183

被折叠的 条评论
为什么被折叠?



