c语言将邻接矩阵转化为邻接表
时间: 2023-10-06 09:09:22 浏览: 96
好的,我知道如何将邻接矩阵转化为邻接表。下面是具体的步骤:
1. 定义一个结构体表示邻接表中的一个节点,包含两个成员:节点的值和指向下一个节点的指针。
2. 定义一个数组,数组的每个元素表示邻接表中的一个头节点,头节点的值就是对应的节点的值。数组的大小应该等于邻接矩阵中的点的个数。
3. 对于邻接矩阵中每个非零元素 A[i][j],创建一个新的节点,将节点的值设置为 j,并将该节点插入到第 i 个头节点所指向的链表的末尾。
4. 重复步骤 3,直到处理完邻接矩阵中的所有非零元素。
5. 最后得到的邻接表就是一个以数组为基础的链表结构,可以通过遍历数组中每个元素所指向的链表来访问图中所有的节点和边。
希望这个回答能够帮助到你!
相关问题
C语言将邻接矩阵g转换为邻接表G,将邻接表G转换为邻接矩阵g1输出
好的,下面是 C 语言的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXN 100 // 设定图中最多有100个顶点
// 定义节点结构体
typedef struct Node {
int v; // 该节点对应的顶点编号
struct Node *next; // 指向下一个节点的指针
} Node;
// 定义邻接表结构体
typedef struct {
Node *head; // 指向第一个节点的指针
} AdjList[MAXN];
// 定义邻接矩阵结构体
typedef struct {
int matrix[MAXN][MAXN]; // 存储矩阵
int n; // 顶点个数
} Graph;
// 将邻接矩阵转化为邻接表
void matrix2list(Graph *g, AdjList adjList) {
int i, j;
Node *node;
// 遍历邻接矩阵
for (i = 0; i < g->n; i++) {
adjList[i].head = NULL; // 初始化每个链表的头指针为空
for (j = 0; j < g->n; j++) {
if (g->matrix[i][j] != 0) { // 如果顶点i和顶点j之间有边
// 创建一个新节点
node = (Node *)malloc(sizeof(Node));
node->v = j;
node->next = adjList[i].head;
// 将新节点插入到链表的头部
adjList[i].head = node;
}
}
}
}
// 将邻接表转化为邻接矩阵
void list2matrix(AdjList adjList, Graph *g) {
int i, j;
Node *p;
// 初始化邻接矩阵
for (i = 0; i < g->n; i++) {
for (j = 0; j < g->n; j++) {
g->matrix[i][j] = 0;
}
}
// 遍历邻接表
for (i = 0; i < g->n; i++) {
p = adjList[i].head;
while (p != NULL) {
g->matrix[i][p->v] = 1;
p = p->next;
}
}
}
int main() {
Graph g = {
{{0, 1, 0}, {1, 0, 1}, {0, 1, 0}}, // 邻接矩阵
3 // 顶点个数
};
AdjList adjList;
matrix2list(&g, adjList); // 转化为邻接表
list2matrix(adjList, &g); // 转化为邻接矩阵
// 输出邻接矩阵
int i, j;
for (i = 0; i < g.n; i++) {
for (j = 0; j < g.n; j++) {
printf("%d ", g.matrix[i][j]);
}
printf("\n");
}
return 0;
}
```
代码的主要思路是:先将邻接矩阵转化为邻接表,然后再将邻接表转化为邻接矩阵。最终输出得到的邻接矩阵。
C语言 邻接矩阵转换为邻接表
邻接矩阵和邻接表是表示图的两种常见方式,其中邻接矩阵是通过二维数组来表示图的,而邻接表则是通过链表来表示图的。邻接表通常用于稀疏图的表示,而邻接矩阵则适用于稠密图的表示。
下面是将邻接矩阵转换为邻接表的C语言实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 最大顶点数
typedef struct EdgeNode{
int adjvex; // 邻接点的位置
struct EdgeNode *next; // 指向下一个邻接点的指针
}EdgeNode;
typedef struct VertexNode{
int data; // 顶点的数据
EdgeNode *firstedge; // 指向第一个邻接点的指针
}VertexNode, AdjList[MAX_VERTEX_NUM];
typedef struct{
AdjList adjList;
int numVertexes, numEdges; // 顶点数和边数
}GraphAdjList;
void CreateALGraph(GraphAdjList *G, int **matrix, int row, int col){
G->numVertexes = row;
G->numEdges = 0;
for(int i = 0; i < G->numVertexes; i++){
G->adjList[i].data = i; // 顶点数据
G->adjList[i].firstedge = NULL; // 初始化邻接表的头指针
for(int j = 0; j < G->numVertexes; j++){
if(matrix[i][j] != 0){
EdgeNode *e = (EdgeNode*)malloc(sizeof(EdgeNode));
e->adjvex = j;
e->next = G->adjList[i].firstedge;
G->adjList[i].firstedge = e; // 将新建的边节点插入到邻接表中
G->numEdges++; // 边数加一
}
}
}
}
int main(){
int matrix[5][5] = {
{0, 1, 0, 1, 1},
{1, 0, 1, 1, 0},
{0, 1, 0, 1, 0},
{1, 1, 1, 0, 1},
{1, 0, 0, 1, 0}
};
GraphAdjList G;
CreateALGraph(&G, (int**)matrix, 5, 5);
// 打印邻接表
for(int i = 0; i < G.numVertexes; i++){
printf("%d: ", G.adjList[i].data);
EdgeNode *e = G.adjList[i].firstedge;
while(e != NULL){
printf("%d ", e->adjvex);
e = e->next;
}
printf("\n");
}
return 0;
}
```
上述代码中,CreateALGraph函数用于将邻接矩阵转换为邻接表,其中邻接表通过AdjList数组来表示,每个AdjList数组元素包括一个顶点的数据和一个指向第一个邻接点的指针。具体实现中,我们遍历邻接矩阵,如果矩阵元素不为0,则新建一个边节点,并将该节点插入到顶点的邻接表中。
最后,我们利用两层循环打印邻接表。
阅读全文