图的存储结构
时间:2019-09-03
本文章向大家介绍图的存储结构,主要包括图的存储结构使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
网的邻接矩阵
const int MAXN = 100; const int LIM = 0x3f3f3f3f;//无穷大 struct MGraph { int vexs[MAXN];//顶点表 int arc[MAXN][MAXN];//邻接矩阵 int numEdges, numVertexes;//边,顶点的数量 }; void CreatMGraph(MGraph *G) { int i, j, k, w; cout << "请输入顶点和边的数量:"; cin >> G->numVertexes >> G->numEdges; for (i = 0; i < G->numVertexes; i++)//建立顶点表 cin >> G->vexs[i]; for (i = 0; i < G->numVertexes; i++)//邻接矩阵的初始化 for (j = 0; j < G->numVertexes; j++) G->arc[i][j] = LIM; for (k = 0; k < G->numEdges; k++) { cout << "请输入(vi-vj)的标识和权:"; cin >> i >> j >> w; G->arc[i][j] = w; G->arc[j][i] = G->arc[i][j]; } }
无向图的邻接表
const int MAXN = 10000; struct EdgeNode //边表节点 { int adjvex;//邻接点域(有向图中弧头下标) int Weight;//权值 EdgeNode *next;//指向下一个边表 }; struct VertexNode //顶点表节点 { char data;//顶点域 EdgeNode *firstedge;//边表头指针 }; struct GraphAdjList//图 { VertexNode adjList[MAXN];//顶点表数组 int numVertexea, numEdges;//图中顶点数和边数 }; void CreatALGraph(GraphAdjList *G) { int i, j, k; EdgeNode *e; cout << "请输入顶点数和边数" << endl; cin >> G->numVertexea >> G->numEdges; for (i = 0; i < G->numVertexea; i++) { cin >> G->adjList[i].data;//输入顶点信息 G->adjList[i].firstedge = NULL;//边表制空 } for (k = 0; k < G->numEdges; k++)//头插法 { cout << "输入边(vi,vj)上的顶点序号:" << endl; cin >> i >> j; EdgeNode *e = new EdgeNode; e->adjvex = j; e->next = G->adjList[i].firstedge; G->adjList[i].firstedge = e; e = new EdgeNode; e->adjvex = i; e->next = G->adjList[j].firstedge; G->adjList[j].firstedge = e; } }
有向图的十字链表
struct EdgeNode//边表 { int headVex, tailVex;//弧的起点和终点在顶点表中的下标 EdgeNode *hLink, *tLink;//指向终点,起点相同的下一条边 }; struct VexNode//顶点节点 { int data;//顶点数据 EdgeNode *firstin;//指向第一个入度边表 EdgeNode *firstout;//指向第一个出度边表 }; struct Graph { VexNode List[100];//定点表的建立 int vexnum, edgenum;//顶点和边的数量 }; void creat(Graph *G) { cout << "请输入顶点和边的数量:"; cin >> G->vexnum >> G->edgenum; for (int i = 0; i < G->vexnum; i++) { cout << "输入顶点:"; cin >> G->List[i].data; G->List[i].firstin = G->List[i].firstout = NULL;//指针初始化 } for (int i = 0; i < G->edgenum; i++) { int x,y; cout << "读入(vi-vj):"; cin >> x >> y;//头尾的下标,若x,y不是对应的下标则需要自己写一个查找函数找到下标 EdgeNode *p = new EdgeNode; p->tailVex = x;//头插法 p->headVex = y; p->hLink = G->List[y].firstin; p->tLink = G->List[x].firstout; G->List[i].firstin = p; G->List[i].firstout = p; } }
无向图的邻接多重表
struct EdgeNode//顶点表节点 { int ivex, jvex;//两个顶点的下标 EdgeNode *iLink, *jLink;//指向依附于ivex和jvex的下一条边 }; struct VexNode//边表 { int data; EdgeNode *firstedge;//指向改顶点的第一个边节点 }; struct Graph//总图 { VexNode list[100];//顶点表 int vexnum, edgenum; }; void creat(Graph *G) { cout << "请输入顶点和边数:"; cin >> G->vexnum >> G->edgenum; for (int i = 0; i < G->vexnum; i++)//顶点表初始化 { cin >> G->list[i].data; G->list[i].firstedge = NULL; } for (int i = 0; i < G->edgenum; i++) { int a, b; EdgeNode *p = new EdgeNode; cout << "请输入(vi-vj)的i,j下标"; cin >> a >> b; p->ivex = a; p->jvex = b; p->iLink = G->list[a].firstedge; p->jLink = G->list[b].firstedge; G->list[a].firstedge = p; G->list[b].firstedge = p; } }
原文地址:https://www.cnblogs.com/JMWan233/p/11452228.html
- asp.net mvc脚手架代码生成工具
- Page.FindControl方法找不到指定控件的原因
- Silverlight 2 DispatcherTimer和通过XAML创建UI元素
- 腾讯移动安全实验室发布《2013年手机安全报告》
- 自定义Unity 容器的扩展 --- Unity Application Block Event Broker
- LINQ to SQL集成到应用程序中需考虑的一些问题
- WCF的追踪分析工具——SvcPerf
- 解决七牛云存储缓存加速Gravatar 头像图片路径url 参数失效的问题
- 命令行解析的规则以及Command Line Parser Library
- 简单代码让WordPress 支持电子邮箱(Email)作为登录名
- .NET Migration工具
- 如何有效监控.NET 应用程序
- 写入Ring Buffer
- Enterprise Library 4 缓存快速入门
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法