图(一)之邻接表Adjacency List

2023-11-17

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

邻接表是图的存储中最简单也是最基本的存储结构,基于链表的思想实现的。在邻接表中,对于中的每个顶点建立一个单链表,第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 20

typedef 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
好了下次该解决下面的问题了!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图(一)之邻接表Adjacency List 的相关文章

  • 005. 反转链表-双指针

    题目链接 力扣 代码 01 双指针 class Solution public ListNode reverseList ListNode head ListNode temp 保存cur的下一个节点 ListNode cur head L
  • 链表和线性表的优缺点

    链表和线性表的优缺点 作为我们最先接触的两个数据结构 链表和线性表的优缺点都较为明显 并且二者互相补足 文章目录 链表和线性表的优缺点 线性表 线性表的组成 线性表的缺点 线性表的优点 链表 链表的组成 链表的优点 链表的缺点 总结 线性表
  • C++中的.和->

    C 中的 和 gt 1 C 中的点 的应用 如果是一个对象或者引用去调用成员变量或者成员函数函数的话 会使用到点 include
  • 模拟实现通讯录<二>(动态模拟)

    继静态模拟通讯录 实现动态模拟 静态模拟通讯录博客链接 http blog csdn net bitboss article details 51374654 实现一个通讯录 通讯录可以动态存储信息 每个人的信息包括 姓名 性别 年龄 电话
  • leetcode算法面试题:对称二叉树、对链表进行插入排序、多数元素

    对称二叉树问题 给定一个二叉树 检查它是否是镜像对称的 例如 二叉树 1 2 2 3 4 4 3 是对称的 1 2 2 3 4 4 3 但是下面这个 1 2 2 null 3 null 3 则不是镜像对称的 1 2 2 3 3 参考答案 c
  • 【Java 数据结构】单链表与OJ题

    篮球哥温馨提示 编程的同时不要忘记锻炼哦 暮色降临 冲一杯咖啡 目录 1 什么是链表 2 实现一个单向非循环链表 2 1 实现前的约定 2 2 addFirst 方法 2 3 addList 方法 2 4 addIndex 方法 2 5 c
  • 小松的STM32教程(13)—— 驱动外部内存24C02

    预备 学习目标 概述 24cxx c include 24cxx h include delay h include delay h void IIC Init void GPIO InitTypeDef GPIO InitStructur
  • LeetCode 142. 环形链表 II

    题目链接 https leetcode cn problems linked list cycle ii 思路如下 用两个指针 fast slow 同时从起点开始走 fast 每次走两步 slow 每次走一步 如果过程中 fast 走到 n
  • 2020.11.13 奇偶链表

    2020 11 13 奇偶链表 题目描述 给定一个单链表 把所有的奇数节点和偶数节点分别排在一起 请注意 这里的奇数节点和偶数节点指的是节点编号的奇偶性 而不是节点的值的奇偶性 请尝试使用原地算法完成 你的算法的空间复杂度应为 O 1 时间
  • 【数据结构】单向链表的修改和删除

    单向链表的修改和删除 从单链表中删除一个节点思路 1 找到需要删除节点的前一个节点temp 2 temp next temp next next 3 被删除的节点 将不会有其他引用指向 会被垃圾处理机制回收 1 单向链表的修改操作 1 1
  • leetcode-合并两个有序链表(详解)

    合并两个有序链表 前言 一 题链接 题意 题思路 题思路图解 题代码 总结 前言 路漫漫及修远兮 一 题链接 题意 将两个升序链表合并为一个新的 升序 链表并返回 新链表是通过拼接给定的两个链表的所有节点组成的 输入 l1 1 2 4 l2
  • 算法篇--链表求和

    问题描述 给两个链表 每个链表为一个整数的倒序 如下 1 2 3 4 5 7 9 两个数字的结果 321 9754 10075 那么 请得到 链表的结果为 5 7 0 0 1 思考 思路总结 两个链表肯定有一个最长的 等于情况取哪个都行 所
  • C语言单向循环链表的建立

    1 头文件 include
  • 刷题之142. 环形链表 II

    给定一个链表的头节点 head 返回链表开始入环的第一个节点 如果链表无环 则返回 null 如果链表中有某个节点 可以通过连续跟踪 next 指针再次到达 则链表中存在环 为了表示给定链表中的环 评测系统内部使用整数 pos 来表示链表尾
  • 数据结构之双向链表,实现双向链表的增删改查

    目录 一 双向链表的定义 1 双向链表节点的定义 2 双向链表的初始化 二 双向链表的函数接口实现 1 双链表的尾插 2 双向链表的尾删 3 双向链表的头插 4 双向链表的头删 6 双向链表在pos前面插入 7 双向链表删除pos位置的节点
  • 【C++】STL中list容器内部元素的移动和交换

    文章目录 前言 一 list是什么 二 元素移动 1 插入 删除 2 切除 拼接 三 元素交换 1 元素值交换 2 元素 节点 交换 总结 前言 提示 list insert list erase list splice std iter
  • 算法题-简单系列-03-判断链表中是否有环

    文章目录 1 题目 1 1 思路1 双指针 1 2 思路2 哈希表 1 题目 判断给定的链表中是否有环 如果有环则返回true 否则返回false 1 1 思路1 双指针 我们使用两个指针 fast 与 slow 它们起始都位于链表的头部
  • 【数据结构/C++】树和二叉树_二叉链表

    include
  • 《LeetCode力扣练习》代码随想录——双指针法(反转链表---Java)

    LeetCode力扣练习 代码随想录 双指针法 反转链表 Java 刷题思路来源于 代码随想录 206 反转链表 双指针 Definition for singly linked list public class ListNode int
  • 带头双向循环链表基础

    带头双向循环链表基础 销毁 销毁 void ListDestory ListNode phead void ListDestory ListNode phead assert phead ListNode cur phead gt next

