图的存储结构,图的遍历。

目录

图的存储方法

  邻接矩阵存储法

定义存储结构类型

建立图的邻接矩阵存储

邻接表存储法

定义结构类型

建立有向图的邻接表存储

遍历

深度优先搜索DFS

广度优先搜索BFS

 


 

 


图的存储方法

  邻接矩阵存储法

定义存储结构类型

#define Max 20 ///先定义一个能储存足够大的顶点个数
typedef struct
{
    char vexs[Max];///顶点表,设为字符型
    int edges[Max][Max];///邻接矩阵。一般(图的邻接--0&1)(网的邻接--权值&无穷)
    int vnum,Enum;///顶点数,边数
} MGrape;

建立图的邻接矩阵存储

void CreateMGrape(MGrape *G)///要改变参数的值,所以用指针类型
{
    cout<<"输入顶点数和边数:\n";
    cin>>G->vnum>>G->Enum;
    cout<<"输入顶点\n";
    for(int i=0; i<G->vnum; ++i)
        cin>>G->vexs[i];  ///输入顶点信息,建立顶点表
    for(int i=0; i<G->vnum; ++i) ///邻接矩阵初始化
        for(int j=0; j<G->vnum; ++j)
            G->edges[i][j]=0;
    cout<<"输入边:\n";
    for(int i=0; i<G->Enum; ++i)
    {
        int r,c;///行 列
        cin>>r>>c; ///输入边信息,每条边以顶点的序号序偶表示
        G->edges[r][c]=1;
        G->edges[c][r]=1;///若是有向图,注释掉此行。
    }
}

 

邻接表存储法

定义结构类型

#define Max 20 ///先定义一个能储存足够大的顶点个数
typedef struct
{
    char vexs[Max];///顶点表,设为字符型
    int edges[Max][Max];///邻接矩阵。一般(图的邻接--0&1)(网的邻接--权值&无穷)
    int vnum,Enum;///顶点数,边数
} MGrape;
typedef struct node
{
    int id_v;///顶点位置编号
    struct node *next; ///指向下一邻接点(边)
    int info;///边的权值,适用于网图
}EdgeNode;  ///边结点
typedef struct vnode
{
    char v;///顶点信息,定义为字符型
    EdgeNode *firstedge;///指向第一条边

}VNode;///顶点结点
typedef struct
{
    VNode List[Max];///邻接表
    int Vnum,Enum;///点数,边数
}ALGrape;

 

建立有向图的邻接表存储

void CreateALGrape(ALGrape *G)
{
    EdgeNode *s;
    cout<<"输入顶点数和边数:\n";
    cin>>G->Vnum>>G->Enum;
    cout<<"输入顶点:\n";
    for(int i=0; i<G->Vnum; i++) ///建立顶点表
    {
        cin>>G->List[i].v;///读入顶点信息
        G->List[i].firstedge=NULL;/// 顶点的边表头指针置空
    }
    cout<<"输入边:\n";
    for(int i=0; i<G->Enum; ++i) ///建立边表
    {
        int a,b;///读入边<Va,Vb>的顶点序号对偶
        cin>>a>>b;
        s=new(EdgeNode);///生成新的边表结点
        s->id_v=b;      ///邻接点的编号为b
        s->next=G->List[a].firstedge;///将行结点s插入a的后面
        G->List[a].firstedge=s;
    }
}

 注:不理解代码的时候,画图理解

 

遍历

深度优先搜索DFS

int flag[Max]={0};
void visit(char ch)
{
    cout<<ch;
}
void DFS(ALGrape *G,int i)
{
    ///以顶点i为起点,进行邻接表图G进行深搜
    EdgeNode *p;
    visit(G->List[i].v);///访问顶点i
    flag[i]=1;///标记已经访问
    p=G->List[i].firstedge;/// 取点i的邻接边表的头指针
    while(p)
    {
        int j=p->id_v;///搜索i的邻接点j
        if(!flag[j])///如果没有访问过就,则对j进行DFS
        DFS(G,j);
        p=p->next; ///找i的下一个邻接点
    }
}
void DFSVisit(ALGrape* G)
{
    ///对图G遍历
    for(int i=0;i<G->Vnum;++i)
        if(!flag[i])
        DFS(G,i);
}

广度优先搜索BFS

void visit(char ch)
{
    cout<<ch;
}
void BFS(MGrape *G,int i)
{
    ///对邻接矩阵存的图G以点i为起点进行广搜
    int Q[Max],front=0,rear=-1;///定义队列
    visit(G->vexs[i]);  ///访问顶点i;
    flag[i]=1;
    rear++;Q[rear]=i;///点i入队
    while(front<=rear)///当队不空时,
    {
        i=Q[front];front++;///出队
            for(int j=0;j<G->vnum;++j)
            {///依次访问点i的邻接点
                if(G->edges[i][j]==1&&!flag[j])
                {

                    visit(G->vexs[j]);
                    flag[j]=1;
                    rear++;Q[rear]=j;///访问后点j进行入队
                }
            }
    }

}
void BFSVisit(MGrape *G)
{///对图G进行广度优先遍历
    for(int i=0;i<G->vnum;++i)
        if(!flag[i])
        BFS(G,i);
}

注:对于连通图而言,调用一次BFS就能访问所有结点。对于非连通图,只能遍历包括出发点的连通分量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

°PJ想做前端攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值