The_be 2021-12-01 20:38 采纳率: 100%
浏览 42
已结题

关于图的邻接矩阵深度优先遍历问题

我写的深度优先遍历,看了半天也没找出错误,但是就是不能成功运行出来。

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#define MAX 32767
#define msize 20
#define T char
typedef struct Graph {
    int vertices;//最大顶点数
    int numver;//现有顶点数
    int numedg;//边数
    T *verlist;//顶点表
    int **edge;//矩阵表
    int weigth;//权值
    int *dis;//记录起点到顶点距离
    int *vis;//标记访问情况
    int* mark;//DFS标记
}Graph;

void inicial(Graph* g) {
    g->vertices = msize;
    g->numedg = g->numver =0;
    g->verlist = (T*)malloc(sizeof(T) * (g->vertices));
    g->edge = (int**)malloc(sizeof(int*) * g->vertices);
    g->dis = (int*)malloc(sizeof(int) * g->vertices);
    g->vis = (int*)malloc(sizeof(int) * g->vertices);
    g->mark = (int*)malloc(sizeof(int) * g->vertices);
    for (int i = 0; i < g->vertices; ++i) {
        g->edge[i] = (int*)malloc(sizeof(int) * g->vertices);
    }
    for (int i = 0; i < g->vertices; i++) {
        for (int j = 0; j < g->vertices; ++j) {
            g->edge[i][j] = MAX;
            if (i == j)
                g->edge[i][j] = 0;
                
        }
    }
    for (int i = 0; i < g->numver; i++) {
        g->mark[i] = false;
    }
}
int getarray(Graph* g, T v) {
    for (int i = 0; i < g->numver; ++i) {
        if (g->verlist[i] == v)
            return i;
    }
    return -1;
}
void addver(Graph* g, T v) {
    if (g->numver >= g->vertices)
        return;
    g->verlist[g->numver++] = v;
}
void addedg(Graph* g, T v1, T v2, int weight) {
    int p1 = getarray(g, v1);
    int p2 = getarray(g, v2);
    if (p1 == -1 || p2 == -1)
        return;
    if (g->edge[p1][p2]!=32767) 
        return;
    g->edge[p1][p2] = g->edge[p2][p1] = weight;
    g->numedg++;
}
void show(Graph* g) {
    for (int i = 0; i < g->numver; ++i) {
        printf("%c   ", g->verlist[i]);
    }
    printf("\n");
    for (int i = 0; i < g->numver; i++) {
        printf("%c  ", g->verlist[i]);
        for (int j = 0; j < g->numver; j++) {
            if(g->edge[i][j]==32767)
                printf("∞  ");
            else {
                printf("%d  ", g->edge[i][j]);
            }
            
        }
        printf("\n");
    }
    printf("\n");
}
void DFS(Graph *g,int ver) {
    //int p1 = getarray(g, ver);
    printf("%c\t", g->verlist[ver]);
    printf("%d", g->numver);
    //g->mark[ver] = 1;
    for (int i = 0; i < g->numver; i++) {
        if (g->edge[ver][i] != 0 && g->edge[ver][i]!=MAX&& !g->mark[i]) {
            g->mark[i] = true;
            DFS(g, i);
        }
    }

}
void Dijkstra(Graph* g, T start, T end) {
    int p;//下一个点的下标
    int p1 = getarray(g, start);
    int p2 = getarray(g, end);
    
    for (int i = 0; i < g->numver; i++) {
        g->vis[i] = 0;
        g->dis[i] = g->edge[p1][i];
    }
    g->vis[p1] = 1;//标记源点
    for (int k = 0; k < g->numver; k++) {
        int min = 100;
        for (int i = 0; i < g->numver; i++) {
            if (g->vis[i] == 0 && MAX > g->dis[i]) {
                min = MAX;
                p = i;
            
            }
        }
        g->vis[p] = 1;
        for (int i = 0; i < g->numver; i++) {
            if (!g->vis[i] && g->dis[i] > g->dis[p] + g->edge[p][i]) {
                g->dis[i] = g->dis[p] + g->edge[p][i];
            }
        }
    }
    //printf("%c", g->verlist[p2]);
    printf("%d", g->dis[p2]);
}
int main() {
    Graph G;
    inicial(&G);
    addver(&G,'a');
    addver(&G, 'b');
    addver(&G, 'c');
    addver(&G, 'd');
    addver(&G, 'e');
    addedg(&G, 'a', 'b', 10);
    addedg(&G, 'a', 'd', 5);
    addedg(&G, 'b', 'd', 3);
    addedg(&G, 'c', 'e', 9);
    addedg(&G, 'a', 'c', 4);
    show(&G);
    addver(&G, 'f');
    addedg(&G, 'd', 'f', 7);
    printf("--------");
    printf("\n");
    show(&G);
    Dijkstra(&G, 'a', 'b');
    Dijkstra(&G, 'b', 'c');
    printf("--------");
    G.mark[1] = true;
    DFS(&G,1);
}

希望各位能帮我看看哪里出错了,并帮我解决一下,还有就是能否告知一下,如果用我定义的图怎么实现广度优先遍历。

  • 写回答

1条回答 默认 最新

  • 有问必答小助手 2021-12-03 09:57
    关注

    你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答


    本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。


    因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。

    评论

报告相同问题?

问题事件

  • 系统已结题 12月9日
  • 创建了问题 12月1日

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog