创建图的邻接矩阵,设计算法自动生成邻接表要求能够打印图的邻接矩阵和邻接表,(用c语言实现)
时间: 2024-05-07 15:23:25 浏览: 110
以下是C语言实现的邻接矩阵和邻接表生成算法:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTICES 20
typedef struct Graph {
int V; // 图的顶点数
int E; // 图的边数
int adj[MAX_VERTICES][MAX_VERTICES]; // 邻接矩阵
} Graph;
typedef struct Node {
int vertex;
struct Node *next;
} Node;
typedef struct List {
Node *head;
} List;
void initGraph(Graph *G, int V) {
G->V = V;
G->E = 0;
for (int i = 0; i < G->V; i++) {
for (int j = 0; j < G->V; j++) {
G->adj[i][j] = 0;
}
}
}
void addEdge(Graph *G, int v, int w) {
G->adj[v][w] = 1;
G->adj[w][v] = 1;
G->E++;
}
void printGraph(Graph *G) {
printf("邻接矩阵:\n");
for (int i = 0; i < G->V; i++) {
for (int j = 0; j < G->V; j++) {
printf("%d ", G->adj[i][j]);
}
printf("\n");
}
printf("\n邻接表:\n");
for (int i = 0; i < G->V; i++) {
printf("%d: ", i);
for (int j = 0; j < G->V; j++) {
if (G->adj[i][j] == 1) {
printf("%d ", j);
}
}
printf("\n");
}
}
void initList(List *L) {
L->head = NULL;
}
void addNode(List *L, int vertex) {
Node *newNode = (Node*)malloc(sizeof(Node));
newNode->vertex = vertex;
newNode->next = L->head;
L->head = newNode;
}
int main() {
Graph G;
int V = 5;
initGraph(&G, V);
addEdge(&G, 0, 1);
addEdge(&G, 0, 2);
addEdge(&G, 1, 3);
addEdge(&G, 2, 4);
printGraph(&G);
List adjList[V];
for (int i = 0; i < V; i++) {
initList(&adjList[i]);
for (int j = 0; j < V; j++) {
if (G.adj[i][j] == 1) {
addNode(&adjList[i], j);
}
}
}
printf("\n手动打印邻接表:\n");
for (int i = 0; i < V; i++) {
printf("%d: ", i);
Node *curr = adjList[i].head;
while (curr != NULL) {
printf("%d ", curr->vertex);
curr = curr->next;
}
printf("\n");
}
return 0;
}
```
这里我们先建立了一个结构体 `Graph` 来存储邻接矩阵,其中 `V` 表示图的顶点数,`E` 表示图的边数,`adj` 表示邻接矩阵。然后我们使用 `addEdge` 函数来添加边,最后使用 `printGraph` 函数来打印邻接矩阵和邻接表。
我们还创建了一个结构体 `List` 来存储邻接表,其中 `head` 是指向链表头节点的指针。我们使用 `initList` 函数来初始化链表,使用 `addNode` 函数来添加节点。最后我们手动打印了邻接表。
这里我们将邻接表的实现放在了 `main` 函数中,你也可以将其封装成一个函数来调用。
阅读全文