开始攻克图的算法,先从最简单的存储开始实现,本文关于邻接表的实现。

邻接表是图的存储中最简单也是最基本的存储结构,基于链表的思想实现的。在邻接表中,对于中的每个顶点建立一个单链表,第i个单链表中的节点表示依附于顶点的vi的边。每个节点由3个域组成其中邻接点域(adjvex)指示与顶点vi邻接的点在图中的位置,链域(nextarc)指示下一条边或弧的节点;数据域(info)存储和边或弧相关的信息,如权值等,每个链表上附设一个表头节点。在表头节点中除了设有链域(firstarc)指向链表中的第一个节点之外,还设有存储顶点vi的名或其他有关信息的数据域(data)。

两种表结构如图:

我以下面的图结构为例进行操作:

下面把代码贡献出来:

Adj_List.h

#ifndef __ADJ_LIST_H__
#define __ADJ_LIST_H__#define MAX_VERTEX_NUM 20typedef struct ArcNode
{char adjvex;struct ArcNode *nextarc;int *info;
}ArcNode;typedef struct VNode
{char data;ArcNode *firstarc;
}VNode,AdjList[MAX_VERTEX_NUM];typedef struct ALGraph
{AdjList vertices;int vexnum,arcnum;int kind;
}ALGraph;#endif /* __ADJ_LIST_H__*/

graph_storage.c

/**************************************************Name : graph_storage.c                        **Date : 2015-05-27                             **Author : sniper                               **Aim : It will storage the graph using the adj-**      acency list,and travel the pragh.       **************************************************/
#include <stdio.h>
#include <stdlib.h>
#include "Adj_list.h"int create(ALGraph *G)
{int i,j;int node_pair1,node_pair2;ArcNode *arc;node_pair1=0;node_pair2=0;i=0;j=0;printf("please input the number of node and edge: ");scanf("%d %d",&G->vexnum,&G->arcnum);for(i=0;i<G->vexnum;i++){G->vertices[i].data = 'A'+i;G->vertices[i].firstarc = NULL;} printf("finish the Node!\n");for(j=0;j<G->arcnum;j++){printf("please input the node pair: ");scanf("%d %d",&node_pair1,&node_pair2);node_pair1-=1;node_pair2-=1;/**Node pair get match with each other *and storage into the adjacency list.*/arc = (ArcNode *)malloc(sizeof(ArcNode));arc->adjvex = node_pair2+'A';arc->nextarc=G->vertices[node_pair1].firstarc;G->vertices[node_pair1].firstarc=arc;arc = (ArcNode *)malloc(sizeof(ArcNode));arc->adjvex = node_pair1+'A';arc->nextarc=G->vertices[node_pair2].firstarc;G->vertices[node_pair2].firstarc=arc;}printf("finish the Adjacency List\n");return 0;
}int main()
{ALGraph *G;int i;  i=0;G = (ALGraph *)malloc(sizeof(ALGraph));create(G);/* *print the adjacency list*/for(i=0;i<G->vexnum;i++){printf("%c -> ",'A'+i);while(G->vertices[i].firstarc!=NULL){printf("%c -> ",G->vertices[i].firstarc->adjvex);G->vertices[i].firstarc=G->vertices[i].firstarc->nextarc;          }printf("\n");}return 0;
}

也可以从我的GitHub clone

https://github.com/cremyos/Graph_Adj_List

测试用例:

5 6
1 2
1 4
2 3
2 5
3 4
3 5

好了下次该解决下面的问题了!

