#include <stdio.h>
#include <stdlib.h>
#define MaxVertexNum 100
// 定义边表结点
typedef struct ArcNode
{
int adjbex; // 弧所指向的顶点位置
struct ArcNode *next; // 指向下一条弧的指针
} ArcNode;
// 定义顶点表结点
typedef struct VNode
{
char data; // 顶点
ArcNode *first; // 指向第一条依附该节点的弧的指针
} VNode, AdjList[MaxVertexNum];
// 定义图的邻接表结构
typedef struct
{
AdjList vertices; // 邻接表
int vexnum, arcnum; // 图中的顶点数和弧数
} ALGraph;
// 初始化图
void InitGraph(ALGraph *G)
{
G->vexnum = 0; // 将顶点数初始化为0
G->arcnum = 0; // 将弧数初始化为0
for (int i = 0; i < MaxVertexNum; i++)
{
G->vertices[i].data = ' '; // 将顶点表初始化为空字符
G->vertices[i].first = NULL; // 将边表初始化为NULL
}
}
// 创建图
void CreateGraph(ALGraph *G)
{
printf("Enter the number of vertices: ");
scanf("%d", &G->vexnum); // 输入图的顶点数
printf("Enter the number of edges: ");
scanf("%d", &G->arcnum); // 输入图的边数
// 输入每个顶点的数据
for (int i = 0; i < G->vexnum; i++)
{
printf("Enter the data for vertex %d: ", i);
scanf(" %c", &G->vertices[i].data);
}
// 输入每条边的起点和终点
for (int i = 0; i < G->arcnum; i++)
{
int start, end;
printf("Enter the start and end vertices of edge %d: ", i);
scanf("%d %d", &start, &end);
// 创建一条从起点到终点的边
ArcNode *arc = (ArcNode *)malloc(sizeof(ArcNode));
arc->adjbex = end;
arc->next = G->vertices[start].first;
G->vertices[start].first = arc;
// 对于无向图,还需要创建一条从终点到起点的边
arc = (ArcNode *)malloc(sizeof(ArcNode));
arc->adjbex = start;
arc->next = G->vertices[end].first;
G->vertices[end].first = arc;
}
}
int main()
{
ALGraph G;
InitGraph(&G); // 初始化图
CreateGraph(&G); // 创建图
// 打印邻接表
for (int i = 0; i < G.vexnum; i++)
{
printf("Vertex %c: ", G.vertices[i].data);
ArcNode *p = G.vertices[i].first;
while (p != NULL)
{
printf("%c ", G.vertices[p->adjbex].data);
p = p->next;
}
printf("\n");
}
return 0;
}
图-邻接表法
最新推荐文章于 2024-10-05 15:32:05 发布