自定义图的邻接矩阵和邻接表两种存储结构。以下两项任选其一: (1)创建图的邻接矩阵,设计算法自动生成邻接表,或: (2)创建图的邻接表,设计算法自动生成邻接矩阵。 要求能够打印图的邻接矩阵和邻接表,进行验证。 用C语言实现 并给出时间复杂度与空间复杂度
时间: 2024-05-12 10:14:27 浏览: 82
我们选择第一种方式,即创建图的邻接矩阵,设计算法自动生成邻接表。
假设我们的图有n个节点,邻接矩阵可以用一个n*n的二维数组来表示,其中matrix[i][j]表示节点i到节点j之间是否有边。
我们可以通过遍历邻接矩阵,来生成邻接表。具体步骤如下:
1. 创建一个长度为n的数组adj_list,用于存储邻接表。
2. 遍历邻接矩阵,对于每个matrix[i][j]为1的节点i和节点j,将j加入i的邻接表中。
3. 打印邻接表。
以下是C语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100
typedef struct node {
int vertex;
struct node* next;
}node;
typedef struct adj_list {
node* head;
}adj_list;
void print_adj_matrix(int n, int matrix[][MAX_VERTEX_NUM]) {
printf("邻接矩阵:\n");
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
}
void print_adj_list(int n, adj_list* adj_list) {
printf("邻接表:\n");
for(int i = 0; i < n; i++) {
printf("%d: ", i);
node* current = adj_list[i].head;
while (current != NULL) {
printf("%d ", current->vertex);
current = current->next;
}
printf("\n");
}
}
void matrix_to_list(int n, int matrix[][MAX_VERTEX_NUM], adj_list* adj_list) {
for(int i = 0; i < n; i++) {
adj_list[i].head = NULL;
for(int j = 0; j < n; j++) {
if(matrix[i][j] == 1) {
node* new_node = (node*)malloc(sizeof(node));
new_node->vertex = j;
new_node->next = adj_list[i].head;
adj_list[i].head = new_node;
}
}
}
}
int main() {
int n = 5;
int matrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM] = {
{0, 1, 0, 1, 0},
{1, 0, 1, 1, 1},
{0, 1, 0, 0, 1},
{1, 1, 0, 0, 1},
{0, 1, 1, 1, 0}
};
adj_list adj_list[MAX_VERTEX_NUM];
print_adj_matrix(n, matrix);
matrix_to_list(n, matrix, adj_list);
print_adj_list(n, adj_list);
return 0;
}
```
时间复杂度:O(n^2),空间复杂度:O(n^2)(邻接矩阵)+ O(n^2)(邻接表)。
阅读全文
相关推荐

















