图的邻接表创建与遍历(C语言)

本文介绍了如何使用C语言创建和遍历图的邻接表数据结构。包括了深度优先搜索(DFS)和广度优先搜索(BFS)的实现。在创建过程中,先创建顶点,然后通过头插法添加边。遍历部分,通过双重循环确保对不连通图的处理,并使用递归进行DFS以及队列进行BFS。
摘要由CSDN通过智能技术生成

数据结构

 三个结构体,边,顶点,图。

typedef struct Side//边
{
    int toVertex;//边指向的点
    struct side *next;
}Side,*sLink;
typedef struct Vertex//顶点
{
    int data;
    sLink first;//第一个边
}Vertex,AdjList[20];
typedef struct Graph//图
{
    AdjList adj;//顶点数组,注意不是指针,用.不用->
    int n,v;//顶点数,边数
}Graph,*gLink;

创建

先顶点,再边。边用头插法,最后插的接在first上

void createGraph(gLink g)
{
    int n,v,data;
    printf("请输入顶点数与边数");
    scanf("%d %d",&n,&v);
    g->n = n;
    g->v = v;
    int i;
    for(i=0;i<n;i++)
    {
        printf("请输入顶点%d权值",i);
        scanf("%d",&data);
        g->adj[i].data = data;
        g->adj[i].first = NULL;
    }
    printf("请输入边信息");
    int v1,v2;
    for(i=0;i<v;i++)
    {
        scanf("
以下是使用带权邻接表实现的广度优先遍历C语言代码: ```c #include <stdio.h> #include <stdlib.h> #define MaxVertexNum 100 // 最大顶点数 typedef int Vertex; // 顶点类型为整型 typedef int WeightType; // 权重类型为整型 // 边结构体 typedef struct ENode { Vertex v1, v2; // 有向边<v1, v2> WeightType weight; // 权重 }ENode; // 邻接点结构体 typedef struct AdjVNode { Vertex adjv; // 邻接点下标 WeightType weight; // 权重 struct AdjVNode* next; // 指向下一个邻接点的指针 }AdjVNode; // 顶点结构体 typedef struct Vnode { AdjVNode* firstedge; // 指向第一个邻接点的指针 }Vnode, AdjList[MaxVertexNum]; // 结构体 typedef struct GNode { int Nv; // 顶点数 int Ne; // 边数 AdjList G; // 邻接表 }GNode, *PtrToGNode; typedef PtrToGNode Graph; int visited[MaxVertexNum]; // 访问标记数组 // 创建并初始化 Graph CreateGraph(int VertexNum) { Vertex v; Graph G = (Graph)malloc(sizeof(GNode)); G->Nv = VertexNum; G->Ne = 0; for (v = 0; v < G->Nv; v++) G->G[v].firstedge = NULL; return G; } // 插入边 void InsertEdge(Graph G, ENode* e) { AdjVNode* newnode; // 为v1插入边<v1, v2> newnode = (AdjVNode*)malloc(sizeof(AdjVNode)); newnode->adjv = e->v2; newnode->weight = e->weight; newnode->next = G->G[e->v1].firstedge; G->G[e->v1].firstedge = newnode; // 为v2插入边<v2, v1>(无向) newnode = (AdjVNode*)malloc(sizeof(AdjVNode)); newnode->adjv = e->v1; newnode->weight = e->weight; newnode->next = G->G[e->v2].firstedge; G->G[e->v2].firstedge = newnode; } // 构造 Graph BuildGraph() { Graph G; ENode* e; Vertex v; int Nv, i; printf("请输入顶点数: "); scanf("%d", &Nv); G = CreateGraph(Nv); printf("请输入边数: "); scanf("%d", &(G->Ne)); if (G->Ne != 0) { e = (ENode*)malloc(sizeof(ENode)); printf("请输入每条边的起点、终点和权重: "); for (i = 0; i < G->Ne; i++) { scanf("%d %d %d", &e->v1, &e->v2, &e->weight); InsertEdge(G, e); } } // 如果顶点有数据的话,读入数据 for (v = 0; v < G->Nv; v++) scanf("%d", &(G->G[v].data)); return G; } // 遍历顶点v所在的连通块 void BFS(Graph G, Vertex v) { AdjVNode* W; Queue Q = CreateQueue(); // 创建空队列 printf("访问顶点 %d\n", v); visited[v] = 1; // 标记为已访问 Enqueue(Q, v); // 将v入队列 while (!IsEmpty(Q)) { // 只要队列不空 v = Dequeue(Q); // 将队首顶点出队列 for (W = G->G[v].firstedge; W; W = W->next) { // 对v的每个邻接点W->adjv if (!visited[W->adjv]) { // 若W未被访问 printf("访问顶点 %d\n", W->adjv); visited[W->adjv] = 1; // 标记为已访问 Enqueue(Q, W->adjv); // 将W入队列 } } } } // 遍历 void BFSTraverse(Graph G) { Vertex v; for (v = 0; v < G->Nv; v++) visited[v] = 0; // 初始化访问标记数组 for (v = 0; v < G->Nv; v++) { if (!visited[v]) // 若顶点v未被访问 BFS(G, v); // 访问顶点v所在的连通块 } } ``` 其中,`ENode`表示边结构体,包含两个顶点和权重;`AdjVNode`表示邻接点结构体,包含邻接点下标、权重和指向下一个邻接点的指针;`Vnode`表示顶点结构体,包含指向第一个邻接点的指针;`AdjList`表示邻接表,是一个大小为`MaxVertexNum`的`Vnode`数组;`GNode`表示结构体,包含顶点数、边数和邻接表。`CreateGraph`函数创建并初始化,`InsertEdge`函数插入边,`BuildGraph`函数构造,`BFS`函数遍历顶点v所在的连通块,`BFSTraverse`函数遍历
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值