有向图的邻接表

Posted ygsworld

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有向图的邻接表相关的知识,希望对你有一定的参考价值。

#include<iostream>
using namespace std;
#include<malloc.h>

#define MAX_VERTEX_NUM 20
#define VerTexType char

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

typedef struct ArcNode//边结点
{
    int adjvex;//邻结顶点的顶点序号
    double weight;
    struct ArcNode *next;
}ArcNode;

typedef struct VNode
{
    VerTexType data;
    ArcNode *firststar;
}VNode,AdjList[MAX_VERTEX_NUM];

typedef struct ALGraph
{
    AdjList vertices;
    int pointnum;
    int edgenum;
    int kind;
}ALGraph;

bool IsExistArc(ALGraph &G,int i,int j)
{
    ArcNode *t;
    for(t =G.vertices[i].firststar;t;t = t->next)
    {
        if(t->adjvex == j)
            return true;
    }
    return false;
}

int LocateVexAL(ALGraph &G,VerTexType v)
{
    int i;
    for(i = 0;i<G.pointnum;i++)
    {
        if(v == G.vertices[i].data)
            return i;
    }
    return -1;    
}

void CreateADJ(ALGraph &G)
{
    int i;
    int j;
    int k;
    VerTexType temp;
    VerTexType a;
    VerTexType b;
    ArcNode *s;
    G.kind = DG;
    for(k = 0;k < G.pointnum;k++)
    {
        cout<<"请输入顶点的值"<<endl;
        cin>>temp;
        for(i = 0 ;i<k;i++)
        {
            if(temp== G.vertices[i].data)
                break;
        }
        if(i < k)
        {
            k--;
            cout<<"已经存在这样的点,重新输入"<<endl;
            continue;
        }
        G.vertices[k].data = temp;
        G.vertices[k].firststar = NULL;
    }
    for(k = 0; k<G.edgenum;k++)
    {
        cout<<"请输入一条弧尾";
        cin>>a;
        cout<<"请输入一条弧头";
        cin>>b;
        i = LocateVexAL(G,a);
        j = LocateVexAL(G,b);
        if(i == j || IsExistArc(G,i,j) == true)
        {
            k--;
            cout<<"已经存在这样的点,重新输入"<<endl;
            continue;
        }
        s = (ArcNode*)malloc(sizeof(ArcNode));
        s ->adjvex = j;
        s->next = G.vertices[i].firststar;
        G.vertices[i].firststar = s;
    }
}
void DispADJ(ALGraph &G)
{
    int k;
    ArcNode *p;
    for(k = 0;k<G.pointnum;k++)
    {
        cout<<"从"<<G.vertices[k].data<<"出发的能到达的顶点有";
        for(p = G.vertices[k].firststar;p;p = p->next)
        {
            cout<<G.vertices[p->adjvex].data;
        }
        cout<<endl;
    }
}

int main()
{
    ALGraph G;
    cout<<"输入顶点数"<<endl;
    cin>>G.pointnum;
    cout<<"输入边数"<<endl;
    cin>>G.edgenum;
    CreateADJ(G);
    DispADJ(G);
}

  运算结果

技术分享图片

以上是关于有向图的邻接表的主要内容,如果未能解决你的问题,请参考以下文章

邻接表有向图

用数组表示的邻接表,如何添加一个弧

数据结构与算法学习笔记 图

数据结构与算法学习笔记 图

求算法,用邻接矩阵和邻接表创建一个图,实现深度和广度搜索,菜单形式,c语言的代码。无向无权的图。

邻接表有向图