有向图的拓扑结构

#include<iostream>
#include<string>
#include<queue>#define MAXVEX 10using namespace std;class Graph{
private:struct EdgeNode{int adjvex;int weight;EdgeNode* next;};struct VertexNode{string data;EdgeNode *pFirstEdge;};struct AdjListGraph{VertexNode adjList[MAXVEX];int iVexNum;int iEdgeNum;};AdjListGraph *graph;public:Graph(){graph=new AdjListGraph();}int GetIndexByVertexVal(AdjListGraph *graph,string val){//通过点的值获取点的下标(邻接表中的下标) for(int i=0;i<graph->iVexNum;i++){if(val==graph->adjList[i].data){return i;}}return -1;}int CreateAdjListGraph(){//创建上图中的有向图 CreateAdjListGraph_s(graph);}int CreateAdjListGraph_s(AdjListGraph *&graph){graph->iVexNum=8;graph->iEdgeNum=9;graph->adjList[0].data="first";graph->adjList[1].data="second";graph->adjList[2].data="third";graph->adjList[3].data="forth";graph->adjList[4].data="fifth";graph->adjList[5].data="sixth";graph->adjList[6].data="seventh";graph->adjList[7].data="ninth";for(int i=0;i<graph->iVexNum;i++){graph->adjList[i].pFirstEdge=NULL;}int m=0;int n=2;EdgeNode *EdgeNode_1=new EdgeNode;EdgeNode_1->adjvex=n;EdgeNode_1->weight=0;EdgeNode_1->next=graph->adjList[m].pFirstEdge;graph->adjList[m].pFirstEdge=EdgeNode_1;m=1;n=3;EdgeNode *EdgeNode_2=new EdgeNode;EdgeNode_2->adjvex=n;EdgeNode_2->weight=0;EdgeNode_2->next=graph->adjList[m].pFirstEdge;graph->adjList[m].pFirstEdge=EdgeNode_2;m=1;n=5;EdgeNode *EdgeNode_3=new EdgeNode;EdgeNode_3->adjvex=n;EdgeNode_3->weight=0;EdgeNode_3->next=graph->adjList[m].pFirstEdge;graph->adjList[m].pFirstEdge=EdgeNode_3;m=2;n=4;EdgeNode *EdgeNode_4=new EdgeNode;EdgeNode_4->adjvex=n;EdgeNode_4->weight=0;EdgeNode_4->next=graph->adjList[m].pFirstEdge;graph->adjList[m].pFirstEdge=EdgeNode_4;m=3;n=4;EdgeNode *EdgeNode_5=new EdgeNode;EdgeNode_5->adjvex=n;EdgeNode_5->weight=0;EdgeNode_5->next=graph->adjList[m].pFirstEdge;graph->adjList[m].pFirstEdge=EdgeNode_5;m=3;n=5;EdgeNode *EdgeNode_6=new EdgeNode;EdgeNode_6->adjvex=n;EdgeNode_6->weight=0;EdgeNode_6->next=graph->adjList[m].pFirstEdge;graph->adjList[m].pFirstEdge=EdgeNode_6;m=4;n=6;EdgeNode *EdgeNode_7=new EdgeNode;EdgeNode_7->adjvex=n;EdgeNode_7->weight=0;EdgeNode_7->next=graph->adjList[m].pFirstEdge;graph->adjList[m].pFirstEdge=EdgeNode_7;m=5;n=7;EdgeNode *EdgeNode_8=new EdgeNode;EdgeNode_8->adjvex=n;EdgeNode_8->weight=0;EdgeNode_8->next=graph->adjList[m].pFirstEdge;graph->adjList[m].pFirstEdge=EdgeNode_8;m=6;n=7;EdgeNode *EdgeNode_9=new EdgeNode;EdgeNode_9->adjvex=n;EdgeNode_9->weight=0;EdgeNode_9->next=graph->adjList[m].pFirstEdge;graph->adjList[m].pFirstEdge=EdgeNode_9;return 1;}void DFS(int i){//深度优先搜索 cout<<"DFS"<<endl;bool visited[MAXVEX]={0};DFS_s(visited,i,graph);cout<<endl;}void DFS_s(bool *visited,int i,AdjListGraph* graph){cout<<graph->adjList[i].data<<" ";visited[i]=true;EdgeNode *pEdge=graph->adjList[i].pFirstEdge;while(pEdge){int j=pEdge->adjvex;if(!visited[j]){DFS_s(visited,j,graph);}pEdge=pEdge->next;}}void BFS(int i){//广度优先搜索 cout<<"BFS"<<endl;bool visited[MAXVEX]={0};BFS_s(visited,i,graph);cout<<endl;}void BFS_s(bool *visited,int i,AdjListGraph *graph){queue<int> Q;cout<<graph->adjList[i].data<<" ";visited[i]=true;Q.push(i);while(!Q.empty()){int iVex=Q.front();Q.pop();EdgeNode *pEdge=graph->adjList[iVex].pFirstEdge;while(pEdge){if(!visited[pEdge->adjvex]){cout<<graph->adjList[pEdge->adjvex].data<<" ";visited[pEdge->adjvex]=true;Q.push(pEdge->adjvex);}pEdge=pEdge->next;}}     }int GetVertexDegree(AdjListGraph *graph,string val){//计算出度和入度的和 int m=GetIndexByVertexVal(graph,val);int iCount=0;for(int i=0;i<graph->iVexNum;i++){if(i==m){EdgeNode *pEdgeOut=graph->adjList[i].pFirstEdge;while(pEdgeOut){//这里累加的是出度 ++iCount;pEdgeOut=pEdgeOut->next;}}else{EdgeNode *pEdgeIn=graph->adjList[i].pFirstEdge;while(pEdgeIn){//这里累加的是入度 if(pEdgeIn->adjvex==m){++iCount;}pEdgeIn=pEdgeIn->next;}}}return iCount;}
};int main(){Graph *g=new Graph();g->CreateAdjListGraph(); g->BFS(1);g->DFS(1);return 0;
}

