邻接矩阵存储图的深度优先遍历

本文介绍了如何使用深度优先搜索(DFS)算法遍历图,从顶点V开始,通过递归方式访问邻接节点,并使用邻接矩阵和邻接表数据结构。给出了C语言实现的示例代码,包括创建、显示和销毁邻接表的方法以及DFS的具体步骤。
摘要由CSDN通过智能技术生成

bde5fbe3ec5c499abe3e846c162fcb66.pngc8d204fd3161407d859f8d831a7e4d78.png

/*
  * 从顶点V出发进行深度优先搜索。
  * 函数DFS应从编号为V的顶点出发递归地深度优先遍历图,
  * 遍历访问邻接点时,要求按序号递增的顺序。
  * 题目保证V是图中的合法顶点。
  * 参数G为邻接矩阵存储的图的表示。
  */
 void DFS(MatGraph * G, VertexType V) {
   /**
    * 请在下面的begin..end间编写程序代码,
    * 勿修改begin..end之外的代码。
    */
   /*******************begin*******************/
   visited[V] = 1; //将顶点 V 的访问标志置为 1 
   printf(" %d",V);
   for (int j = 0; j < G->n; j++) //对其他所有顶点 j 
   {
     //j 是 i 的邻接顶点,且顶点 j 没有访问过
     if (G->edges[V][j] == 1 && !visited[j]) {
       //递归搜索前的准备工作需要在这里写代码 
       DFS(G,j); //从顶点 j 出发进行 DFS 搜索
       //以下是 DFS 的回退位置,在很多应用中需要在这里写代码  
     }
   }

   /*******************end********************/
 }

两个都是期末考试题 

#include "graph.h"
#include <stdio.h>
#include <stdlib.h>
void CreateAdj(AdjGraph *&G,int A[MAXV][MAXV],int n,int e)  //创建图的邻接表
{
    int i,j;
    ArcNode *p;
    G=(AdjGraph *)malloc(sizeof(AdjGraph));
    for(i=0;i<n;i++)                                        //给邻接表的头元素的指针域置初值
    {
        G->adjlist[i].firstarc=NULL;
    }
    for(i=0;i<n;i++)                                        //检查邻接表的每个元素
    {
        for(j=n-1;j>=0;j--)
        {
            if(A[i][j]!=0&&A[i][j]!=INF)                    //存在一条边
            {
                p=(ArcNode *)malloc(sizeof(ArcNode));       //创建一个结点p
                p->adjvex=j;                                //存放邻接点
                p->weight=A[i][j];                          //存放权
                p->nextarc=G->adjlist[i].firstarc;          //采用头插法插入结点p
                G->adjlist[i].firstarc=p;
            }
        }
    }
    G->n=n;
    G->e=e;
}
void DispAdj(AdjGraph *G)
{
    int i;
    ArcNode *p;
    for(i=0;i<G->n;i++)
    {
        p=G->adjlist[i].firstarc;
        printf("%3d: ",i);
        while(p!=NULL)
        {
            printf("%d[%d]→",p->adjvex,p->weight);
            p=p->nextarc;
        }
        printf("^\n");
    }
}
void DestroyAdj(AdjGraph *&G)
{
    int i;
    ArcNode *pre,*p;
    for(i=0;i<G->n;i++)                 //扫描所有单链表
    {
        pre=G->adjlist[i].firstarc;     //p指向第i个单链表的头结点
        if(pre!=NULL)
        {
            p=pre->nextarc;
            while(p!=NULL)              //释放第i个单链表的所有结点
            {
                free(pre);
                pre=p;
                p=p->nextarc;
            }
            free(pre);
        }
    }
    free(G);
}
//深度优先遍历
int visited[MAXV];                //全局数组,记录访问的点
void DFS(AdjGraph *G,int v)
{
    /********** Begin **********/
     ArcNode *p;
     visited[v]=1;
     printf("%3d",v);
     p=G->adjlist[v].firstarc;
     while(p!=NULL){
         if(visited[p->adjvex]==0)
            DFS(G,p->adjvex);
         p=p->nextarc;    
     }
    /********** End **********/
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值