C语言邻接表建立无向网
时间: 2023-10-29 21:10:07 浏览: 101
邻接表是一种常见的图的存储结构,用于表示图中节点之间的关系。在无向网中,每个节点可以连接多个相邻节点,并且每条边都有权重。下面是C语言中邻接表建立无向网的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 最大节点数
#define INF 32767 // 无限大
// 边的结构体
typedef struct ArcNode {
int adjvex; // 相邻节点的编号
int weight; // 权重
struct ArcNode *next; // 指向下一条边的指针
} ArcNode;
// 节点的结构体
typedef struct VertexNode {
char data; // 节点的数据
ArcNode *first; // 指向第一条边的指针
} VertexNode;
// 图的结构体
typedef struct {
VertexNode adjList[MAX_VERTEX_NUM]; // 存储节点的数组
int vexNum, arcNum; // 节点数和边数
} Graph;
// 初始化图
void initGraph(Graph *g) {
int i;
for (i = 0; i < MAX_VERTEX_NUM; i++) {
g->adjList[i].data = ' ';
g->adjList[i].first = NULL;
}
g->vexNum = g->arcNum = 0;
}
// 添加节点
void addVertex(Graph *g, char data) {
g->adjList[g->vexNum].data = data;
g->vexNum++;
}
// 添加边
void addArc(Graph *g, int v, int w, int weight) {
ArcNode *p = (ArcNode *)malloc(sizeof(ArcNode));
p->adjvex = w;
p->weight = weight;
p->next = g->adjList[v].first;
g->adjList[v].first = p;
// 无向图需要添加相反方向的边
ArcNode *q = (ArcNode *)malloc(sizeof(ArcNode));
q->adjvex = v;
q->weight = weight;
q->next = g->adjList[w].first;
g->adjList[w].first = q;
g->arcNum++;
}
// 打印邻接表
void printGraph(Graph *g) {
int i;
ArcNode *p;
printf("Graph:\n");
for (i = 0; i < g->vexNum; i++) {
printf("%c -> ", g->adjList[i].data);
p = g->adjList[i].first;
while (p != NULL) {
printf("%c(%d) ", g->adjList[p->adjvex].data, p->weight);
p = p->next;
}
printf("\n");
}
}
int main() {
Graph g;
initGraph(&g);
addVertex(&g, 'A');
addVertex(&g, 'B');
addVertex(&g, 'C');
addVertex(&g, 'D');
addVertex(&g, 'E');
addArc(&g, 0, 1, 3);
addArc(&g, 0, 2, 2);
addArc(&g, 1, 2, 4);
addArc(&g, 1, 3, 5);
addArc(&g, 1, 4, 6);
addArc(&g, 2, 3, 7);
addArc(&g, 3, 4, 8);
printGraph(&g);
return 0;
}
```
在这个示例中,我们首先定义了边和节点的结构体,然后定义了图的结构体,包含一个邻接表数组,以及节点数和边数。然后我们实现了初始化图、添加节点、添加边、打印邻接表等函数。在添加边的时候,我们需要添加相反方向的边,因为无向图的边是双向的。最后我们创建了一个示例图,并打印了它的邻接表。
阅读全文