织芜 2023-05-16 22:53 采纳率: 70.8%
浏览 25
已结题

C++无向图构造与深度优先遍历

遍历的时候只会出现1

#include<stdio.h>
#include<stdlib.h>

#define MAX_VERTEX_NUM 20

typedef int Infotype;
typedef int VertexType;

// 邻接表表示无向图
typedef struct ArcNode{
    int adjvex;
    struct ArcNode* nextarc;
    Infotype *info;
}ArcNode;
typedef struct VNode{
    VertexType data;
    ArcNode*firstarc;
}VNode,AdjList;
typedef struct{
    AdjList vertices[MAX_VERTEX_NUM];
    int vexnum,arcnum;
}UDG;
// 邻接表表示无向图

//构造无向图
void CreateUDG(UDG* udg){
    int vx,ac,dat;
    vx=0;
    ac=0;
    dat=0;
    printf("vexnum:");
    scanf("%d",&vx);
    udg->vexnum=vx;
    udg->arcnum=0;
    for(int i=0;i<vx;i++){
        udg->vertices[i].firstarc=NULL;
        printf("v%d:arcnum,data:",i);
        scanf("%d,%d",&ac,&dat);
        udg->vertices[i].data=dat;
        udg->arcnum+=ac;
        ArcNode* p;
        for(int j=0;j<ac;j++){
            p=(ArcNode*)malloc(sizeof(ArcNode));
            //输入边信息
            int adj,dat;
            printf("adjvex:");
            scanf("%d",&adj);
            p->adjvex=adj;
            p->nextarc=udg->vertices[i].firstarc;
            p->info=NULL;
            udg->vertices[i].firstarc=p;
        }
    }
    printf("Done!");
}
//构造无向图

//深度遍历无向图
void UDG_DFS_traverse(UDG udg,void(*visit)(VNode*)){ //可以换一个遍历函数
    void udg_dfs(UDG* udg,int v,int** visited,void(*visit)(VNode*));
    int visited[udg.vexnum];
    for(int i=0;i<udg.vexnum;i++){
        visited[i]=0;
    }
    for(int i=0;i<udg.vexnum;i++){
        if(visited[i]==0){
            udg_dfs(&udg.vertices[i],i,&visited,visit);
        }
    }
}

void udg_dfs(UDG* udg,int v,int** visited,void(*visit)(VNode*)){
    (*visit)(&udg->vertices[v]);
    *visited[v]=1;
    for(ArcNode* a=udg->vertices[v].firstarc;a;a=a->nextarc){
        if(*visited[a->adjvex]==0){
            udg_dfs(udg,a->adjvex,&visited,visit);
        }
    }
}

void traverse(VNode* v){
    printf("%d,",v->data);
}
//深度遍历无向图


int main(int argc,char** argv){
    UDG* udg=(UDG*)malloc(sizeof(UDG));
    CreateUDG(udg);
    UDG_DFS_traverse(*udg,traverse);
}
  • 写回答

1条回答 默认 最新

  • 深度学习客 2023-05-16 23:51
    关注
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
    
    #define MAX_VERTEX_NUM 20
    
    typedef int Infotype;
    typedef int VertexType;
    
    // 邻接表表示无向图
    typedef struct ArcNode {
        int adjvex;
        struct ArcNode* nextarc;
        Infotype* info;
    } ArcNode;
    
    typedef struct VNode {
        VertexType data;
        ArcNode* firstarc;
    } VNode;
    
    typedef struct {
        VNode vertices[MAX_VERTEX_NUM];
        int vexnum, arcnum;
    } UDG;
    
    //构造无向图
    void CreateUDG(UDG* udg) {
        size_t vx, ac;
        VertexType dat;
        printf("vexnum:");
        scanf("%zu", &vx);
        udg->vexnum = vx;
        udg->arcnum = 0;
        for (int i = 0; i < vx; i++) {
            udg->vertices[i].firstarc = NULL;
            printf("v%d:arcnum,data:", i);
            scanf("%zu,%d", &ac, &dat);
            udg->vertices[i].data = dat;
            udg->arcnum += ac;
            ArcNode* p;
            for (int j = 0; j < ac; j++) {
                p = (ArcNode*)malloc(sizeof(ArcNode));
                //输入边信息
                int adj;
                printf("adjvex:");
                scanf("%d", &adj);
                p->adjvex = adj;
                p->nextarc = udg->vertices[i].firstarc;
                p->info = NULL;
                udg->vertices[i].firstarc = p;
            }
        }
        printf("Done!\n");
    }
    
    //深度遍历无向图
    void UDG_DFS_traverse(UDG udg, void (*visit)(VertexType*)) {
        void udg_dfs(UDG* udg, int v, bool* visited, void (*visit)(VertexType*));
        bool visited[udg.vexnum];
        for (int i = 0; i < udg.vexnum; i++) {
            visited[i] = false;
        }
        for (int i = 0; i < udg.vexnum; i++) {
            if (!visited[i]) {
                udg_dfs(&udg, i, visited, visit);
            }
        }
    }
    
    void udg_dfs(UDG* udg, int v, bool* visited, void (*visit)(VertexType*)) {
        visit(&udg->vertices[v].data);
        visited[v] = true;
        for (ArcNode* a = udg->vertices[v].firstarc; a; a = a->nextarc) {
            if (!visited[a->adjvex]) {
                udg_dfs(udg, a->adjvex, visited, visit);
            }
        }
    }
    
    void traverse(VertexType* v) {
        printf("%d,", *v);
    }
    
    int main() {
        UDG udg;
        CreateUDG(&udg);
        UDG_DFS_traverse(udg, traverse);
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 5月28日
  • 已采纳回答 5月20日
  • 创建了问题 5月16日

悬赏问题

  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥20 spring boot集成mqtt的使用问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络
  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开
  • ¥30 crossover21 ARM64版本安装软件问题
  • ¥15 mymetaobjecthandler没有进入
  • ¥15 mmo能不能做客户端怪物