图的邻接表储存方法和基本运算算法
包括
- 图的邻接表储存结构
- 图的邻接表储存结构的创建
- 图的输出
- 图的销毁
图的邻接表储存结构
#define MAXV 5 //矩阵长宽
#define INF 32767 //无穷
typedef struct ANode
{int adjvex; //该边的邻接点编号struct ANode* nextarc; //指向下一条边的指针int weight; //该边的相关信息,如权值
}ArcNode; //边结点的类型
typedef struct Vnode
{int info; //顶点的其他信息ArcNode* firstarc; //指向第一个边结点
}VNode; //邻接表的头结点类型
typedef struct
{VNode adjlist[MAXV]; //邻接表的头结点数组int n, e; //n定点数,e边数
}AdjGraph; //完整的图邻接表类型
示例邻接矩阵(先横再竖)
对应的图
总代码
#include<iostream>
using namespace std;#define MAXV 5 //矩阵长宽
#define INF 32767 //无穷
typedef struct ANode
{int adjvex; //该边的邻接点编号struct ANode* nextarc; //指向下一条边的指针int weight; //该边的相关信息,如权值
}ArcNode; //边结点的类型
typedef struct Vnode
{int info; //顶点的其他信息ArcNode* firstarc; //指向第一个边结点
}VNode; //邻接表的头结点类型
typedef struct
{VNode adjlist[MAXV]; //邻接表的头结点数组int n, e; //n定点数,e边数
}AdjGraph; //完整的图邻接表类型void CreateAdj(AdjGraph*& G, int A[MAXV][MAXV], int n, int e) //创建图的邻接表
{int i, j; ArcNode* p; //i,j计数变量G = (AdjGraph*)malloc(sizeof(AdjGraph)); //给G分配空间for (i = 0; i < n; i++)G->adjlist[i].firstarc = NULL; //给邻接表中所有头结点的指针域赋予初值for(i=0;i<n;i++) //检查邻接矩阵中的每个元素for(j=n-1;j>=0;j--)if (A[i][j] != 0 && A[i][j] != INF) //存在一条边{p = (ArcNode*)malloc(sizeof(ArcNode)); //创建一个节点pp->adjvex = j; //存放邻接点p->weight = A[i][j]; //存放权p->nextarc = G->adjlist[i].firstarc; //采用头插法插入节点pG->adjlist[i].firstarc = p;}G->n = n; G->e = e;
}void DispAdj(AdjGraph* G) //输出邻接表G
{int i; ArcNode* p; //指针p和计数变量ifor (i = 0; i < G->n; i++){p = G->adjlist[i].firstarc; //边结点cout << i; //边结点的编号cout << ":";while (p != NULL) //如果p邻接点不为空,输出p的编号和权值{cout << p->adjvex;cout <<"[";cout << +p->weight;cout << "]→";p = p->nextarc;}cout << " ∧\n"; //尾部}
}void DestroyAdj(AdjGraph*& G) { //销毁邻接表int i; ArcNode* pre, * p;for (i = 0; i < G->n; i++) { //扫描所有的单链表pre = G->adjlist[i].firstarc; //p指向第i个单链表的头结点if (pre != NULL) { p = pre->nextarc;while (p != NULL){free(pre); //释放prepre = p; p = p->nextarc;}free(pre); //最后循环结束,释放pre}}free(G); //释放邻接表指针
}int main() {int A[MAXV][MAXV] = { {0,1,0,1,1},{1,0,1,1,0},{0,1,0,1,1},{1,1,1,0,1},{1,0,1,1,0} }; //我们的邻接矩阵数组AdjGraph *G = new AdjGraph; //邻接表指针int n = 5;int e = 8;CreateAdj(G, A, n, e); //创建图的邻接表DispAdj(G); //输出图的邻接表DestroyAdj(G); //释放图的邻接表
}
输出结果:
第一列数字表示顶点,中括号前的数字表示顶点,中括号里的数字表示权值,∧表示结尾。
图的邻接表储存方法和基本运算算法相关推荐
- 图采用邻接表存储,设计一个算法,判断顶点i和顶点j(i!=j)之间是否有路径
算法思想:只要以i为起点,进行遍历,只要遍历过程中遇到了j,就证明有路径. 算法代码 int DFSTravel(AGraph *G,int i,int j) {int k;for(k=0;k< ...
- 数据结构 图的邻接表和邻接矩阵实现———c语言
图的邻接矩阵实现 逻辑结构分为两部分:V和E集合.因此,用一个一维数组存放图中所有顶点数据;用一个二维数组存放顶点间关系(边或弧)的数据,这个二维数组称为邻接矩阵.邻接矩阵又分为有向图邻接矩阵和无向图 ...
- 【数据结构】邻接表的储存结构 建立图的邻接表算法
[数据结构]邻接矩阵及其实现 一个图的邻接矩阵的表示是唯一的,但其邻接表表示不唯一,这是因为在邻接表结构中,各便表结点的链接次序取决于建立邻接表时的算法以及输入的次序. 一般而言邻接矩阵适合存储稠密图 ...
- mysql 邻接表_图的邻接表存储结构详解
通常,图更多的是采用链表存储,具体的存储方法有 3 种,分别是邻接表.邻接多重表和十字链表. 本节先讲解图的邻接表存储法.邻接表既适用于存储无向图,也适用于存储有向图. 在具体讲解邻接表存储图的实现方 ...
- 数据结构——图的邻接表存储
数据结构--图的邻接表存储 功能实现: (1)图的邻接矩阵的储存 (2)深度优先遍历 (3).广度优先遍历 (4)求结点的度 (5)判断图是否连通 (6)求最小生成树 参考代码 #include &l ...
- 图的邻接表的链表实现
图的邻接表的实现 正确定义图结点 掌握图的邻接表表示法 根据图的邻接表输出邻接点 利用邻接表求各点的度 这里使用链表连接各个结点构造图的邻接表:很多术语可能不对,多多包涵: public class ...
- c语言实现无向图的邻接表储存
图有一种邻接表储存结构,这里以无向图为例,输入图的参数,构造并输出图的邻接表. #include<stdio.h> #include<stdlib.h> #define MAX ...
- C/C++二级指针概念及应用(有向图的邻接表(拓扑排序)、有向网图的邻接表、树的孩子表示)
目录 一.概述 例1: 例2: 代码: 二.实例 1.有向图的邻接表(拓扑排序) 2.有向网图的邻接表 3.树的孩子表示 一.概述 二级指针:指向指针的指针.一般需要修改地址的时候会用到二级指针. 注 ...
- 数据结构——图-有向带权图的邻接表
#include <stdio.h> #include <stdlib.h> #define VertexType char //顶点的数据类型(char) #define V ...
最新文章
- python奥运五环_python如何画奥运五环
- 大话android 进程通信之AIDL
- 关于HTTP_CLIENT_IP,HTTP_X_FORWAR
- 5、Dcoker 容器数据卷用-v命令添加
- 九、“行胜于言车胜马,负重致远向前途”
- MSDN中Enumerating All Processes枚举所有进程事例编译错误解析办法
- Flutter文本组件Text
- Nonebot部署机器人常见问题
- declares(declares是什么意思)
- 俄罗斯方块c语言程序方案设计,c语言俄罗斯方块游戏程序方案设计书报告.doc
- xxl-job分布式任务调度平台
- 圆角矩形大小怎么调整html,html圆角矩形
- dwg如何转换成pdf格式?
- Private,Public,Protected
- 谷歌学术里面的代码查找
- python用input输入list_python怎么用input函数输入一个列表
- iOS中使用storyboard进行布局
- 非接环境(PPSE)和接触环境(PSE)的FCI有什么区别
- 关于力控无法插入图片
- 论文的参考文献,添加交叉引用,实现编号自动更新,及编号1无法自动更新问题解决方法!!!