数据结构图的基本操作--邻接表法(不包括深度、广度算法)
来源:互联网 发布:php程序员简历项目经验 编辑:程序博客网 时间:2024/06/05 20:16
基本操作代码如下
#include <iostream>#include <cstdlib>using namespace std; #define MAX_VERTEX_NUM 20#define ERROR -1int visited[10000];typedef struct arcnode//结点的组成域{int adjvex;struct arcnode *nextarc;//指向下一条弧的指针int *info;//该弧相关信息指针}arcnode;typedef struct vnode{//表头结点int data;//结点名字arcnode *firsarc;int value;}vnode,adjlist[MAX_VERTEX_NUM];typedef struct{//图adjlist vertices;int vexnum, arcnum;//当前顶点数,弧数int kind;}algraph;int LocateVex(algraph &G, int &v1);void creategraph(algraph &G,int v,int vr){arcnode *p, *q;int v1, v2;int i, j, k,n;G.vexnum = v;G.arcnum = vr;cout << "录入各个结点名字:" << endl;for (i = 0; i < v; i++)//录入顶点名字,值,且将依附该顶点的第一条指针附空{cin >> G.vertices[i].data;G.vertices[i].firsarc = NULL;}cout << "输入弧头弧尾,创建边:" << endl;for (k = 0; k<G.arcnum; k++) //创建边,并连接头结点 {cin >> v1; //v1为弧尾 cin >> v2; //v2为弧头 i = LocateVex(G, v1); j = LocateVex(G, v2);if (G.vertices[i].firsarc == NULL) //如果链表为空新建一个表节点,让头节点的指针指向该表节点 {p = (arcnode *)new arcnode;G.vertices[i].firsarc = p;q = G.vertices[i].firsarc;}else //链表的插入 {q = G.vertices[i].firsarc;//获取头结点的表头指针 for (n = 0; n<G.arcnum; n++, q = q->nextarc)//将q指针移动至链表的尾巴处 {if (!q->nextarc)break;}p = (arcnode *)new arcnode;q->nextarc = p; //将该边(弧)加入到链表中 q = q->nextarc;}q->adjvex = j; //记录弧头的索引 q->nextarc = NULL;}cout << "图构建成功!"<<endl;}void destory(algraph &G)//销毁该图{for (int i = 0; i < G.vexnum; i++){G.vertices[i].firsarc = NULL;}}int LocateVex(algraph &G, int &v1) //查找节点V1在图G的存储节点数组中的索引位置 {int i;for (i = 0; i<G.vexnum; i++){if (G.vertices[i].data == v1) //如果数组中有这个节点,返回该节点在数组中的索引 return i;}if (i >= G.vexnum)return ERROR;elsereturn 0;}int getvex(algraph &G,int v)//得到定点v的值{for (int i = 0; i < G.vexnum; i++){if (v == G.vertices[i].data)return G.vertices[i].value;}return ERROR;}void putvex(algraph &G,int v)//为定点v录入值{cout << "输入结点" << v << "值:" << endl;for (int i = 0; i < G.vexnum; i++){if (v == G.vertices[i].data)cin >> G.vertices[i].value;}}int firstadjvex(algraph &G,int v){for (int i = 0; i < G.vexnum;i++)if (G.vertices[i].data == v)cout << G.vertices[G.vertices[i].firsarc->adjvex].data << endl;return 0;}int next(algraph &G, int v, int w){arcnode *p=NULL;for (int i = 0; i < G.vexnum;i++)if (G.vertices[i].data == v)p = G.vertices[i].firsarc;if (G.vertices[p->adjvex].data == w&&p->nextarc != NULL)cout << G.vertices[p->nextarc->adjvex].data << endl;elsefor (int i = 0; i < G.arcnum; i++){p = p->nextarc;if (G.vertices[p->adjvex].data == w&&p->nextarc != NULL)cout << G.vertices[p->nextarc->adjvex].data << endl;else if (p->nextarc != NULL)continue;elsereturn ERROR;}}void shuchu(algraph &G){arcnode *p;for (int i = 0; i < G.vexnum; i++){if (G.vertices[i].data == 0)continue;else{cout << G.vertices[i].data << "->";p = G.vertices[i].firsarc;for (int j = 0; j < G.arcnum; j++){if (p != NULL){cout << G.vertices[p->adjvex].data << "->";p = p->nextarc;}elsebreak;}cout <<"^"<< endl;}}}int main(){ algraph G;int v, vr;int v1,v2;cout << "输入图的节点数量,边的数量:" << endl;cin >> v >> vr;creategraph(G, v, vr);cout << "输入结点名字,用来给结点赋值:" << endl;cin >> v1;putvex(G, v1);cout << "输入结点名字,用来输出结点值:" << endl;cin >> v1;cout << "输出结点" << v1 << "的值:" << endl;if (getvex(G, v1)<0)cout << "该顶点未录入值" << endl;elsecout << getvex(G, v1) << endl;cout << "输入结点名字,用来输出结点的第一个邻接结点:" << endl;cin >> v1;cout << "该结点为:" << endl;firstadjvex(G, v1);cout << "" << endl;cout << "输入结点v1,并输入结点v1的某个邻接结点v2,用来输出v1的邻接结点中v2的下一个结点:" << endl;cin >> v1 >> v2;cout << "该结点为:" << endl;next(G, v1, v2);cout << "该邻接表输出结果为:" << endl;shuchu(G);system("pause");return 0;}
0 0
- 数据结构图的基本操作--邻接表法(不包括深度、广度算法)
- 图基本算法 图搜索基于邻接表的(广度优先、深度优先)
- 图的基本操作:图的创造(基于邻接表)、深度搜索(DFS)、广度搜索(DFS)
- 数据结构图的数组表示法以及深度,广度遍历
- 图的深度优先和广度优先遍历算法(用邻接表作为存储结构)
- 图邻接链表基本操作--广度优先、深度优先、拓扑排序
- 图的深度、广度优先搜索(邻接表)
- 图的广度与深度搜索(邻接链表)
- 图(邻接表)的深度、广度优先遍历
- 数据结构图的深度遍历和广度遍历源程序
- 数据结构图的建立和遍历(邻接表、邻接矩阵)
- 邻接表与邻接矩阵的深度优先算法和广度优先算法
- 图的邻接表(广度优先遍历,深度优先遍历,最小生成树(Kruskal算法))
- 图算法:1、邻接表实现图的深度优先遍历,广度优先遍历
- 邻接表存储图的深度优先、广度优先遍历非递归算法
- 数据结构图和图的基本操作
- 邻接表-图的遍历-广度和深度优先遍历
- 图的邻接表存储,以及广度深度遍历
- Ubuntu 16.04 自学之 JDK
- layer 实现弹窗提交信息
- Facebook登录申请流程
- Android09
- JavaSE总结 -集合框架collection
- 数据结构图的基本操作--邻接表法(不包括深度、广度算法)
- Ajax之判断用户名是否存在
- Android10
- 虚拟机上下载Android源码
- 自动创建hibernate的hbm.xml文件失败
- LDA的Gibbs抽样详细推理与理解
- 第十五周OJ项目K包含B的字符
- 学习Python运维之Shellinabox安装笔记
- Spring Jar包因为JDK版本报错