有向图的邻接表

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

  运算结果

原文地址:https://www.cnblogs.com/ygsworld/p/10023784.html

时间: 2024-10-13 00:31:29

有向图的邻接表的相关文章

C语言建立有向图的邻接表及其遍历操作

1 /*C语言建立有向图的邻接表及其遍历操作*/ 2 #include"stdio.h" 3 #include"stdlib.h" 4 //图的邻接矩阵储存结构 5 typedef char elemtype; 6 #define maxsize 10 7 #define queuesize 100 8 //边结点的类型定义 9 typedef struct edgenode 10 { 11 int adjvex;//存放邻接的点在顶点表的下标,邻接点 12 str

构建有向图邻接表

建立一个有向图的邻接表,首先要构思好它的邻接表里面包含哪些结构数据,然后根据哪些数据来建立相应的结构体.但也要注意数据的输入. #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 10 typedef struct ArcNode //弧节点结构体 { int adjvex; //该弧指向定点的位置 int data; struct ArcNode * nextarc; //指向下下一条弧的指针 }ArcNode; typ

邻接表求有向图各顶点的入度和出度 (图论基础)

有向图的邻接表用一个结构体LGraph存储表示,其中包括3个成员:顶点数组vertexs,顶点数vexnum和边数arcnum,其中顶点数组vertexs中每个元素都是VNode结构体变量.VNode结构体变量次年初图中每个顶点,它包含3个成员:顶点信息,出边表的表头指针和入边表的表头指针,其中后面两个成员都是ArcNode结构体类型的指针.ArcNode结构体存储边链表中的边节点,它包含两个成员:变的另一个邻接点的序号,以及指向下一个边节点的指针. #define MAXN 100 struc

数据结构-图存储表示之邻接表

邻接表 在图论中,邻接表代表一个图中的所有边或弧. 邻接表存储表示,需要保存一个顺序存储的顶点表和每个顶点上的边的链接表. 邻接表(Adjacency List),即数组与链表相结合的存储方法. 如果是无向图,那么每条边由两个结点组成,分别代表边的两个端点: 如果是有向图,那么每条边是一个结点对,分别代表边的始点和终点. 一般来说,邻接表是无向的. 在计算机科学中,邻接表描述一种紧密相关的数据结构,用于表征图.在邻接表的表示中,对于图中的每个顶点,我们将保存所有其它与之相连的顶点(即"邻接表&q

数据结构之图的邻接表

1.邻接表的简介: 图的邻接矩阵存储方法跟树的孩子链表示法相类似,是一种顺序分配和链式分配相结合的存储结构.邻接表由表头结点和表结点两部分组成,其中图中每个顶点均对应一个存储在数组中的表头结点.如这个表头结点所对应的顶点存在相邻顶点,则把相邻顶点依次存放于表头结点所指向的单向链表中.如词条概念图所示,表结点存放的是邻接顶点在数组中的索引.对于无向图来说,使用邻接表进行存储也会出现数据冗余,表头结点A所指链表中存在一个指向C的表结点的同时,表头结点C所指链表也会存在一个指向A的表结点.[1] 邻接

图的存储-邻接表

图的邻接表之前实现的时候,一直有点小问题 现在才明白 原来头结点是有内容的,之前一直当做一个标志位置来使用 说到底,这就是一种顺式和链式相互结合的储存结构 但还是不知其所以然,这个结构相较于邻接矩阵除了空间储存上面有很大优势,还有访问邻接节点方便 不明白他还有什么非他不可的理由 (其实就是因为自己对链式结构操作不是很熟悉找了个借口.) 邻接表(Adjacency List)是图的一种顺序存储与链式存储结合的存储方法.邻接表表示法类似于树的孩子链表表示法.就是对于图G 中的每个顶点vi,将所有邻接

图 - 存储结构之邻接表

对于图来说,邻接矩阵是不错的一种图存储结构,但是我们也发现,对于边数相对顶点较少的图,这种结构是存在对存储空间的极大浪费的.因此我们考虑另外一种存储结构方式:邻接表(Adjacency List),即数组与链表相结合的存储方法. 邻接表的处理方法是这样的. 1.图中顶点用一个一维数组存储,另外,对于顶点数组中,每个数据元素还需要存储指向第一个邻接点的指针,以便于查找该顶点的边信息. 2.图中每个顶点vi的所有邻接点构成一个线性表,由于邻接点的个数不定,所以用单链表存储,无向图称为顶点vi的边表,

邻接表有向图(三)之 Java详解

前面分别介绍了邻接表有向图的C和C++实现,本文通过Java实现邻接表有向图. 目录 1. 邻接表有向图的介绍 2. 邻接表有向图的代码说明 3. 邻接表有向图的完整源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结构与算法系列 目录 邻接表有向图的介绍 邻接表有向图是指通过邻接表表示的有向图. 上面的图G2包含了"A,B,C,D,E,F,G"共7个顶点,而且包含了"<A,B>,<B,C>,

图的广度度优先遍历算法运用队列主针对邻接表有向图

源代码如下: #include<iostream> using namespace std; #define MAX_VERTEX_NUM 20 typedef int EdgeData; typedef char VertexData; //顶点数据域 typedef struct node { // 边表节点 EdgeData cost; //边上d权值 int adjvex; //邻接点域 struct node *next; //下一边链接指针 }EdgeNode; typedef s