自定义图的邻接矩阵和邻接表两种存储结构。以下两项任选其一: (1) 创建图的邻接矩阵,设计算法自动生成邻接表,或: (2) 创建图的邻接表,设计算法自动生成邻接矩阵。 要求能够打印图的邻接矩阵和邻接表,进行验证。C语言
时间: 2024-04-29 20:22:13 浏览: 92
新建 DOC 文档_实现图的邻接矩阵和邻接表存储_doc_图的遍历算法_
5星 · 资源好评率100%
我来为您提供一份创建图的邻接矩阵并自动生成邻接表的C语言代码。
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXVEX 100 // 最大顶点数
#define INF 65535 // 表示两点之间无连接的权值
typedef struct EdgeNode {
int adjvex; // 邻接点下标
int weight; // 权值
struct EdgeNode *next; // 指向下一个邻接点的指针
} EdgeNode;
typedef struct VertexNode {
int data; // 顶点信息
EdgeNode *firstedge; // 指向第一个邻接点的指针
} VertexNode, AdjList[MAXVEX];
typedef struct {
AdjList adjList; // 存储各个顶点的邻接表
int numVertexes, numEdges; // 图中的顶点数和边数
} GraphAdjList;
// 创建邻接表
void CreateALGraph(GraphAdjList *G) {
int i, j, k;
EdgeNode *e;
printf("请输入顶点数和边数:\n");
scanf("%d %d", &G->numVertexes, &G->numEdges);
printf("请输入各个顶点的信息:\n");
for (i = 0; i < G->numVertexes; i++) {
scanf("%d", &G->adjList[i].data);
G->adjList[i].firstedge = NULL;
}
printf("请输入边的信息(顶点编号和权值):\n");
for (k = 0; k < G->numEdges; k++) {
scanf("%d %d", &i, &j);
e = (EdgeNode *)malloc(sizeof(EdgeNode));
e->adjvex = j;
e->weight = INF;
e->next = G->adjList[i].firstedge;
G->adjList[i].firstedge = e;
e = (EdgeNode *)malloc(sizeof(EdgeNode));
e->adjvex = i;
e->weight = INF;
e->next = G->adjList[j].firstedge;
G->adjList[j].firstedge = e;
}
}
// 打印邻接表
void PrintALGraph(GraphAdjList G) {
int i;
EdgeNode *p;
printf("邻接表:\n");
for (i = 0; i < G.numVertexes; i++) {
printf("%d: ", G.adjList[i].data);
p = G.adjList[i].firstedge;
while (p) {
printf("%d(%d) ", p->adjvex, p->weight);
p = p->next;
}
printf("\n");
}
}
// 创建邻接矩阵
void CreateMGraph(int G[MAXVEX][MAXVEX]) {
int i, j, k, w;
printf("请输入顶点数和边数:\n");
scanf("%d %d", &numVertexes, &numEdges);
// 初始化邻接矩阵
for (i = 0; i < numVertexes; i++) {
for (j = 0; j < numVertexes; j++) {
if (i == j) {
G[i][j] = 0; // 自己和自己没有连通
} else {
G[i][j] = INF; // 其他点默认无连接
}
}
}
printf("请输入边的信息(顶点编号和权值):\n");
for (k = 0; k < numEdges; k++) {
scanf("%d %d %d", &i, &j, &w);
G[i][j] = w;
G[j][i] = w; // 由于是无向图,需要将两个方向都设置权值
}
}
// 打印邻接矩阵
void PrintMGraph(int G[MAXVEX][MAXVEX], int n) {
int i, j;
printf("邻接矩阵:\n");
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
if (G[i][j] == INF) {
printf("∞ ");
} else {
printf("%d ", G[i][j]);
}
}
printf("\n");
}
}
int main() {
int G1[MAXVEX][MAXVEX];
GraphAdjList G2;
CreateMGraph(G1);
PrintMGraph(G1, numVertexes);
CreateALGraph(&G2);
PrintALGraph(G2);
return 0;
}
```
以上代码中,我们通过 `CreateMGraph` 函数创建了邻接矩阵,并通过 `PrintMGraph` 函数打印了邻接矩阵。同时,我们通过 `CreateALGraph` 函数创建了邻接表,并通过 `PrintALGraph` 函数打印了邻接表。需要注意的是,这两个函数在创建图时需要输入相同的数据,即顶点数和边数,否则会出现错误。
阅读全文