深度优先遍历

定义:

在这里插入图片描述

下面我们以无向图来演示一遍:

在这里插入图片描述

注意:上图最后输出序列为:abcdef

代码如下:

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

//深度优先遍历
#define max 20

//这里我们讨论的是无向图
//定义邻接表的边链表
typedef struct Edge{
    char data;
    struct Edge * nextEdge;   
}EDGE;

//定义邻接表的顶点集
typedef struct Vertex{
    char data;
    EDGE * first;
}VERTEX;

//定义一个邻接表,其是由一个顶点集和每个顶点所连接的边链表组成
typedef struct {
    VERTEX list[max];
    int vertex;             //顶点个数
    int edge;               //边的个数
}AdList;

void init_AdList(AdList * );
void DFS(AdList * ,bool * ,int );
void DFStraverse(AdList * );
int main(){
    AdList G;
    init_AdList(&G);
    DFStraverse(&G);
    return 0;
}

//初始化一个邻接表
void init_AdList(AdList * pG){
    int i,j,k;
    printf("请输入图的顶点个数:\n");
    scanf("%d",&pG->vertex);
    printf("请输入图的边数:\n");
    scanf("%d",&pG->edge);
    for(i=0;i<pG->vertex;++i){              //这个for循环是初始化顶点集的(即给顶点集中的data赋初值,以及将其first域赋为NULL)
        printf("请输入各顶点值:");
        setbuf(stdin,NULL);                 //清楚缓冲区内的多余空格
        scanf("%c",&pG->list[i].data);
        pG->list[i].first=NULL;
    }
    for(j=0;j<pG->vertex;++j){            //这个for循环是给每个顶点后添加其邻边节点的
        int n;
        printf("请输入%c的邻接点的个数:\n",pG->list[j].data);
        scanf("%d",&n);
        if(n!=0){
            for(k=0;k<n;++k){
                EDGE * pTail;
                if(k==0){                //插入首节点
                    int val;             //这里要注意的是插入第一个邻边节点和插入后面节点操作是不一样的,所以需要分开讨论                   
                    EDGE * pNew=(EDGE *)malloc(sizeof(EDGE));
                    printf("请输入其邻接点在邻接表中的位置:\n");
                    scanf("%d",&val);
                    pG->list[j].first=pNew;
                    pNew->data=val;
                    pNew->nextEdge=NULL;
                    pTail=pNew;
                }
                else{                     //插入非首节点的操作
                    int val;
                    EDGE * pNew=(EDGE *)malloc(sizeof(EDGE));
                    printf("请输入其邻接点在邻接表中的位置:\n");
                    scanf("%d",&val);
                    pTail->nextEdge=pNew;
                    pNew->data=val;
                    pNew->nextEdge=NULL;
                    pTail=pNew;
                }
            }  
        }
    }
}

//深度优先遍历
void DFStraverse(AdList * pG){
    int i;
    bool Visted[max];
    for(i=0;i<pG->vertex;++i){          //初始化一个标志数组Visted[],并将其全部赋值为false;
        Visted[i]=false;
    }
    for(i=0;i<pG->vertex;++i){          //从顶点集中的第一个位置开始DFS查询
        if(!Visted[i]) {
            DFS(pG,Visted,i);
        }
    }
}

void DFS(AdList * pG,bool * Visted,int n){  
    Visted[n]=true;
    printf("%c",pG->list[n].data);
    EDGE * p=pG->list[i].first;			//p永远指向顶点的第一个邻接点
    while(p){                           //如果p所指节点被访问过,则p就会指向其后一个邻接点.如果p所指节点没有被访问过,则对该节点DFS遍历
        if(!Visted[p->data]) DFS(pG,Visted,p->data);
        else p=p->nextEdge;   
    }
}

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值