《数据结构教程》(第5版)李春葆 学习笔记(七)

**

图的一些基本运算算法以及DFS,BFS

#include <iostream>
#include<cstdlib>
#include<queue>

using namespace std;
const int MAXV=5;
const int INF=32767;

//边结点的类型 
typedef struct ANode{
    int adjvex;
    struct ANode *nextarc;
    int weight;
}ArcNode;

//邻接表的头结点类型 
typedef struct Vnode{
    ArcNode *firstarc; 
}VNode;

//完整的图邻接表类型 
typedef struct{
    VNode adjlist[MAXV];
    int n,e;
}AdjGraph;

 //创建图的运算算法 
void CreateAdj(AdjGraph *&G,int A[][MAXV],int n,int e){
    ArcNode *p;
    G=(AdjGraph*)malloc(sizeof(AdjGraph));
    for(int i=0;i<n;i++)G->adjlist[i].firstarc=NULL;
    for(int i=0;i<n;i++){
        for(int j=n-1;j>=0;j--){
            if(A[i][j]!=0&&A[i][j]!=INF){
                p=(ArcNode*)malloc(sizeof(ArcNode));
                p->adjvex=j;
                p->weight=A[i][j];
                p->nextarc=G->adjlist[i].firstarc;
                G->adjlist[i].firstarc=p;
            }
        }
    }
    G->e=G->n=n;
}

//输出图的运算算法 
void DispAdj(AdjGraph *G){
    ArcNode *p;
    for(int i=0;i<G->n;i++){
        p=G->adjlist[i].firstarc;
        cout<<i<<"  ";
        for(;p!=NULL;p=p->nextarc){cout<<"("<<p->adjvex<<","<<p->weight<<")";}
        cout<<endl;
    }
}

//销毁图的运算算法 
void DestroyAdj(AdjGraph *&G){
    ArcNode *pre,*p;
    for(int i=0;i<G->n;i++){
        pre=G->adjlist[i].firstarc;
        if(pre!=NULL){
            for(p=pre->nextarc;p!=NULL;pre=p,p=p->nextarc)free(pre);    
            free(pre);
        }
    }
    free(G);
}

//深度优先遍历 
int visited[MAXV]={0};
void DFS(AdjGraph *G,int v){
    visited[v]=1;
    cout<<v<<" ";
    for(ArcNode *p=G->adjlist[v].firstarc;p!=NULL;p=p->nextarc){
        if(visited[p->adjvex]==0){
            DFS(G,p->adjvex);
        }
    }
}

//广度优先遍历 
int visited1[MAXV]={0};
queue<int>q;
void BFS(AdjGraph *G,int v){
    visited1[v]=1;
    cout<<v<<" ";
    q.push(v);
    while(!q.empty()){
        int w=q.front();
        q.pop();
        for(ArcNode *p=G->adjlist[w].firstarc;p!=NULL;p=p->nextarc){
            if(visited1[p->adjvex]==0){
                cout<<p->adjvex<<" ";
                visited1[p->adjvex]=1;
                q.push(p->adjvex);
            }
        }
    }
}

int main() {
    int A[5][5]={0,8,INF,5,INF,
               INF,0,3,INF,INF,
               INF,INF,0,INF,6,
               INF,INF,9,0,INF,
               INF,INF,INF,INF,0
               };
     AdjGraph *G;          
     CreateAdj(G,A,5,5);
     DispAdj(G);
    // DFS(G,0);
    BFS(G,0);
     DestroyAdj(G);            
    return 0;
}

不妥之处,请多多指教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值