https://blog.csdn.net/s634772208/article/details/45580333

数据结构:邻接表法存储有向图相关推荐

  1. 一一计划(Day 14)邻接表法存储图,BFS广度优先遍历,DFS深度优先遍历

    邻接表法存储 邻接表发存储需要时无权无向图.用数组+链表的方式完成 数组用来记录地点,链表来记录每一个地点对应的相邻地点 1.构造一个数据结构来存放数组的序号以及指针用来指向链表 2.创造结点,构建链 ...

  2. 无向图有向图的邻接表法建立

    目录 无向图的邻接表法建立 有向图的邻接表法 无向图的邻接表法建立 要求建立一个无向图,采用邻接表做为存储结构. 例如: 输入信息为:第一行给出图的顶点数n和边数e.第二行给出n个字符,表示n个顶点的 ...

  3. 数据结构之图的存储结构:邻接表法

    图的存储结构:邻接表法 产生条件: 邻接表法的定义: 邻接表法的特点: 邻接表法的代码定义: 邻接表法与邻接矩阵法的对比: 产生条件: 当用邻接矩阵存储时:空间复杂度为O(|v|^2),太大 邻接表法 ...

  4. 图的存储结构——邻接表法

    图的存储结构--邻接表法 一.邻接表 ​ 由顶点表和边表构成,顶点表由顶点域(data)和指向第一条邻接边的指针(firstarc)构成,边表(邻接表)结点由邻接点域(adjvex)和指向下一条邻接边 ...

  5. 图——图的存储结构(邻接矩阵和邻接表法)

    图的五种存储结构: 1.图的邻接矩阵表示法 图是由顶点和边或弧两部分组成.图的邻接矩阵(Adjacency Matrix)存储方式是用两个数组表示图,一个一维数组存储图中的顶点信息,一个二维数组(邻接 ...

  6. 图的存储——邻接表法

    文章目录 一.邻接表法 二.复杂度分析(G(V,E)) 1.无向图 2.有向图 总结(和邻接矩阵的对比) 一.邻接表法 使用一个顶点表存储顶点信息,每个顶点之后连接该顶点的相连边的信息(链表). 结构 ...

  7. 数据结构---邻接表的BFS

    数据结构-邻接表的BFS 原理:参考趣学数据结构 代码: 队列代码: #pragma once #define elemType int #define N 100 #include<stdli ...

  8. 数据结构---邻接表的DFS

    数据结构-邻接表的DFS 原理:参考趣学数据结构 代码: #include<stdio.h> #include<stdlib.h> #define typeNode int / ...

  9. dijkstra迪杰斯特拉算法(邻接表法)

    算法简易过程: 迪杰斯特拉算法(朴素) O(n^2) G={V,E} V:点集合 E:边集合 初始化时 令 S={某源点ear}, T=V-S= {其余顶点},T中顶点对应的距离(ear, Vi)值若 ...

  10. 邻接表形式存储图并且按广度优先搜索遍历的C语言实现

    用邻接表形式存储图并且按广度优先搜索打印遍历结果 #include<stdio.h> #define MAX_VERTEX_NUM 20//最多顶点个数 #define ERROR -1t ...

最新文章

  1. Oracle视图添加约束,Oracle的约束视图
  2. 【前段开发】行内元素和块级元素总结(HTML CSS)
  3. 开源倾情奉献:基于.NET打造IP智能网络视频监控系统(五)客户端介绍
  4. Oracle备份还原操作方法
  5. VXLAN配置实例(三)——VXLAN集中式双活网关
  6. mvc html的扩展,asp.net mvc - 使用Razor声明性视图中的MVC HtmlHelper扩展
  7. 易筋SpringBoot 2.1 | 第九篇:SpringBoot使用Redis内存数据库
  8. 并发编程常见面试题总结一
  9. 复变函数在计算机科学中的应用,复变函数的应用以及发展史
  10. 24.猫狗数据自定义训练
  11. NC65自定义参照 开发
  12. Java线程何时放弃CPU时间片
  13. Pray for 京阿尼——愿逝者安息,伤者早日康复
  14. 高频功率放大器输出为什么会有高次谐波
  15. 骗你不是人 硬盘传输速度提升100倍的方法
  16. 计算机用户凭据删除,win8系统如何删除保存的共享凭据(用户名和密码)
  17. 批处理 bat 改文件后缀名
  18. 康托展开(hdu1430)
  19. 快排解Top-K问题
  20. NST1001温度传感器驱动-FPGA

热门文章

  1. AAAI论文Joint Extraction of Entities and Overlapping Relations Using Position-Attentive Sequence阅读笔记
  2. Mybatis-02-对数据库的基本操作
  3. Flink 流批一体在阿里的落地
  4. 仅 1 年 GitHub Star 数翻倍,Flink 做了什么?
  5. python正则库安装_python中正则表达式regex库的使用
  6. python 下标 遍历列表_Python中遍历列表中元素的操作
  7. vs2015 ef 连接mysql_VS2015 + EF6连接MYSQL
  8. windows关于python虚拟机的设置以及安装使用virtualenv
  9. pppoe路由桥混合模式_192.168.1.1路由器怎么设置和登陆
  10. 基于Yolov5目标检测的物体分类识别及定位(二) -- yolov5运行环境搭建及label格式转换