图(一)之邻接表Adjacency List相关推荐

  1. 图2——利用邻接表创建有向图

    图2--利用邻接表创建有向图 图 假设以邻接表作为图的存储结构,编写算法,创建有向图并输出邻接表. 主要考查对邻接表的理解.图的邻接表分为两个部分:表头结点和边表结点,因此创建有向图也分成两部分:一是 ...

  2. 数据结构(廿六) -- C语言版 -- 图 - 图的遍历 -- 邻接表 - 深度/广度优先遍历/搜索(DFS、BFS)

    内容预览 零.读前说明 一.深度优先遍历 1.1.深度优先的遍历过程 1.2.深度优先的遍历实现代码 二.广度优先遍历 2.1.广度优先的遍历过程 2.2.广度优先的遍历实现代码 三.源码测试效果 3 ...

  3. 用邻接表存储图c语言,邻接表、邻接多重表、十字链表及C语言实现

    上一节介绍了如何使用顺序存储结构存储邻接多重表和 邻接的意思是顶点之间有边或者弧存在,通过当前顶点,可以直接找到下一个顶点. 邻接表 使用邻接表存储图时,对于图中的每一个顶点和它相关的邻接点,都存储到 ...

  4. 图数据结构之邻接链表Adjacency List(Python版)

    前面学过两种图的数据结构,有兴趣的可以查阅:图数据结构之字典实现(Python版)https://blog.csdn.net/weixin_41896770/article/details/12812 ...

  5. 图的建立-邻接表表示(C语言)

    代码如下: /* 图的邻接表表示法 */#define MaxVertexNum 100 /* 最大顶点数设为100 */ typedef int Vertex; /* 用顶点下标表示顶点,为整型 * ...

  6. 图(用list邻接表表示)的深度优先和广度优先(递归和非递归实现)

    #include<iostream> #include<string> #include<list> #include<queue> #include& ...

  7. 数据结构【图】—023邻接表深度和广度遍历

    1 #include "000库函数.h" 2 //无向图 3 4 #define MAXSIZE 9 /* 存储空间初始分配量 */ 5 #define MAXEDGE 15 6 ...

  8. 数据结构之图:邻接矩阵和邻接表、深度优先遍历和广度优先遍历

    简介 线性表是一种线性结构,除了头结点和尾节点,线性表的每个元素都只有一个前取节点和一个后继节点.而树结构则相较于线性表更加复杂,它描述的关系为数据元素之间的父子关系,也是现实世界父子关系的缩影, 一 ...

  9. 图的存储——邻接表法

    文章目录 一.邻接表法 二.复杂度分析(G(V,E)) 1.无向图 2.有向图 总结(和邻接矩阵的对比) 一.邻接表法 使用一个顶点表存储顶点信息,每个顶点之后连接该顶点的相连边的信息(链表). 结构 ...

最新文章

  1. MyBatis日志到底是如何做到兼容所有常用日志框架的?
  2. 8Manage PPM助力中投证券 项目管理向数字化转型
  3. 生产订单形成的差异如何传递到COPA
  4. 荣耀手机现在可以升级鸿蒙系统吗,鸿蒙系统升级名单正式公布,华为手机90%能升,荣耀手机却有点意外...
  5. DM8168 开发环境搭建
  6. iframe实现页面无刷新上传文件(PHP)----备忘
  7. windows 打开和关闭显示器
  8. c语言 正整数 几位 逆序,c语言经典例题:正整数求位数and求顺、逆序位数
  9. 20.看板方法---问题管理和升级策略
  10. [JNI] 开发之旅 (2)解释jni helloworld实例
  11. 怎样在php中制作电子相册,电子相册制作 如何制作电子相册带音乐和文字
  12. eagle php,使用EaglePHP打造自己的网站(非PHP程序员的菜鸟使用手册)
  13. 网易云音乐网站音乐下载
  14. 禁用驱动程序强制签名(终极办法)
  15. scratch ios html,scratch手机版
  16. word文档下面有红色波浪线如何解决
  17. fast虚拟服务器ip地址设置,迅捷路由器静态ip怎么设置_迅捷固定IP地址怎么设置?-192路由网...
  18. ECharts提示框数字保留两位小数
  19. SPSS学习(1)之数据录入与数据获取
  20. 几种抽奖方式之轮盘抽奖

热门文章

  1. Chrome浏览器无法安装
  2. linux技术咨询,Linux技术咨询委员会已完成对UMN内核漏洞植入事件的调查
  3. 荣耀搭载鸿蒙计划,荣耀V40照常发布,将更换操作系统,同nova8搭载鸿蒙2.0发布...
  4. 修改element-ui-template 登录接口 api login
  5. Linux嵌入式基础知识
  6. ubuntu安装teamviwer
  7. 鞋类产品推广引流落地页html源码
  8. 企业开发的困境与变局
  9. matplotlib画图之设置横轴坐标上下限的两种方法
  10. python xlsxwriter库生成图表的应用