构建有向图邻接表

建立一个有向图的邻接表,首先要构思好它的邻接表里面包含哪些结构数据,然后根据哪些数据来建立相应的结构体。但也要注意数据的输入。

#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 10
typedef struct ArcNode             //弧节点结构体
{
     int adjvex;                            //该弧指向定点的位置
     int data;
     struct ArcNode * nextarc;    //指向下下一条弧的指针
}ArcNode;
typedef struct VNode             //定点结构体
{
     char data;
     ArcNode * firstarc;              //指向第一条弧的指针
}VNode, AdjList[MAX_SIZE];
typedef struct                         //创建图的结构体
{
     AdjList vertices;                   //顶点数组
     int vexnum, arcnum;           //顶点个数及弧的条数
}ALGraph;
int Find(ALGraph G, char ch)    //查找此节点位于顶点数组的那个位置
{
     int i;
     for(i = 0; i<G.vexnum; i++)
     {
          if(ch == G.vertices[i].data)
               break;
     }
     return i;
}
void Input(ALGraph & G)     //构建邻接表的输入操作
{
     int mark, data;               //mark是用来标记是否有下一条弧,data则用来保存要输入的数据
     ArcNode * p;
     char ch;
     printf("请输入图的顶点数和弧的条数。\n");
     scanf("%d%d", &G.vexnum, &G.arcnum);
     printf("请输入顶点信息。\n");
     getchar();
     for(int i = 0; i<G.vexnum; i++)
          {
               scanf("%c", &G.vertices[i].data);
               getchar();
         }
     printf("请按照各个顶点的顺序来输入弧节点。\n");
     for(int i = 0; i<G.vexnum; i++)
     {
          mark = 1;
          G.vertices[i].firstarc = NULL;
          printf("请判断以%c为弧尾的弧。\n", G.vertices[i].data);
          while(mark)
          {
               printf("判断是否有下一个弧,若有则输入1,无则输入0。\n");
               scanf("%d", &mark);
               getchar();
               if(mark)
               {
                    p = (ArcNode *)malloc(sizeof(ArcNode));
                    p->nextarc = NULL;
                    printf("输入弧节点的信息:");
                    scanf("%c", &ch);
                    getchar();
                    scanf("%d", &data);
                    p->adjvex = Find(G, ch);
                    p->data = data;
                    p->nextarc = G.vertices[i].firstarc;
                    G.vertices[i].firstarc = p;
               }
          }
     }
}
void Output(ALGraph G)       //输出图的有关信息
{
     for(int i = 0; i<G.vexnum; i++)
     {
          printf("%c : ", G.vertices[i].data);
          while(G.vertices[i].firstarc)                  //输出每个节点弧中所包含的数据
          {
               printf("%d  ", G.vertices[i].firstarc->data);
               G.vertices[i].firstarc = G.vertices[i].firstarc->nextarc ;
          }
          printf("\n");
     }
}
int main()
{
     ALGraph G;
     Input(G);
     Output(G);
     return 0;
}

构建有向图邻接表

时间: 2024-12-25 21:41:45

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

算法与数据结构基础8:C++实现有向图邻接表存储

前面实现了链表和树,现在看看图. 链表是一对一的对应关系: 树是一对多的对应关系: 图是多对多的对应关系. 图一般有两种存储方式,邻接表和邻接矩阵. 先看邻接表. 邻接表就是将图中所有的点用一个数组存储起来,并将此作为一个链表的头, 链表中保存跟这个点相邻的点(边点),如果有权值,则在边点中增加一权值字段. 因此,有向图邻接表的空间复杂度为O(v+e),无向图加倍. C++实现代码如下: // GraphList.h #include <iostream> #include <cstdi

特殊的邻接表——立方体邻接表

特殊的邻接表——立方体邻接表:关于链接表的一些特殊情况的考虑 我们在学习图的时候,都知道常用的保存图的方法有邻接矩阵和邻接表.当图中的边的数量相对于顶点的数量较少是,邻接矩阵中会出现许多0值,即形成了稀疏矩阵.这个时候用邻接表来储存图就可以大大减少储存所需的空间,也即是对矩阵进行了“压缩”. 邻接表的本质是一种链式储存结构,它保存的是顶点间的邻接关系,也就是只考虑邻接矩阵中的非零元素.很自然会想到通过链表来构建一个邻接表,这是因为各个顶点通过的边的数量绝大多数不相同,用链表的动态分配内存显然更合

邻接表有向图(三)之 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

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

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

基于邻接表的图建立(有向图+无向图)

图的表示(建立)有两种方法: ①邻接矩阵:A(i,j)=1表示i,j存在一条边,空间复杂度O(n^2),稠密图 ②邻接表:只记录存在的边,Vector+List的数据结构,稀疏图 邻接矩阵的图建立这里不做赘述,接下来我们看一下邻接表的图建立: <1>有向图 注意理解头插入节点的过程 int n,m;//n表示城镇个数,m表示道路条数</span> struct LinkNode//列表节点 { int vex; //邻接的结点在数组中的编号 LinkNode* next; }; s

用邻接表存储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

邻接表有向图的介绍

邻接表有向图是指通过邻接表表示的有向图. 上面的图G2包含了"A,B,C,D,E,F,G"共7个顶点,而且包含了"<A,B>,<B,C>,<B,E>,<B,F>,<C,E>,<D,C>,<E,B>,<E,D>,<F,G>"共9条边. 上图右边的矩阵是G2在内存中的邻接表示意图.每一个顶点都包含一条链表,该链表记录了"该顶点所对应的出边的另一个顶点的序

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