图的深度优先搜索遍历之邻接表存储

紧接着上一篇,我们这次来探讨一下采用邻接表来存储的图的深度优先搜索遍历。
遍历方法还是与上一篇介绍的一样。
示例如下:
对此图进行遍历,图二是图一的对应顶点的字母,位置是一样的。
图一:
在这里插入图片描述图二:
在这里插入图片描述
图三:
在这里插入图片描述

#include<stdio.h>
#define maxvertex 20
typedef struct ArcNode{
    int adjvex;  //顶点对应的下标
    struct ArcNode *nextarc;
}ArcNode;
typedef struct VerNode{
    char data;
    ArcNode *firstarc;
}adjList[maxvertex];
typedef struct{
    adjList v;
    int vertex;  //顶点数
    int arc;  //边数
    int  visit[maxvertex]; //记录每个顶点是否被访问,0表示未被访问,1表示已被访问
}Graph;
void DFS_AL(int x,Graph *G)
{
    printf("%c\n",G->v[x].data);
    G->visit[x]=1;
    ArcNode *p;
    p=G->v[x].firstarc;
    while(p)
    {
        if(G->visit[p->adjvex]==0)
            DFS_AL(p->adjvex,G);
        p=p->nextarc;
    }

}
int main()
{
    Graph G;
    int v1,v2; //v1为边的开始顶点,v2为边的指向顶点
    printf("请输入顶点数和边数:");
    scanf("%d %d",&G.vertex,&G.arc);
    getchar();
    //初始化表头结点
    for(int i=0;i<G.vertex;i++)
    {
        printf("请输入%d号顶点",i);
        scanf("%c",&G.v[i].data);
        getchar();
        G.v[i].firstarc=NULL;
        G.visit[i]=0;
    }
    //生成邻接表
    for(int j=0;j<G.arc;j++)
    {
        printf("请输入边的序号(序号从0开始):");
        scanf("%d %d",&v1,&v2);
        ArcNode *p1,*q1;//生成边结点
        p1=(ArcNode *)malloc(sizeof(ArcNode));
        p1->adjvex=v2;
        p1->nextarc=NULL;
        if(!G.v[v1].firstarc)
            G.v[v1].firstarc=p1;
        else
        {
            q1=G.v[v1].firstarc;
            while(q1){

                if(!q1->nextarc)
                {
                     q1->nextarc=p1;
                     break;
                }
                q1=q1->nextarc;
            }

        }
        ArcNode *p2,*q2;//生成边结点
        p2=(ArcNode *)malloc(sizeof(ArcNode));
        q2=(ArcNode *)malloc(sizeof(ArcNode));
        p2->adjvex=v1;
        p2->nextarc=NULL;
        if(!G.v[v2].firstarc)
            G.v[v2].firstarc=p2;
        else
        {
            q2=G.v[v2].firstarc;
            while(q2){
                q2=q2->nextarc;
            }
            q2=p2;
        }
    }
    int x;
    printf("请输入开始顶点的编号:");
    scanf("%d",&x);
    DFS_AL(x,&G);

}


运行结果如下:
在这里插入图片描述

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值