用C语言编写一个程序实现图的邻接矩阵和邻接表的存储与输出运算的程序
时间: 2024-03-11 20:51:22 浏览: 81
实现图的邻接矩阵和邻接表存储
好的,以下是用C语言编写实现图的邻接矩阵和邻接表的存储与输出运算的程序:
```c
#include <stdio.h>
#include <stdlib.h>
// 宏定义
#define MAXVEX 100 // 图的最大顶点数
#define INFINITY 65535 // 表示无穷大
// 邻接矩阵结构体
typedef struct
{
int vexs[MAXVEX]; // 存储顶点信息
int arc[MAXVEX][MAXVEX]; // 存储边的权值
int numVertexes, numEdges; // 图中当前的顶点数和边数
} MGraph;
// 邻接表结构体
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 CreateMGraph(MGraph *G)
{
int i, j, k, w;
printf("请输入顶点数和边数: ");
scanf("%d %d", &G->numVertexes, &G->numEdges);
// 输入顶点信息
for (i = 0; i < G->numVertexes; i++)
{
printf("请输入第%d个顶点的信息: ", i + 1);
scanf("%d", &G->vexs[i]);
}
// 初始化邻接矩阵
for (i = 0; i < G->numVertexes; i++)
{
for (j = 0; j < G->numVertexes; j++)
{
G->arc[i][j] = INFINITY;
}
}
// 输入边的信息
for (k = 0; k < G->numEdges; k++)
{
printf("请输入边(vi, vj)的下标i,下标j和权值w: ");
scanf("%d %d %d", &i, &j, &w);
G->arc[i][j] = w;
G->arc[j][i] = G->arc[i][j];
}
}
// 输出邻接矩阵
void PrintMGraph(MGraph G)
{
int i, j;
printf("邻接矩阵如下:\n");
for (i = 0; i < G.numVertexes; i++)
{
for (j = 0; j < G.numVertexes; j++)
{
printf("%6d", G.arc[i][j]);
}
printf("\n");
}
}
// 用邻接表存储图
void CreateALGraph(GraphAdjList *G)
{
int i, j, k;
EdgeNode *e;
printf("请输入顶点数和边数: ");
scanf("%d %d", &G->numVertexes, &G->numEdges);
// 输入顶点信息
for (i = 0; i < G->numVertexes; i++)
{
printf("请输入第%d个顶点的信息: ", i + 1);
scanf("%d", &G->adjList[i].data);
G->adjList[i].firstedge = NULL;
}
// 输入边的信息
for (k = 0; k < G->numEdges; k++)
{
printf("请输入边(vi, vj)的下标i,下标j和权值w: ");
scanf("%d %d %d", &i, &j, &w);
// 头插法插入边表结点
e = (EdgeNode *)malloc(sizeof(EdgeNode));
e->adjvex = j;
e->weight = w;
e->next = G->adjList[i].firstedge;
G->adjList[i].firstedge = e;
// 无向图,对称插入
e = (EdgeNode *)malloc(sizeof(EdgeNode));
e->adjvex = i;
e->weight = w;
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 != NULL)
{
printf("%d(%d) ", p->adjvex, p->weight);
p = p->next;
}
printf("\n");
}
}
int main()
{
MGraph G;
CreateMGraph(&G);
PrintMGraph(G);
GraphAdjList GL;
CreateALGraph(&GL);
PrintALGraph(GL);
return 0;
}
```
以上程序实现了用邻接矩阵和邻接表存储图,并可以输出邻接矩阵和邻接表。其中,邻接矩阵的无穷大用宏定义表示,邻接表使用了头插法插入边表结点。
阅读全文