邻接表存储无向图
来源:互联网 发布:电脑防蓝光软件 编辑:程序博客网 时间:2024/06/05 16:21
adjacentList.h
#pragma once//邻接表存储的无向图# include<iostream># include"vertex.h"typedef struct _listNode//表节点{ int iAdjaVeretex;//邻接点编号 int info;//边上信息 struct _listNode*next=NULL;}listNode;typedef struct _vertexNode//顶点节点{ int iVertex;//顶点编号 listNode* fistEdge=NULL;//边表头指针}vertexNode;class undiGraph{public: undiGraph(int numOfVertex , int numOfEdge ); ~undiGraph(); void crete(); void setVisitedFalse();//将访问标志设为flase,每次遍历前都需调用此函数 void DFS(int i);//深度优先搜索 从第i+1个结点开始 void BFS(int i);//广度优先搜索private: vertex* vertexElem;//顶点元素 int iVertex; int iEdge; vertexNode *verNode;//顶点节点 void addListNode(int a, int b, int _info);//给编号为a的顶点添加一个表节点};
adjacentList.cpp
# include"adjacentList.h"# include<iostream># include"myQuene.h"using namespace std;undiGraph::undiGraph(int numOfVertex = 0, int numOfEdge = 0):iVertex(numOfVertex),iEdge(numOfEdge){ vertexElem = new vertex[numOfVertex]; verNode = new vertexNode[numOfVertex];}undiGraph::~undiGraph(){ for (int i = 0;i < iVertex;++i)//销毁所有的表结点 //每次循环,销毁第i+1个顶点结点的表结点 { listNode *p = verNode[i].fistEdge; while (p) { listNode *p1 = p; p = p->next; delete p1; } } delete []vertexElem; delete[]verNode;}void undiGraph::crete(){ cout << "请依次输入顶点信息:" << endl; char elem; for (int i = 0;i < iVertex;i++) { cin >> elem; vertexElem[i].data = elem; verNode[i].iVertex = i; } cout << "请依次输入有向图中相关联的顶点(0表示第一个顶点)及弧的权值:" << endl; int a, b; double weight; for (int j = 0;j < iEdge;j++) { cin >> a >> b >> weight; addListNode(a, b, weight); addListNode(b, a, weight); }}void undiGraph::addListNode(int a, int b, int _info)//给编号为a的顶点添加一个表节点{ listNode*(&p) = verNode[a].fistEdge;//第一次添加时,需要改变firstEdge, 这里打错字了就不改了 if (p == NULL)//第一次添加,为NULL { p= new listNode; p->iAdjaVeretex = b; p->info = _info; return; } listNode*p1 = verNode[a].fistEdge; while (p1->next!= NULL) { p1 = p1->next; } listNode *p2 = new listNode; p2->iAdjaVeretex = b; p2->info = _info; p1->next = p2;}void undiGraph::setVisitedFalse(){ for (int i = 0;i < iVertex;++i) vertexElem[i].isVisited = false;}void undiGraph::DFS(int i)//深度优先搜索 从第i+1个结点开始 { if (!vertexElem[i].isVisited)//如果第i+1个节点未被访问,则访问该节点 { vertexElem[i].visited(); vertexElem[i].isVisited = true; } else return; //在第i+1个顶点的所有邻接点中调用DFS listNode*p = verNode[i].fistEdge; while (p)//第i+1个节点 { DFS(p->iAdjaVeretex); p = p->next; }} void undiGraph::BFS(int i)//广度优先搜索{ if (!vertexElem[i].isVisited)//如果第i+1个节点未被访问,则访问该节点 { vertexElem[i].visited(); vertexElem[i].isVisited = true; } else return; myQuene<int> q(30); q.in(i); int x; while (!q.empty())//只要队列不为空 { q.out(x); listNode*p = verNode[x].fistEdge; while (p) { if (!vertexElem[p->iAdjaVeretex].isVisited)//如果节点未被访问,则访问该节点 { vertexElem[p->iAdjaVeretex].visited(); vertexElem[p->iAdjaVeretex].isVisited = true; q.in(p->iAdjaVeretex); } p = p->next; } }}
main.cpp
# include<iostream># include"adjacentList.h"using namespace std;int main(){ undiGraph myUndiGraph(8, 9); myUndiGraph.crete(); myUndiGraph.setVisitedFalse(); cout << "深度优先遍历:" << endl; myUndiGraph.setVisitedFalse(); myUndiGraph.DFS(0); cout << endl; cout << "广度优先遍历:" << endl; myUndiGraph.setVisitedFalse(); myUndiGraph.BFS(0); cout << endl; system("pause"); return 0;}
0 0
- 邻接表存储无向图
- 无向图的邻接表存储
- 无向图邻接表的存储结构
- 邻接多重表存储无向图以及有关操作
- 无向图的邻接多重表存储结构
- 无向网图的邻接表存储结构
- 数据结构--无向图的邻接多重表存储结构
- 邻接表无向图
- 用邻接链表存储无向图和有向图
- 利用邻接表存储结构创建一个图(有向、无向)
- 无向图的邻接表算法
- 无向图的邻接表算法
- 邻接表无向图的介绍
- 无向图的邻接表
- 用邻接表实现无向图
- 无向图的邻接表储存
- 邻接表无向图 C++详解
- 无向图 邻接表 建立
- 题目1475:IP数据包解析
- 算法时间复杂度(二)
- SQL中LIKE '%' 与 PreparedStatement的占位符 ? 使用方法
- Java 直接运行jar里的某个类
- POJ1611 The Suspects
- 邻接表存储无向图
- 根据内容获取web高度(动态获取web高度)
- 【Java学习20170427】Servlet过滤器和监听器
- 完数
- Android访问assets本地Json文件
- Animate.css 动画库介绍
- 利用vultr的vps搭建ikev2类型vpn
- 面向对象多态
- 服务-samba