第五章 图论 邻接表存图

邻接表存图

存储结构

cpp 复制代码
#define MaxSize 10
typedef char DataType;
typedef struct EdgeNode{ // 定义边表节点 
    int adjvex;
    struct EdgeNode *next; 
} EdgeNode;

typedef struct{ // 定义顶点表结点
    DataType vertex;
    EdgeNode *first;
} vertexNode;

typedef struct{
    vertexNode adjlist[MaxSize]; // 存放顶点表的数组
    int vertexNum, edgeNum; // 图的顶点数和边数
} ALGraph;

有向图邻接表的建立

cpp 复制代码
void CreateGraph(ALGraph *G, DataType a[], int n, int m){
    G->vertexNum=n, G->edgeNum=m;
    for(int i=0; i<n; i++){
        G->adjlist[i].vertex=a[i];
        G->adjlist[i].first=NULL;
    }
    for(int i=0; i<m; i++){
        int x, y;
        scanf("%d%d", &x, &y);
        EdgeNode *s=(EdgeNode*)malloc(sizeof(EdgeNode));
        s->adjvex=y;
        s->next=G->adjlist[x].first;
        G->adjlist[x].first=s;
    }
}

图的销毁

cpp 复制代码
void DestroyGraph(ALGraph *G){
    for(int i=0; i<G->vertexNum; i++){
        EdgeNode *p, *q;
        p=q=G->adjlist[i].first;
        while(p != NULL){
            p=p->next;
            free(q);
            q=p;
        }
    }
}

深度优先遍历

cpp 复制代码
void dfs(ALGraph *G, int r){
    printf("%c ", G->adjlist[r].vertex);
    st[r]=1;

    EdgeNode *p=G->adjlist[r].first;
    while(p != NULL){
        int u=p->adjvex;
        if(st[u]==0) dfs(G, u);
        p=p->next;
    }
}

广度优先遍历

cpp 复制代码
void bfs(ALGraph *G, int r){
    int Q[MaxSize];
    int front=-1, rear=-1;
    printf("%c ", G->adjlist[r].vertex);
    st[r]=1; Q[++rear]=r;

    while(front != rear){
        int u=Q[front ++];
        EdgeNode *p=G->adjlist[u].first;
        while(p != NULL){
            int v=p->adjvex;
            if(st[v]==0){
                printf("%c ", G->adjlist[v].vertex);
                st[v]=1; Q[++rear]=v;
            }
            p=p->next;
        }
    }
}
相关推荐
Kiling_070413 小时前
Java集合进阶:Set与Collections详解
算法·哈希算法
智者知已应修善业13 小时前
【51单片机89C51及74LS273、74LS244组成】2022-5-28
c++·经验分享·笔记·算法·51单片机
洛水水14 小时前
【力扣100题】33.验证二叉搜索树
算法·leetcode·职场和发展
SimpleLearingAI14 小时前
聚类算法详解
算法·数据挖掘·聚类
刀法如飞15 小时前
Go 字符串查找的 20 种实现方式,用不同思路解决问题
算法·面试·程序员
Dlrb121116 小时前
C语言-指针数组与数组指针
c语言·数据结构·算法·指针·数组指针·指针数组·二级指针
WL_Aurora16 小时前
Python 算法基础篇之集合
python·算法
平行侠17 小时前
A15 工业路由器IP前缀高速检索与内存压缩系统
网络·tcp/ip·算法
阿旭超级学得完18 小时前
C++11包装器(function和bind)
java·开发语言·c++·算法·哈希算法·散列表
li星野18 小时前
位运算 & 数学 & 高频进阶九题通关(Python + C++)
c++·python·学习·算法