顺序存储结构的DFS

不同的存储结构所采用的实现方法有所区别,这里优先理解思想

后续会更新具体实现图以及实现方法

 

 

以下是实现代码

 

复制代码
#include<stdio.h>

#define NumOfVertex 200
#define VertexType int


int visited[NumOfVertex];

typedef enum{Digraph,Undigraph,DirectedNet,UndirectedNet}GraphKind;

typedef struct{
    int relation;   //无权图用01表示是否相连接   网直接表示权重 
    //Info;
}rlt,rltionMatrix[NumOfVertex][NumOfVertex];

typedef struct{
    VertexType Vex[NumOfVertex];  //存顶点 
    int NumOfVex,NumOfArc;            //存顶点和边的数量 
    rltionMatrix Matrix;             // 矩阵 
    GraphKind kind;                //图的类型 
}MyGraph;

//定位顶点在表中位置 
int LocateVex(MyGraph*g,VertexType v){
    for(int i = 0;i<g->NumOfVex;i++){
        if(g->Vex[i]==v)
        return i;
    }
    
    printf("None");
    return -1;
}

//创建有向图 
void CreatDG(MyGraph *g){
    int VNum,ANum;
    scanf("%d %d",&(g->NumOfVex),&(g->NumOfArc));
    
    //存顶点数据
    for(int i =0;i<g->NumOfVex;i++)
    scanf("%d",&(g->Vex[i]));
    
    //printf("RUN HERE");
    //初始化矩阵全置为0
    for(int i =0;i<g->NumOfVex;i++)
        for(int j = 0;j<g->NumOfVex;j++)
            {
                g->Matrix[i][j].relation=0;
                //info
             } 
             

    //构造矩阵
    for(int i = 0;i<g->NumOfArc;i++)
    {
        int v1,v2;
        scanf("%d %d", &v1, &v2);
        int pos1 = LocateVex(g,v1);
        int pos2 = LocateVex(g,v2);
        
        if(pos1==-1||pos2==-1)
        return;
        else
        g->Matrix[pos1][pos2].relation=1;
        ////无向图的二阶矩阵沿主对角线对称
        //网读入权存入矩阵 
                 }             
     
}

//void CreateGraph(MyGraph* G) {
//    //选择图的类型
//    scanf("%d", &(G->kind));
//    //根据所选类型,调用不同的函数实现构造图的功能
//    switch (G->kind) {
//    case DG:
//        return CreateDG(G);
//        break;
//    case DN:
//        return CreateDN(G);
//        break;
//    case UDG:
//        return CreateUDG(G);
//        break;
//    case UDN:
//        return CreateUDN(G);
//        break;
//    default:
//        break;
//    }
//}

void printG(MyGraph *g){
    
    for (int i = 0;i<g->NumOfVex;i++){
        
    
        for(int j = 0;j<g->NumOfVex;j++)
            {
                printf(" %d ",g->Matrix[i][j].relation);
                
            }
            printf("\n");
        }
}


//DFS
int  FindFirstAdjVex(MyGraph *g,int v){    //寻找第一个相邻结点 
    
for(int i = 0;i<g->NumOfVex;i++){
    if(g->Matrix[v][i].relation){
        return i;
    }
}    
        return -1;   //未找到返回-1 
    
}


int FineNext(MyGraph *g,int v,int now)    //对于数组下标 v 处的顶点,从 now 位置开始继续查找和它相邻的顶点,并返回该顶点的数组下标
{
    for(int i = now+1;i<g->NumOfVex;i++){
        if(g->Matrix[v][i].relation){
            return i;
        }
    }
    return -1;
    
    
    
    
 } 

void DFS(MyGraph g,VertexType v){
    int i ;
    printf("%d ",g.Vex[v]);    
    visited[v] = 1;
    for(i = FindFirstAdjVex(&g,v);i>=0;i = FineNext(&g,v,i))
    {
        if(!visited[i]) 
        DFS(g,i);
    }

//简写 
//for(int j = 0;j<g.NumOfVex;j++){
//    if(g.Matrix[v][j].relation==1&&!visited[j])
//    DFS(g,j);
//}


}

void DFSTraverse(MyGraph g){
    
    for(int i= 0;i<g.NumOfVex;i++)

    visited[i] = 0;
    
    
    for(int i= 0;i<g.NumOfVex;i++)
    {
        
        if(!visited[i])
        DFS(g,i);
    }
}


int main(){
    MyGraph g;
    CreatDG(&g);
    printG(&g);
    DFSTraverse(g);
}
复制代码

 

posted @   Konataaa  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示