首页 > 其他分享 >顺序存储结构的DFS

顺序存储结构的DFS

时间:2022-11-16 18:56:41浏览次数:43  
标签:MyGraph return int DFS iNumOfVex ++ relation 顺序存储 结构

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

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

 

 

以下是实现代码

 

#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);
}

 

标签:MyGraph,return,int,DFS,iNumOfVex,++,relation,顺序存储,结构
From: https://www.cnblogs.com/konataxzy/p/16897134.html

相关文章

  • python操作hdfs
    安装安装hadoop关于hadoop的安装配置会在另一篇文章中介绍,这里只介绍python的hdfs库的安装.安装hdfs库所有python的三方模块均采用pip来安装.pipinstallhdfshdfs......
  • C语言《数据结构与数据库/操作系统》实验测试数据集
    C语言《数据结构与数据库/操作系统》实验测试数据集实验二、栈的应用注意需要根据实验内容文件实现相应的数据结构——栈,以及菜单(程序要能循环使用,不要计算一次就必须重......
  • c#中结构与类的区别
    类与结构的实例比较类与结构的差别如何选择结构还是类一.类与结构的示例比较:结构示例:  publicstructPerson{stringName;int ......
  • linux FHS(Filesystem Hierarchy Standard)结构
    Linux的哲学思想是一切皆是文件1、Linux文件系统的层次结构如下图所示:  下面将会对文件进行解释:bin普通用户的二进制可执行命令sbin管理员用户使用的工具程序的......
  • 「Java数据结构」手撕数组队列及环形数组队列。
    目录​​一、队列​​​​1、基本介绍​​​​2、示意图​​​​3、队列的特点​​​​二、数组模拟队列​​​​1、数组队列初始化​​​​2、判断方法​​​​3、增删改查......
  • InnoDB存储引擎,底层主键索引是聚集索引,那他的结构是什么样的?
    InnoDB存储引擎类型的表,底层是怎么存储数据的?   InnoDB存储引擎类型的表对应的文件,只有两个。Frm后缀文件,不用多说,是用来存放表结构的文件。InnoDB存储引擎类型的......
  • 洛谷题单【入门2】分支结构-P1085 [NOIP2004 普及组] 不高兴的津津
    题目描述津津上初中了。妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班。另外每周妈妈还会送她去学习朗诵、舞蹈和钢琴。但是津津......
  • 8086寄存器结构例题【微机原理】
    8086寄存器结构应用例题【微机原理】​​前言​​​​8086寄存器结构应用例题​​​​1、通用寄存器​​​​1)数据寄存器AX、BX、CX、DX​​​​ax应用例题​​​​bx应用......
  • 洛谷题单【入门1】顺序结构-P1001 A+B Problem
    题目描述输入两个整数 a,ba,b,输出它们的和(|a|,|b|\le{10}^9∣a∣,∣b∣≤109)。 输入格式两个以空格分开的整数。输出格式一个整数。输入输出样例输......
  • 洛谷题单【入门1】顺序结构-B2005 字符三角形
    题目描述给定一个字符,用它构造一个底边长 55 个字符,高 33 个字符的等腰字符三角形。输入格式输入只有一行,包含一个字符。输出格式该字符构成的等腰三角形,底......