有向图的创建、求度、遍历

题目描述

从键盘接收有向图的顶点集,弧集,创建有向图,并完成下列任务:

(1)计算结点的出度、入度以及度;

(2) 从第一个顶点出发,求一个深度优先遍历序列;

(3) 从第一个顶点顶点出发,求一个广度优先遍历序列。

注意:以用户输入各个顶点的顺序为顶点的序号。

在深度和广度优先遍历中,优先选择序号小的顶点。

图的领结矩阵的数据类型描述如下

#define MAX 20  // 最大顶点个数
typedef struct {
int arcs[MAX][MAX];   //边信息
int visit[MAX];   //顶点信息
char vex[MAX]; 
int vexnum;    //顶点数目
int arcnum;    //边数目
}AdjMatrix;    //领接矩阵

用邻结矩阵创建无向网

void Creat(AdjMatrix * x) {
    int i,  j , k, vex1, vex2;
    char Vex1,Vex2;
    scanf("%d %d",&x->vexnum, &x->arcnum);
    getchar();
    //printf("%d %d\n",x->vexnum, x->arcnum);
    for (i = 1; i <= x->vexnum; i++) {
        for (j = 1; j <= x->vexnum; j++ ) {
            x->arcs[i][j] = 0;
        }
    }
    
    for(i = 1; i <= x->vexnum; i++){
        scanf("%c",&x->vex[i]);
    }
    //    for(i = 1; i <= x->vexnum; i++){
    //    printf("%c",x->vex[i]);
    //    }
    getchar();
    for( i = 0; i< x-> arcnum; i++) {
        scanf("%c%c",&Vex1,&Vex2);
        vex1 = Vex1 - 64;
        vex2 = Vex2 - 64;
        getchar();
        x->arcs[vex1][vex2] = 1;
    }
    }

深度优先搜索

void dfs(AdjMatrix * x,int x1) {
    printf("%c",x->vex[x1]);
    x->visit[x1] = 1;
    for(int i = 1; i <= x->vexnum; i++) {
        if(!x->visit[i]&&x->arcs[x1][i] == 1)
            dfs(x,i);
    }
}

广度优先搜索

int FirstAdj(AdjMatrix *G,int Vo){
    for(int i = 1;i<=G->vexnum;i++){
        if(G->arcs[Vo][i]==1&&G->visit[i]!=1){
            return i;
        }
    }
    return -1;
}

int NextAdj(AdjMatrix *G,int Vo,int w){
    for(int i = w+1;i<=G->vexnum;i++){
        if(G->arcs[Vo][i]==1&&G->visit[i]!=1){
            return i;
        }
    }
    return -1;
}

void BFS(AdjMatrix *G,int Vo){
	    /*类似于层次遍历*/
	    printf("%c",G->vex[Vo]);
	    G->visit[Vo]= 1;
	    Queue *Q = (Queue *)malloc(sizeof(Queue));
	    Q->front = 0;
	    Q->rear = 0;
	    Q->front++;
	    Q->vex[Q->front] =Vo;
	    while(Q->front-Q->rear!=0){
	        Vo = Q->vex[Q->front];
	        Q->rear++;
	        int w = FirstAdj(G,Vo);
	        while(w!=-1){
	            if(!G->visit[w]){
	                printf("%c",G->vex[w]);
	                G->visit[w] = 1;
	                Q->front++;
	                Q->vex[Q->front] = w;
	            }
	            w = NextAdj(G,Vo,w);
	        }
	    }
	}

完整代码

#include <stdio.h>
#include<stdio.h>
#include<stdlib.h>
#define MAX 20
typedef struct SqStack{
    int vex[MAX];
    int front;
    int rear;
}Queue;
typedef struct {
    int arcs[MAX][MAX];
    int visit[MAX];
    char vex[MAX];
    int vexnum;
    int arcnum;
}AdjMatrix;
void Creat(AdjMatrix * x) {
    int i, j , k, vex1, vex2;
    char Vex1,Vex2;
    scanf("%d %d",&x->vexnum, &x->arcnum);
    getchar();
    //printf("%d %d\n",x->vexnum, x->arcnum);
    for (i = 1; i <= x->vexnum; i++) {
        for (j = 1; j <= x->vexnum; j++ ) {
            x->arcs[i][j] = 0;
        }
    }
    
    for(i = 1; i <= x->vexnum; i++){
        scanf("%c",&x->vex[i]);
    }
    //    for(i = 1; i <= x->vexnum; i++){
    //    printf("%c",x->vex[i]);
    //    }
    getchar();
    for( i = 0; i< x-> arcnum; i++) {
        scanf("%c%c",&Vex1,&Vex2);
        vex1 = Vex1 - 64;
        vex2 = Vex2 - 64;
        getchar();
        x->arcs[vex1][vex2] = 1;
    }
    
}
void initialise(AdjMatrix *G){
    for(int i = G->vexnum;i>=1;i--){
        G->visit[i] = 0;
    }
}
void dfs(AdjMatrix * x,int x1) {
    printf("%c",x->vex[x1]);
    x->visit[x1] = 1;
    for(int i = 1; i <= x->vexnum; i++) {
        if(!x->visit[i]&&x->arcs[x1][i] == 1)
            dfs(x,i);
    }
}
int FirstAdj(AdjMatrix *G,int Vo){
    for(int i = 1;i<=G->vexnum;i++){
        if(G->arcs[Vo][i]==1&&G->visit[i]!=1){
            return i;
        }
    }
    return -1;
}

int NextAdj(AdjMatrix *G,int Vo,int w){
    for(int i = w+1;i<=G->vexnum;i++){
        if(G->arcs[Vo][i]==1&&G->visit[i]!=1){
            return i;
        }
    }
    return -1;
}

void BFS(AdjMatrix *G,int Vo){
    /*类似于层次遍历*/
    printf("%c",G->vex[Vo]);
    G->visit[Vo]= 1;
    Queue *Q = (Queue *)malloc(sizeof(Queue));
    Q->front = 0;
    Q->rear = 0;
    Q->front++;
    Q->vex[Q->front] =Vo;
    while(Q->front-Q->rear!=0){
        Vo = Q->vex[Q->front];
        Q->rear++;
        int w = FirstAdj(G,Vo);
        while(w!=-1){
            if(!G->visit[w]){
                printf("%c",G->vex[w]);
                G->visit[w] = 1;
                Q->front++;
                Q->vex[Q->front] = w;
            }
            w = NextAdj(G,Vo,w);
        }
    }
}

int main(void) {
    AdjMatrix * x = (AdjMatrix*)malloc(sizeof(AdjMatrix));
    Creat(x);
    int in[MAX];
    int on[MAX];
    for (int i = 0; i <= x->vexnum; i++) {
        int cnt = 0 ,cnt1 = 0;
        for (int j = 0; j <= x->vexnum; j++){
            if (x->arcs[i][j] == 1) {
                cnt++;
            }
            if (x->arcs[j][i] == 1) {
                cnt1++;
            }
        }
        on[i] = cnt;
        in[i] = cnt1;
        
    }
    for(int i = 1; i <= x->vexnum; i++){
        printf("%c %d %d %d\n",x->vex[i],on[i],in[i],in[i]+on[i]);
    }
    initialise(x);
    dfs(x,1);
    printf("\n");
    initialise(x);
    BFS(x,1);
}
发布了34 篇原创文章 · 获赞 4 · 访问量 716

猜你喜欢

转载自blog.csdn.net/weixin_44824650/article/details/103441288