建立一个无向图用邻接表
时间: 2023-11-27 20:27:27 浏览: 84
建立无向图的邻接表,可以使用以下结构体来表示图:
```
#define MAX_VERTEX_NUM 20
typedef struct ArcNode { // 边表结点
int adjvex; // 邻接点在顶点数组中的下标
struct ArcNode *nextarc; // 指向下一个邻接点的指针
} ArcNode;
typedef struct VNode { // 顶点信息
char data; // 顶点数据
ArcNode *firstarc; // 指向第一个邻接点的指针
} VNode;
typedef struct { // 图
VNode adjlist[MAX_VERTEX_NUM]; // 顶点数组
int vexnum, arcnum; // 顶点数和边数
} Graph;
```
其中,每个顶点通过VNode结构体来表示,它包含了该顶点的数据和一个指向第一个邻接点的指针。每条边则通过ArcNode结构体来表示,它包含了邻接点在顶点数组中的下标和指向下一个邻接点的指针。
以下是建立无向图的邻接表的函数实现:
```
void CreateGraph(Graph &G) {
int i, j, k;
char v1, v2;
ArcNode *p;
scanf("%d%d", &G.vexnum, &G.arcnum);
getchar();
for (i = 0; i < G.vexnum; i++) {
scanf("%c", &G.adjlist[i].data);
G.adjlist[i].firstarc = NULL;
getchar();
}
for (k = 0; k < G.arcnum; k++) {
scanf("%c%c", &v1, &v2);
getchar();
i = LocateVex(G, v1);
j = LocateVex(G, v2);
p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = j;
p->nextarc = G.adjlist[i].firstarc;
G.adjlist[i].firstarc = p;
p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = i;
p->nextarc = G.adjlist[j].firstarc;
G.adjlist[j].firstarc = p;
}
}
```
该函数首先读取输入的顶点数和边数,然后循环读取每个顶点的名称,并将其初始化为一个没有邻接点的顶点。接下来,循环读取每条边的起点和终点,通过LocateVex函数定位它们在顶点数组中的下标,然后创建两个ArcNode结构体,分别连接起点和终点的邻接表。需要注意的是,由于是无向图,所以需要在起点和终点的邻接表中都添加一条边。
其中,LocateVex函数可以通过遍历顶点数组来查找指定顶点的下标:
```
int LocateVex(Graph G, char v) {
int i;
for (i = 0; i < G.vexnum; i++) {
if (G.adjlist[i].data == v) {
return i;
}
}
return -1;
}
```
该函数接受一个图结构体和一个顶点的名称作为参数,返回该顶点在顶点数组中的下标。如果未找到该顶点,则返回-1。
阅读全文