图的邻接表表示
#include <stdio.h>
#include <stdlib.h>
// 8.3.2 图的邻接表表示
#define MAX 20 // 预定义图的最大顶点数
typedef char dataType; // 顶点数据类型
typedef struct edgeNode // 边表结点
{
int adjVex; // 邻接点(位序)
struct edgeNode *next; // 与顶点邻接的下一结点
}eNode;
typedef struct vertexNode // 头结点类型
{
dataType vertex; // 顶点信息
eNode *firstEdge; // 邻接链表头指针
}vNode;
typedef struct linkedGraph // 邻接表存储的图
{
vNode adjList[MAX]; // 存放顶点的顺序表
int n,e; // 图的顶点数、边数
}graph;
// 1. 建立图的邻接表
void createLinkedGraph(graph *g, int c)
{
int i, j, k;
eNode *node = NULL; // 指向边表结点的指针
scanf("%d%d",&g->n,&g->e); // 输入顶点数、边数
if(g->n)
{
for (i = 0; i < g->n; ++i)
{
scanf("%1s",&g->adjList[i].vertex); // 输入顶点
g->adjList[i].firstEdge = NULL; // 边表初始化
}
for (k = 0; k < g->e; ++k)
{
scanf("%d%d",&i,&j); // 输入边的信息
node = (eNode *) malloc(sizeof(eNode)); // 创建边
node->adjVex = j;
node->next = g->adjList[i].firstEdge;
g->adjList[i].firstEdge = node; // 头插法建立链表
if(c == 0) // 无向图
{
node = (eNode *) malloc(sizeof(eNode));
node->adjVex = i;
node->next = g->adjList[j].firstEdge;
g->adjList[j].firstEdge = node;
}
}
}
}
// 2. 输出邻接表表示的图
void print(graph g)
{
eNode *node = NULL; // 边表结点指针
for (int i = 0; i < g.n; ++i)
{
printf("%c->",g.adjList[i].vertex);
node = g.adjList[i].firstEdge;
while (node)
{
printf("%d->",node->adjVex);
node = node->next;
}
printf("\n");
}
printf("该图有%d个顶点,%d条边",g.n,g.e);
}
int main()
{
graph g;
printf("请依次输入图的顶点数、边数,顶点信息和边信息\n");
createLinkedGraph(&g,1); // 0表示无向图,1表示有向图
printf("该图的邻接表表示如下:\n");
print(g);
return 0;
}
评论 (0)