第五章 图论 邻接表存图

邻接表存图

存储结构

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;
        }
    }
}
相关推荐
小郎君6582 小时前
Vue 多标签页的加载态设计:为什么我没有用 Suspense 实现 PageLoading
vue.js·算法
JJJennie7772 小时前
MAI Gateway私有化部署全攻略:大模型网关如何接入?附架构图
算法·gateway·ai网关·魔芋ai
東隅已逝,桑榆非晚2 小时前
算法3.双指针法-快乐数
c++·笔记·学习·算法
专注仿真3 小时前
卷积神经网络(CNN)算法详解
人工智能·python·算法·代码·大模型训练
FII工业富联科技服务3 小时前
多智能体如何进入制造现场?从业务协同到数字孪生验证
大数据·人工智能·算法·机器人·制造·数字孪生
≮傷£≯√3 小时前
httpserver_QNetWorkClient
算法
Evand J3 小时前
【PMSM例程11】永磁同步电机(PMSM)基于UKF的转速与转子位置估计。附下载链接
算法·matlab·卡尔曼滤波·永磁同步电机·ukf·pmsm·位置估计
货拉拉技术3 小时前
记忆即智能:重构对话式AI Agent认知基座的四层渐进式记忆与自进化系统
人工智能·算法
杜 硕3 小时前
从零开始的C++生活——第六讲——02
c++·算法·生活
小超人诞生日记3 小时前
C++ STL 反向迭代器:从源码框架到适配器实现
c++·算法