随机推荐

  • Adapter模式——设计模式学习笔记

    Adapter模式 一 意图 将一个类的接口转换成客户希望的另外一个接口 Adapter模式使得原本由于接口不兼容而不能在一起工作的那些类可以在一起工作 二 动机 为复用而设计的通用的类 总是存在一些特殊的情况 使其不能够使用或者完成相应的
  • pt工具常用命令

    pt工具介绍 Percona Toolkit简称pt工具 是Percona公司开发用于管理MySQL的工具 功能包括检查主从复制的数据一致性 检查重复索引 定位IO占用高的表文件 在线DDL等 DBA熟悉掌握后将极大提高工作效率 下载地址h
  • YOLO物体检测-系列教程2:YOLOV2整体解读

    YOLO 系列教程 总目录 YOLOV1整体解读 YOLOV2整体解读 YOLOV2提出论文 YOLO9000 Better Faster Stronger 1 YOLOV1 优点 快速 简单 问题1 每个Cell只预测一个类别 如果重叠无
  • 第二十七课、应用程序中的主窗口------------------狄泰软件学院

    一 主窗口的概念 1 应用程序中的主窗口 1 主窗口是与用户进行长时间交互的顶级窗口 2 程序的绝大多数功能直接由主窗口提供 3 主窗口通常是应用程序启动后显示的第一个窗口 4 整个程序由一个主窗口和多个对话框组成 2 Qt中的主窗口 1
  • leetcode排序算法总结—时间复杂度o(nlogn)-希尔/堆排/快排/归并小记

    排序算法总结 时间复杂度O nlogn 希尔 堆排序 快排 归并 希尔排序 有一段间隔的排序 可以逐个子表进行排序 然 例如王道 都给出便于计算机进行连续访问的程序算法 即依次按元素比较不同子表进行子表的调整 时间复杂度O n 1 3 最坏
  • 面向对象设计原则——开闭原则

    开闭原则是面向对象的可复用设计的第一块基石 它是最重要的面向对象设计原则 开闭原则由Bertrand Meyer于1988年提出 定义 开闭原则 Open Closed Principle OCP 一个软件实体应当对扩展开放 对修改关闭 即
  • 盘点2013:21款最优秀的开源数据库

    作为一名软件开发人员或DBA 其中一份必不可少的工作就是与数据库打交道 比如MS SQL服务器 MySQL Oracle PostgreSQL MongoDB等等 众所周知 其中MySQL是目前使用最广泛最好的免费开源数据库 此外 还有一些
  • C++11新特性——互斥锁、条件变量、原子类型

    1 互斥锁 C 11提供了四种互斥锁 mutex 互斥锁 timed mutex 带超时机制的互斥锁 recursive mutex 递归互斥锁 recursive timed mutex 带超时机制的递归互斥锁 包含头文件 include
  • http和Tcp的长连接和短连接

    转自 https www cnblogs com fubaizhaizhuren p 7523374 html http协议和tcp ip 协议的关系 1 http是应用层协议 tcp协议是传输层协议 ip协议是网络协议 2 IP协议主要解
  • Blender学习笔记(1)快捷键

    鼠标中键 转动视角 shift 中键 平移视角 ctrl 中键上下移动 缩放画面 shift 左键 多选 a是全选 b是多选 在编辑模式下是挤出 ctrl 右键 套索工具 ctrl shift 右键 diselect 中间滚轮滚动 缩放画面
  • Qt Creator 常见问题记录

    1 资源文件不显示 由于不小心删除了工程目录中的qrc文件 重新加回去后 发现项目树中Resources不见了 如下图 图中是显示的 解决办法 选择项目右键 清除 再重新缩放项目 即可看到 2 多个项目 如何选择某个项目作为启动项 VS中可
  • C++ SFINAE简介和std::enable_if_t的简单使用

    最近整理代码时发现了有人常会使用std enable if t 据说这个是C 14才支持的写法 因此再次勾起了我的整理欲 但要是熟悉std enable if的话其实也没啥太大难度 自认为这种使用方式主要提供了一种通过模板偏特化来实现的类型
  • 字符设备驱动相关函数

    Linux内核中 a 使用cdev结构体来描述字符设备 b 通过其成员dev t来定义设备号 分为主 次设备号 以确定字符设备的唯一性 c 通过其成员file operations来定义字符设备驱动提供给VFS的接口函数 如常见的open
  • ubuntu 与 windows terminal zsh 美化教程

    ubuntu 与 windows terminal zsh 美化教程 安装 zsh 和 oh my zsh 选择与安装主题 使用自带的主题 安装 powerlevel10k 主题 1 下载 p10k 主题 2 下载 Meslo LG M R
  • io使用率高运行堵塞怎么解决?linux系统由io使用率高引起的运行堵塞的解决方法

    1 在宝塔查看服务器负载100 而cpu和内存使用率都正常 输入top命令查看平均负载 查看结果负载果然很高 2 接着查看io使用情况 使用iotop工具 安装 yum install iotop 运行命令 iotop 如果安装不上是因为i
  • 实体类(VO,DO,DTO)的划分

    经常会接触到VO DO DTO的概念 本文从领域建模中的实体划分和项目中的实际应用情况两个角度 对这几个概念进行简析 得出的主要结论是 在项目应用中 VO对应于页面上需要显示的数据 表单 DO对应于数据库中存储的数据 数据表 DTO对应于除
  • Spring学习笔记2:注解开发、AOP思想、整合Mybatis、事务

    文章目录 7 使用注解开发 7 1 属性如何注入 1 Component 2 Value 7 2 衍生的注解 7 3 自动装配 7 4 作用域 1 Scope singleton 7 5 小结 9 使用java的方式配置Spring 9 1
  • flink连接kafka报:org.apache.kafka.common.errors.TimeoutException: Timeout expired while fetching topic

    报错信息 Caused by org apache flink runtime JobException Recovery is suppressed by NoRestartBackoffTimeStrategy at org apach
  • 跑通SOLOV1-V2实例分割代码,并训练自己的数据集。

    系统平台 Ubuntu18 04 硬件平台 RTX2080 super cuda和cudnn版本 cuda10 0 cudnn 7 5 6 pytorch版本 pytorch1 2 0 环境安装 创建solo虚拟环境 conda creat
  • 图(一)之邻接表Adjacency List

    开始攻克图的算法 先从最简单的存储开始实现 本文关于邻接表的实现 邻接表是图的存储中最简单也是最基本的存储结构 基于链表的思想实现的 在邻接表中 对于中的每个顶点建立一个单链表 第i个单链表中的节点表示依附于顶点的vi的边 每个节点由3个域