解题思路:


    尝试写了出来。


参考代码:


#include<stdio.h>
#include<malloc.h>

#define MAX_VEX_NUM 50
#define True 1
#define False 0

typedef struct AdjCell{
    int adj;
    //int *info;
} AdjCell, AdjMatrix[MAX_VEX_NUM][MAX_VEX_NUM];

typedef struct MGraph{
    int vexs[MAX_VEX_NUM];
    AdjMatrix arcs;
    int vexnum;
    //int arcnum;
} MGraph;

typedef struct CSNode{
    int data;
    struct CSNode *firstchild;
    struct CSNode *nextsibling;
} *CSTree, CSNode;

void CreateMGraph(MGraph *G);

void DFSForest(MGraph *G, CSTree *T);

void DFSTree(MGraph *G, CSTree *T, int i, int *visited);

void PreOrderTraverse(CSTree T);

int main()
{
    MGraph G;
    CSTree T = NULL;
    CreateMGraph(&G);
    DFSForest(&G, &T);
    return 0;
}

void CreateMGraph(MGraph *G){
    
    int i, j;
    
    scanf("%d", &G->vexnum);
    
    for(i = 0; i < G->vexnum; i++){
        
        G->vexs[i] = i;
    }
    
    for(i = 0; i < G->vexnum; i++){
        
        for(j = 0; j < G->vexnum; j++){
            
            scanf("%d", &G->arcs[i][j].adj);
        }
    }
}

void DFSForest(MGraph *G, CSTree *T){
    
    int visited[MAX_VEX_NUM] = { False };
    int i;
    CSNode *p = NULL, *q = NULL;
    
    for(i = 0; i < G->vexnum; i++){
        
        if(visited[i] == False){
            
            p = (CSNode *)malloc(sizeof(CSNode));
            p->data = G->vexs[i];
            p->firstchild = NULL;
            p->nextsibling = NULL;
            
            if(!(*T)){
                
                (*T) = p;
            }
            else{
                
                q->nextsibling = p;
            }
            
            q = p;
            DFSTree(G, &p, i, visited);
            PreOrderTraverse(p);
        }
    }
}

void DFSTree(MGraph *G, CSTree *T, int i, int *visited){
    
    visited[i] = True;
    int j, first = True;
    CSNode *p = NULL, *q = NULL;
    
    for(j = 0; j < G->vexnum; j++){
        
        if(G->arcs[i][j].adj == 1 && visited[j] == False){
            
            p = (CSNode *)malloc(sizeof(CSNode));
            p->data = j;
            p->firstchild = NULL;
            p->nextsibling = NULL;
            
            if(first == True){
                
                (*T)->firstchild = p;
                first = False;
            }
            else{
                
                q->nextsibling = p;
            }
            
            q = p;
            DFSTree(G, &p, j, visited);
        }
    }
}

void PreOrderTraverse(CSTree T){
    
    CSNode *stack[MAX_VEX_NUM];
    int top = -1;
    CSNode *p = T;
    
    while(p || top > -1){
        
        if(p){
            
            printf("%d ", p->data);
            stack[++top] = p;
            p = p->firstchild;
        }
        else{
            
            p = stack[top--];
            p = p->nextsibling;
        }
    }
    printf("\n");
}


点赞(1)
 

0.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论