图的深度遍历算法

问题描述:
输入:
建立图的存储结构:顶点和边(弧),例:无向图G的顶点V={A,B,C,D,E,F,G,H},边E={(A,B),(A,C),(B,D),(B,E),(C,F),(C,G),(D,H),(E,H),(F,G)}(G具有8个顶点和9条边)
输出:
深度优先遍历的顶点序列(按照存储结构):A,B,D,H,E,C,F,G(或者其它的不同顺序的序列)`
c语言实现代码:

#include <stdio.h>
    #define Max 10
    typedef char VertexType;
typedef int EdgeType;
typedef struct 
{
VertexType vexs[Max]; // 顶点信息
    EdgeType edges[Max][Max];//边和弧的信息
    int n;  //当前图顶点数
    int e;  //当前边数
}MGraph;

void createGraph(MGraph *G){//创建图
    int i,j,n,e,a,la,k;
    char ex;
    printf("请输入图的顶点数(小于10):\n");
    scanf("%d",&n); 
    G->n=n;
    printf("请输入所有顶点的信息(如:a b):\n");
    getchar();
    for(i=0;i<n;i++){
    scanf("%c",&G->vexs[i]);
    getchar();  
    } 
    printf("请输入图的边数:");
    scanf("%d",&e);
    G->e=e;
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            //printf("%c和%c:",G->vexs[i],G->vexs[j]); 
        //  scanf("%d",&a);
        G->edges[i][j]=0;
        }

    }
    printf("请输入边的信息(若两点相连就输入 1):\n");
    for(i=0;i<n;i++){
            printf("%c和几个点相连请输入:",G->vexs[i]); 
        scanf("%d",&la);
            printf("%c和哪些点相连请输入(如:a b):",G->vexs[i]);
            getchar();
        for(k=0;k<la;k++){
            scanf("%c",&ex);
            getchar();
        G->edges[i][ex-'a']=1;
        }
    }

}
void prinG(MGraph *G){//输出矩阵
    int i,j;
    for(i=0;i<G->n;i++){
        printf("  %c",G->vexs[i]);
    }
printf("\n");
    for(i=0;i<G->n;i++){
        printf("%c",G->vexs[i]);
        for(j=0;j<G->n;j++){
            printf("  %d",G->edges[i][j]);
        }
        printf("\n");
    }
}
void DFT(MGraph *G,int visited[]){   //深度遍历
        int i;
        for(i=0;i<G->n;i++){  
                DFTcore(G,i,visited);  
        }  
        printf("\n");  
}  
int DFTcore(MGraph *G,int i,int visited[]){ //递归查找
        int j; 
        if(visited[i] == 1){  
                return;  
        }  
        printf("%c ",G->vexs[i]);  
        visited[i] =1;   
        for(j=0;j<G->n;j++){  
                if(G->edges[i][j]==1){  
                        DFTcore(G,j,visited);  
                }  
        }  
}
int main(){
    MGraph G;
    int visited[Max]={0};
    createGraph(&G);
    prinG(&G);
    printf("进行深度遍历:");
    DFT(&G,&visited);
    return 0;
}


这里写图片描述

这里写图片描述

代码用作自己储存,同时希望对你有帮助

2. 系统设计 1.用到的抽象数据类型的定义 的抽象数据类型定义: ADT Graph{ 数据对象V:V是具有相同特性的数据元素的集合,称为顶点集 数据关系R: R={VR} VR={<v,w>|v,w∈V且P(v,w),<v,w>表示从v到w的弧, 谓词P(v,w)定义了弧<v,w>的意义或信息} 基本操作P: CreatGraph(&G,V,VR) 初始条件:V是的顶点集,VR是中弧的集合 操作结果:按V和VR的定义构造G DestroyGraph(&G) 初始条件:G存在 操作结果:销毁G InsertVex(&G,v) 初始条件:G存在,v和中顶点有相同特征 操作结果:在G中增添新顶点v …… InsertArc(&G,v,w) 初始条件:G存在,v和w是G中两个顶点 操作结果:在G中增添弧<v,w>,若G是无向的则还增添对称弧<w,v> …… DFSTraverse(G,Visit()) 初始条件:G存在,Visit是顶点的应用函数 操作结果:对进行深度优先遍历,在遍历过程中对每个顶点调用函数Visit一次且仅一次。一旦Visit()失败,则操作失败 BFSTraverse(G,Visit()) 初始条件:G存在,Visit是顶点的应用函数 操作结果:对进行广度优先遍历,在遍历过程中对每个顶点调用函数Visit一次且仅一次。一旦Visit()失败,则操作失败 }ADT Graph 栈的抽象数据类型定义: ADT Stack{ 数据对象:D={ai|ai∈ElemSet,i=1,2,…,n,n≥0} 数据关系:R1={<ai-1,ai>|ai-1,ai∈D,i=2,…,n} 约定an端为栈顶,ai端为栈底 基本操作: InitStack(&S) 操作结果:构造一个空栈S DestroyStack(&S) 初始条件:栈S已存在 操作结果:将S清为空栈 StackEmpty(S) 初始条件:栈S已存在 操作结果:若栈S为空栈,则返回TRUE,否则FALSE …… Push(&S,e) 初始条件:栈S已存在 操作结果:插入元素e为新的栈顶元素 Pop(&S,&e) 初始条件:栈S已存在且非空 操作结果:删除S的栈顶元素,并用e返回其值 StackTraverse(S,visit()) 初始条件:栈S已存在且非空 操作结果:从栈底到栈顶依次对S的每个数据元素调用函数visit(),一旦visit()失败,则操作失效 }ADT Stack 队列的抽象数据类型定义: ADT Queue{ 数据对象:D={ai|ai∈ElemSet,i=1,2,…,n,n≥0} 数据关系:Rl={<ai-1,ai>|ai-1,ai∈D,i=2,…,n} 约定其中ai端为队列头,an端为队列尾。 基本操作: InitQueue(&Q) 操作结果:构造一个空队列Q DestroyQueue(&Q) 初始条件:队列Q已存在 操作结果:队列Q被销毁,不再存在 QueueEmpty(Q) 初始条件:队列Q已存在 操作结果:若Q为空队列,则返回TRUE,否则FALSE …… EnQueue(&Q,e) 初始条件:队列Q已存在 操作结果:插入元素e为Q的新的队尾元素 DeQueue(&Q,&e) 初始条件:Q为非空队列 操作结果:删除Q的队头元素,并用e返回其值 }ADT Queue 2.主程序的流程: 调用CreateDN函数创建的邻接表G; 调用PrintDN函数输出邻接表G; 调用DFSTraverse函数深度优先遍历; 调用BFSTraverse函数广度优先遍历
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值