关于图的邻接表存储建立方式及深度遍历的个人理解以及数据结构7.22的算法



采用codeblock编译器

1.头文件:paint.h

#ifndef PAINT        ///必须要有才能被其他文件所识别

#define PAINT

#include <iostream>

#include <queue>

#include <malloc.h>

using namespace std;

///最大值

#define INFINITY INF_MAX

///最大顶点个数

#define MAX_VERTEX_NUM 20

///{有向图,有向网,无向图,无向网}

typedef enum{DG,DN,UDG,UDN} GraphKind;

typedef char VertexType;

///                图的邻接表存储表示

///表结点结构

《关于图的邻接表存储建立方式及深度遍历的个人理解以及数据结构7.22的算法》

typedef struct ArcNode

{

    int adjvex;    ///该弧所指向的顶点的位置

    struct ArcNode* nextarc;   ///指向下一条弧的指针

}ArcNode;

 《关于图的邻接表存储建立方式及深度遍历的个人理解以及数据结构7.22的算法》

typedef struct Vnode

{

   VertexType data;      ///顶点信息

   ArcNode*  firstarc       ///指向第一条依附该顶点的弧的指针

}VNode, AdjList[MAX_VERTEX_NUM];

 

typedef struct 

    AdjList   vertices;

   int   vexnum,arcnum;   ///图的当前顶点数和弧数

   int kind;       ///图的种类标志

}ALGraph;

 

void Createpaint(ALGraph& G);       ///创建一个无向图的邻接链表表示4


void dfs(ALGraph G,int v);  ///深度递归遍历


int locatevex(ALGraph G,char v);  ///图的基本操作,寻找顶点位置的下标


bool dfstraverse(ALGraph G,int vex);


/**7.22,Judge if it exists a path from vertex ‘i’ to
vertex ‘j’ in digraph ‘g’.
Array ‘visited[]’ has been initialed to ‘false’**/

bool DfsReachabe(ALGraph g,int i,int j);


#endif // PAINT


2.建立一个名为paint(随便取名字)的cpp文件,paint.cpp文件:

#include “paint.h”

#include <iosream>

#include <queue>

#include <malloc.h>

using namespace std;

queue<int>q;

int visited[MAX_VERTEX_NUM];

/**为每个顶点进行编号确定他们的位置**/

int locatevex(ALGraph G,char v)
{
    int i=0;
    while(i<G.vexnum&&v!=G.vertices[i].data)
    {
        i++;
    }
    if(i<G.vexnum)
        return i;
}

void Createpaint(ALGraph& G)
{
    cout<<“请输入图的顶点数和弧度:”<<endl;
    cin>>G.vexnum;
    cin>>G.arcnum;
    char v1;
    char v2;
    int v1locate;
    int v2locate;
    ArcNode* p;
//    ArcNode* q;
    cout<<“开始输入图的信息”<<endl;
    cout<<“输入顶点信息”<<endl;
    for(int i=0;i<G.vexnum;i++)
    {
        cin>>G.vertices[i].data;                          ///这里每个顶点都有了自己所对应的编号,即为数组的所对应的i;
        G.vertices[i].firstarc=NULL;                   ///先将firsrarc置空,否则会出现野指针乱指,这样就确定了每个顶点
    }
    for(int k=1;k<=G.arcnum;k++)
    {
        cout<<“输入相关的边”<<endl;
        cin>>v1>>v2;
        v1locate=locatevex(G,v1);                  ///找到v1的编号
        v2locate=locatevex(G,v2);                  ///找到v2的编号
        p=new ArcNode;                                 ///建立一个表结点
        p->adjvex=v2locate;                           ///该表结点指向的另一个表结点的编号位置
        p->nextarc=G.vertices[v1locate].firstarc;                         ///这里的指针不是很懂,希望有人可以用图示画一下解释一下
        G.vertices[v1locate].firstarc=p;

    }

///对所有的表结点的visited数组赋初值为1

void dfs(ALGraph G,int v)                                                     
{
    visited[v]=1;
    cout<<G.vertices[v].data<<” “;
    for(ArcNode* p=G.vertices[v].firstarc;p;p=p->nextarc)           ///该处是如何递归的?
    {
        if(!visited[p->adjvex])
            dfs(G,p->adjvex);
    }
}

///先将所有visited数组的初值赋为0,然后对在visited数组中位置为vex的值赋为1,进行标记

bool dfstraverse(ALGraph G,int vex)
{
    for(int i = 0;i < G.vexnum;++i)
    {
        visited[i] = 0;///访问数组初始化
    }
    dfs(G,vex);
    for(int v = 0;v < G.vexnum;++v)
    {
        if(!visited[v])
        {
            dfs(G,v);
        }
    }
    return true;
}

bool DfsReachabe(ALGraph g,int i, int j)
{
    ArcNode* temp = 0;
    if(!g.vexnum||!g.arcnum)
        return false;
    if(visited[i])
        return false;
    visited[i] = true;
    for(temp = g.vertices[i].firstarc; temp != NULL; temp = temp->nextarc)
    {
        if(temp->adjvex == j)
            return true;
        if(DfsReachabe(g,temp->adjvex,j))
            return true;
    }
    return false;
}

建立一个main.cpp:

#include “paint.h”

int main()
{
    int a;
    ALGraph G;
    Createpaint(G);
    cout<<“输入图深度遍历的起点”<<endl;
    cin>>a;
    cout<<“深度优先遍历”<<endl;
    dfstraverse(G,a);
    if(DfsReachabe(G,0,4))
        cout<<“\nThe arc is exit\n”<<endl;
    else
        cout<<“\nNo arc\n”<<endl;
    return 0;
}





    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/qq_22611181/article/details/45896935
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