邻接表

邻接表由第一数列的表头和每个表头对应连接的链表构成。每一个表头都是一个单链表表头。表头作为出发点,其链表内元素就是出发点可直接到达的目标点(也可以附加边权)。
图邻接表存储优势
1、支持有向图无向图
2、支持带边权和不带边权
3、支持自环和重边
4、适合处理稀疏图
图邻接表存储缺陷
相当于边表空间复杂度为o(n+m)m为边数。使用非常广泛的图的存储结构缺点很少QAQ。
测试数据:

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

测试输出;

1-<7>->3-<5>->4
2-<5>->3-<6>->4
3-<5>->2-<7>->1
4-<6>->2-<5>->1
<>内为边权

代码:

#include<iostream>
#include<string>
using namespace std;
#define MAX_VERTEX_NUM 20
#define ERROR -1typedef enum { DG, DN, UDG, UDN } GraphKind; //有向图、有向网、无向图、无向网
typedef int Status;
typedef string VertexType;// 图结点
typedef struct ArcNode {int adjvex; // 该弧所指向的顶点的位置 ArcNode* nextarc; // 指向下一条弧的指针 int dis; // 边权
}ArcNode, * ArcList;// 表头
typedef struct Vnode {VertexType data; // 顶点信息 ArcList firstarc; // 指向第一条依附该顶点弧的指针
}VNode, AdjList[MAX_VERTEX_NUM];typedef struct {AdjList vertices;int vexnum, arcnum; // 图的顶点树和弧数 int kind; // 图的种类
}ALGraph;Status InitFistarc(ArcList& A)
{A = (ArcList)malloc(sizeof(ArcNode));if (A == NULL)return ERROR;A->nextarc = NULL;return 1;
}int Locate(VertexType ver, ALGraph G)
{for (int i = 0; i < G.vexnum; i++) {if (ver == G.vertices[i].data)return i;}return ERROR;
}//头插法
//图
Status ArcInsert(ALGraph& G, int u, int v)
{ArcNode* newnode = (ArcNode*)malloc(sizeof(ArcNode));if (newnode == NULL)return ERROR;newnode->adjvex = v + 1;//因为Locate的到的下标从0开始newnode->nextarc = G.vertices[u].firstarc->nextarc;G.vertices[u].firstarc->nextarc = newnode;
}//网
Status ArcInsert(ALGraph& G, int u, int v, int w)
{ArcNode* newnode = (ArcNode*)malloc(sizeof(ArcNode));if (newnode == NULL)return ERROR;newnode->adjvex = v + 1;//因为Locate的到的下标从0开始newnode->dis = w;newnode->nextarc = G.vertices[u].firstarc->nextarc;G.vertices[u].firstarc->nextarc = newnode;
}Status CreateDG(ALGraph& G)//有向图
{cout << "请输入图的顶点数和弧数:\n";cin >> G.vexnum >> G.arcnum;for (int i = 0; i < G.vexnum; i++) {cout << "请输入第" << i + 1 << "个顶点的信息:\n";cin >> G.vertices[i].data;InitFistarc(G.vertices[i].firstarc);}//边信息VertexType u, v;for (int k = 0; k < G.arcnum; k++){cout << "请输入第" << k + 1 << "条边的信息(u,v):\n";cin >> u >> v;int i = Locate(u, G), j = Locate(v, G);if (i == -1 || j == -1)return ERROR;//G.vertices[i].firstarc.if (!ArcInsert(G, i, j))return 0;}return 1;
}Status CreateUDG(ALGraph& G)//无向图
{cout << "请输入图的顶点数和弧数:\n";cin >> G.vexnum >> G.arcnum;for (int i = 0; i < G.vexnum; i++) {cout << "请输入第" << i + 1 << "个顶点的信息:\n";cin >> G.vertices[i].data;InitFistarc(G.vertices[i].firstarc);}//边信息VertexType u, v;for (int k = 0; k < G.arcnum; k++){cout << "请输入第" << k + 1 << "条边的信息(u,v):\n";cin >> u >> v;int i = Locate(u, G), j = Locate(v, G);if (i == -1 || j == -1)return ERROR;//G.vertices[i].firstarc.if (!ArcInsert(G, i, j) || !ArcInsert(G, j, i))return 0;}return 1;
}Status CreateDN(ALGraph& G)//有向网
{cout << "请输入图的顶点数和弧数:\n";cin >> G.vexnum >> G.arcnum;for (int i = 0; i < G.vexnum; i++) {cout << "请输入第" << i + 1 << "个顶点的信息:\n";cin >> G.vertices[i].data;InitFistarc(G.vertices[i].firstarc);}//边信息VertexType u, v;for (int k = 0; k < G.arcnum; k++){cout << "请输入第" << k + 1 << "条边的信息(u,v):\n";cin >> u >> v;int i = Locate(u, G), j = Locate(v, G);if (i == -1)return ERROR;//G.vertices[i].firstarc.int w;cout << "请输入权值信息(w):\n";cin >> w;if (!ArcInsert(G, i, j, w))return 0;}return 1;
}Status CreateUDN(ALGraph& G)//无向网
{cout << "请输入图的顶点数和弧数:\n";cin >> G.vexnum >> G.arcnum;for (int i = 0; i < G.vexnum; i++) {cout << "请输入第" << i + 1 << "个顶点的信息:\n";cin >> G.vertices[i].data;InitFistarc(G.vertices[i].firstarc);//cout << InitFistarc(G.vertices[i].firstarc) << endl;}//边信息VertexType u, v;for (int k = 0; k < G.arcnum; k++){cout << "请输入第" << k + 1 << "条边的信息(u,v):\n";cin >> u >> v;int i = Locate(u, G), j = Locate(v, G);if (i == -1 || j == -1)return ERROR;//G.vertices[i].firstarc.int w;cout << "请输入权值信息(w):\n";cin >> w;if (!ArcInsert(G, i, j, w) || !ArcInsert(G, j, i, w))return 0;}return 1;
}Status CreateGraph(ALGraph& G)
{cin >> G.kind;switch (G.kind){case DG:return CreateDG(G);case DN:return CreateDN(G);case UDG:return CreateUDG(G);case UDN:return CreateUDN(G);default: return ERROR;}
}//CreateGraphvoid TraveGraph(ALGraph G)
{for (int i = 0; i < G.vexnum ; i++) {cout << G.vertices[i].data;ArcNode* p = G.vertices[i].firstarc->nextarc;while (p != NULL) {if (G.kind == 1 || G.kind == 3) {cout << "-<" << p->dis << '>';}cout << "->" << p->adjvex;p = p->nextarc;}cout << endl;}cout << "<>内为边权" << endl;
}int main()
{ALGraph G;cout << "请输入要创建的图的类型(有向图 0、有向网 1、无向图 2、无向网 3):\n";CreateGraph(G);TraveGraph(G);return 0;
}

【数据结构/C语言版】【图】邻接表存储相关推荐

  1. 《数据结构C语言版》——线性表详解,你一定能够看得懂学得会的宝典

    哈喽!这里是一只派大鑫,不是派大星.本着基础不牢,地动山摇的学习态度,从基础的C语言语法讲到算法再到更高级的语法及框架的学习.更好地让同样热爱编程(或是应付期末考试 狗头.jpg)的大家能够在学习阶段 ...

  2. 数据结构C语言版之线性表

    //顺序表: #include<stdio.h> #include<stdlib.h> #define maxlength 20 #define listincreament ...

  3. 【数据结构C语言版】课程实验-图的应用

    数据结构C语言版 - 图的应用 前言: 大二本科计算机科学与技术程序员一枚,总结几篇课后实验内容,希望可以帮助到大家. 软件:Devc++ 实验目的: 通过实验掌握图的基本存储原理,能够利用图模型存储 ...

  4. 数据结构图的邻接表存储结构

    图的邻接表存储 我们知道,数据之间的关系有 3 种,分别是 "一对一"."一对多" 和 "多对多",前两种关系的数据可分别用线性表和树结构存 ...

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

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

  6. 数据结构实践——操作用邻接表存储的图

    本文是针对[数据结构基础系列(7):图]的实践. [项目 - 操作用邻接表存储的图] 假设图G采用邻接表存储,分别设计实现以下要求的算法: (1)输出出图G中每个顶点的出度: (2)求出图G中出度最大 ...

  7. 数据结构——图的邻接表存储

    数据结构--图的邻接表存储 功能实现: (1)图的邻接矩阵的储存 (2)深度优先遍历 (3).广度优先遍历 (4)求结点的度 (5)判断图是否连通 (6)求最小生成树 参考代码 #include &l ...

  8. 稀疏矩阵的三元组存储方法c语言,数据结构C语言版 稀疏矩阵的三元组顺序表存储表示和实现...

    陈独秀的秘密 数据结构C语言版 稀疏矩阵的三元组顺序表存储表示和实现 P98 编译环境:Dev-C++ 4.9.9.2 日期:2011年2月8日 */ typedef int ElemType; // ...

  9. 严蔚敏数据结构C语言版——线性表的链式存储方式详细代码

    一.严蔚敏数据结构C语言版 由于书上的许多地方都是伪代码,所以下面的代码对课本上的做了一些改动,使代码能够正常运行 链表的定义即相关类型定义 typedef int ElementType; type ...

最新文章

  1. autoware使用rosbag数据生成路径点并进行路径规划(七)
  2. Java面试官:给Java面试者的八点建议
  3. Linux课程第十三天学习笔记
  4. 使用Spring Security 资源服务器来保护Spring Cloud 微服务
  5. linux下的ppp软件,linux下ppp拨号无线上网(示例代码)
  6. nginx 获取真实ip
  7. sql更新表的字段和主键
  8. 我的docker随笔4:docker常用命令
  9. Leetcode每日一题:80.remove-duplicates-from-sorted-array-ii(删除排序数组中的重复项Ⅱ)
  10. win8计算机用户名在哪里设置,windows8系统用户名微软ID和管理员账户概念详解
  11. ajax post常用请求头
  12. linux tcp文件分包_Linux内核参数优化
  13. 一维搜索之黄金分割法
  14. 箱形图适用于哪种数据_Excel 数据可视化:箱形图全面解析!
  15. 毛玻璃效果 php,CSS3打造磨砂玻璃背景效果
  16. Docker Harbor——拥有独特UI界面的私有仓库
  17. 异常:程序包org.apache.http不存在 的问题解析
  18. 响应式编程android,Android响应式编程(一)RxJava[入门基础]
  19. Stream流使用详解
  20. volatile 与处理器的嗅探技术

热门文章

  1. 基于指数平滑模型与ARIMA模型在苹果股价的预测应用
  2. 将QLV视频格式转换为MP4格式
  3. 用FreeMarker生成Word文档
  4. vue的生命周期函数
  5. CSP 201712-4 行车路线(100)
  6. 中职计算机应用专业课堂教学,新时期中职计算机专业课堂教学的创新应用
  7. RHCE认证考试心得(转)
  8. 用Jquey实现双击图片放大和触摸放大的功能。
  9. 【Mybatis】出现The error may involve defaultParameterMap错误
  10. 此文记录了我从研二下学期到研三上学期的找工历程,包括百度、腾讯、网易、移动、电信、华为、中兴、IBM八家企业的面试总结和心得--转...