图的邻接表表示

lixiangrong
2024-01-29 / 0 评论 / 65 阅读 / 正在检测是否收录...

图的邻接表表示

#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

评论 (0)

取消