图:邻接矩阵的创建、深度优先遍历、广度优先遍历

要注意 visit[] 数组更新的位置,放在if内,如果放在出队时才更新,后面for会把关键字重复入队,所以更新 visit[] 的时机为入队前

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define  maxSize 30
typedef char Elemtype;
typedef struct MGraph{
    Elemtype vex[maxSize];
    int arg[maxSize][maxSize];
    int num_vex,num_arg;
}MGraph,*MyGraph;

void createMGraph(MGraph *mgraph){
    if(!mgraph) return;
    Elemtype v;
    int i=0,j,p,q;
    mgraph->num_arg=0;
    mgraph->num_vex=0;
    while(scanf("%c",&v)){
        if(v!='#'){
            mgraph->vex[i++]=v;
            mgraph->num_vex++;
        }else{
            break;
        }
    }
    for(i=0;i<mgraph->num_vex;i++){
        for(j=0;j<mgraph->num_vex;j++){
            mgraph->arg[i][j]=0;
        }
    }

    while(1){
        scanf("%d,%d",&p,&q);
        getchar();
        if(p!=-1 && q!=-1){
            mgraph->arg[p][q]=1;
            mgraph->arg[q][p]=1;
            mgraph->num_arg++;
        }else{
            break;
        }
    }

}

void printMGraph(MGraph *mgraph){
    int i,j;
    printf("graph:\n");
    for(i=0;i<mgraph->num_vex;i++){
        for(j=0;j<mgraph->num_vex;j++){
            printf("%d ",mgraph->arg[i][j]);
        }
        printf("\n");
    }
    //printf("%d,%d\n",mgraph->num_vex,mgraph->num_arg);
}

void DFS(MGraph *mgraph,int vex_start,int visit[]){
    int i;
    visit[vex_start]=1;
    printf("%c",mgraph->vex[vex_start]);
    for(i=0;i<mgraph->num_vex;i++){
        if(mgraph->arg[vex_start][i]==1 && visit[i]==0){
            DFS(mgraph,i,visit);
        }
    }
}

void BFS(MGraph *mgraph,int vex_start){
    int Queue[mgraph->num_vex],front=0,rear=0,temp;
    int visit[mgraph->num_vex],i=0;
    while(i<mgraph->num_vex){
        visit[i]=0;
        Queue[i++]=0;
    }
    visit[vex_start]=1;
    rear=(rear+1)%mgraph->num_vex;
    Queue[rear]=vex_start;
    while(front!=rear){
        front=(front+1)%mgraph->num_vex;
        temp=Queue[front];
        Queue[front]=0;
        printf("%c",mgraph->vex[temp]);
        for(i=0;i<mgraph->num_vex;i++){
            if(visit[i]==0 && mgraph->arg[temp][i]==1){
                visit[i]=1;//***
                rear=(rear+1)%mgraph->num_vex;
                Queue[rear]=i;
            }
        }
//        //打印队列
//        int j=0;
//        while(j<mgraph->num_vex){
//            printf("%d",Queue[j++]);
//        }
//        printf("\n");
    }

}

int main(){
    MGraph *mgraph = (MGraph*)malloc(sizeof(MGraph));
    createMGraph(mgraph);
    printMGraph(mgraph);

    //DFS
    printf("dfs:");
    int vex_start;
    scanf("%d",&vex_start);
    int visit[mgraph->num_vex];
    int i=0;
    while(i<mgraph->num_vex)
        visit[i++]=0;
    DFS(mgraph,vex_start,visit);
    printf("\n");

    //BFS
    printf("bfs:");
    BFS(mgraph,vex_start);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值