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

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

#define MAXN 100

struct ArcNode     //边节点;
{
    int adjvex;    //有向边的另一个邻接点的序号;
    ArcNode *nextarc;  //指向下一个边节点的指针;
};

struct VNode       //顶点;
{
    int data;      //顶点信息;
    ArcNode *head1;  //出边表的表头指针;
    ArcNode *head2;  //入边表的表头指针;
};

struct LGraph      //图的邻接表存储结构;
{
    VNode vertexs[MAXN];   //顶点数组;
    int vexnum, arcnum;    //顶点数,边(弧)数;
};

LGraph lg;  //图(邻接表存储结构)

出度入度邻接表存储结构形式代码实现如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#define MAXN 100
#define INF 0xFFFFFFF
#define RST(N)memset(N, 0, sizeof(N))
using namespace std;

struct ArcNode     //边节点;
{
    int adjvex;    //有向边的另一个邻接点的序号;
    ArcNode *nextarc;  //指向下一个边节点的指针;
};

struct VNode       //顶点;
{
    int data;      //顶点信息;
    ArcNode *head1;  //出边表的表头指针;
    ArcNode *head2;  //入边表的表头指针;
};

struct LGraph      //图的邻接表存储结构;
{
    VNode vertexs[MAXN];   //顶点数组;
    int vexnum, arcnum;    //顶点数,边(弧)数;
};

LGraph lg;  //图(邻接表存储结构)

void CreateLG()     //构造有向图G;
{
    ArcNode *pi;
    int v1, v2;
    for(int i=0; i<lg.vexnum; i++) {  //初始化表头指针为空;
        lg.vertexs[i].head1 = lg.vertexs[i].head2 = NULL;
    }
    for(int i=0; i<lg.arcnum; i++) {
        scanf("%d %d", &v1, &v2);
        v1--, v2--;
        pi = new ArcNode;     //添加出边;
        pi->adjvex = v2;
        pi->nextarc = lg.vertexs[v1].head1;
        lg.vertexs[v1].head1 = pi;
        pi = new ArcNode;     //添加入边;
        pi->adjvex = v1;
        pi->nextarc = lg.vertexs[v2].head2;
        lg.vertexs[v2].head2 = pi;
    }
}

//释放图G邻接表各顶点的边链表中的所有边节点所占的内存空间;
void Delete()
{
    ArcNode *pi;
    for(int i=0; i<lg.vexnum; i++) {
        pi = lg.vertexs[i].head1;
        while(pi != NULL) {
            lg.vertexs[i].head1 = pi->nextarc;
            delete pi;
            pi = lg.vertexs[i].head1;
        }
        pi = lg.vertexs[i].head2;
        while(pi != NULL) {
            lg.vertexs[i].head2 = pi->nextarc;
            delete pi;
            pi = lg.vertexs[i].head2;
        }
    }
}

int main(int argc, char *argv[])
{
    ArcNode *pi;
    int in_num, out_num;
    while(~scanf("%d %d", &lg.vexnum, &lg.arcnum)) {
        if(lg.vexnum == 0) break;
        CreateLG();

        /****输出每条边的出度****/
        for(int i=0; i<lg.vexnum; i++) {
            out_num = 0;
            pi = lg.vertexs[i].head1;
            while(pi != NULL) {
                out_num++;
                pi = pi->nextarc;
            }
            printf("%d", out_num);
            i == lg.vexnum-1 ? printf("\n") : printf(" ");
        }

        /****输出每条边的入度****/
        for(int i=0; i<lg.vexnum; i++) {
            in_num = 0;
            pi = lg.vertexs[i].head2;
            while(pi != NULL) {
                in_num++;
                pi = pi->nextarc;
            }
            printf("%d", in_num);
            i == lg.vexnum-1 ? printf("\n") : printf(" ");
         }
         Delete();
    }
    return 0;
}
时间: 2024-10-28 19:01:53

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

用邻接表存储n个顶点m条弧的有向图

例如要存储一下有向图: 当输入6个顶点,8条弧 1 2 1 3 2 4 3 4 3 5 4 1 4 6 5 6 建立的邻接表的流程图为: 实现代码: /* 用邻接表存储n个顶点m条弧的有向图 */ #include<stdio.h> #include<stdlib.h> #define MAX 10005 typedef struct ArcNode { int adjvex; struct ArcNode * nextarc; }ArcNode; typedef struct V

【Dijkstra+邻接表求次短路】POJ Sightseeing 3463

Language: Default Sightseeing Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7766   Accepted: 2766 Description Tour operator Your Personal Holiday organises guided bus trips across the Benelux. Every day the bus moves from one city S to

图的存储-邻接表

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

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

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

图 - 存储结构之邻接表

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

图的存储结构之邻接表

邻接矩阵的缺点:边数相对顶点较少的图,极大地浪费了存储空间. 把数组与链表相结合的存储方法称为邻接表.(Adjacency List) 邻接表的处理办法: 顶点用一个一维数组存储(较容易读取顶点信息),每个数据元素还需要存储指向第一个邻接点的指针,以便于查找该顶点的边信息. 每个顶点的所有邻接点构成一个线性表(用单链表存储).无向图称为顶点Vi的边表,有向图称为顶点Vi作为弧尾的出边表. 图1  无向图的邻接表结构 data是数据域,存储顶点的信息,firstedge是指针域,指向边表的第一个结

数据结构(11) -- 邻接表存储图的DFS和BFS

/////////////////////////////////////////////////////////////// //图的邻接表表示法以及DFS和BFS /////////////////////////////////////////////////////////////// #include <iostream> #include <stdlib.h> #include <queue> using namespace std; //图的邻接表表示法

数据结构之图的邻接表

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

数据结构(10) -- 图的邻接表存储

////////////////////////////////////////////////////////// //图的邻接表存储 ////////////////////////////////////////////////////////// #include <iostream> #include <stdlib.h> using namespace std; //图的邻接表表示法 #define MaxVertexNum 100 enum GraphType{DG,