代码如下:

#include <iostream>
#include <queue>
using namespace std;
typedef int InfoType;
typedef int VertexType;
const int MaxVertexNum = 30;class ArcNode
{friend class OLGraph;friend class VertexNode;
private:int tailvertex, headvertex;ArcNode *hlink, *tlink;InfoType info;
};class VertexNode
{friend class OLGraph;
private:VertexType vertex;ArcNode *firstin, *firstout;
};class OLGraph
{public:OLGraph() {Init_vis();};void CreateOLgraph();int  GetOut_degree(VertexType v);int  GetIn_degree(VertexType v);void Init_vis(){for (int i = 0; i < MaxVertexNum; i++) vis[i] = false;//注意是MaxVertexNum,不是vertexNum};void DFS_Node(int i);void BFS_Node(int i);void DFStraverse();void BFStraverse();int LocateVertex(VertexType v);//通过结点信息查找其序号void Visit(int v){cout << xlist[v].vertex << " ";};
private:void DFS(int  i);VertexNode xlist[MaxVertexNum];int vertexNum, edgeNum;bool vis[MaxVertexNum];
};int OLGraph::LocateVertex(VertexType v)
{for (int i = 0; i < vertexNum; i++){if (xlist[i].vertex == v) return i;}
}void OLGraph::CreateOLgraph()
{ArcNode *p;cout << "请输入顶点数和边数" << endl;cin >> vertexNum >> edgeNum;for (int i = 0; i < vertexNum; i++){cout << "请输入第" << i << "个顶点信息:" << endl;cin >> xlist[i].vertex;xlist[i].firstin = nullptr;xlist[i].firstout = nullptr;}cout << "下面输入边表信息" << endl;for (int i = 0; i < edgeNum; i++){VertexType v1, v2;//v1--->v2cout << "输入边<i,j>对应的顶点信息i,j" << endl;cin >> v1 >> v2;int p_v1 = LocateVertex(v1);int p_v2 = LocateVertex(v2);p = new ArcNode;p->tailvertex = p_v1;p->headvertex = p_v2;p->tlink = xlist[p_v1].firstout;xlist[p_v1].firstout = p;p->hlink = xlist[p_v2].firstin;xlist[p_v2].firstin = p;}
}int  OLGraph::GetOut_degree(VertexType v)
{int i = LocateVertex(v);ArcNode *p;int cnt = 0;for (p = xlist[i].firstout; p; p = p->tlink) cnt++;return cnt;
}int OLGraph::GetIn_degree(VertexType v)
{int i = LocateVertex(v);ArcNode *p;int cnt = 0;for (p = xlist[i].firstin; p; p = p->hlink) cnt++;return cnt;
}void OLGraph::DFS(int i)
{vis[i] = true;Visit(i);ArcNode *p;for (p = xlist[i].firstout; p; p = p->tlink){if (!vis[p->headvertex]){vis[p->headvertex] = true;DFS(p->headvertex);}}
}void OLGraph::DFS_Node(int i)
{DFS(i);cout << endl;Init_vis();
}void OLGraph::BFS_Node(int i)
{queue<int>q;vis[i] = true;q.push(i);ArcNode *p;while (q.size()){int t = q.front();q.pop();Visit(t);for (p = xlist[t].firstout; p; p = p->tlink){if (!vis[p->headvertex]){vis[p->headvertex] = true;q.push(p->headvertex);}}}cout << endl;Init_vis();
}void OLGraph::DFStraverse()
{for (int i = 0; i < vertexNum; i++){if (!vis[i]){vis[i] = true;DFS(i);}}cout << endl;Init_vis();
}void OLGraph::BFStraverse()
{for (int i = 0; i < vertexNum; i++){if (!vis[i]){queue<int>q;vis[i] = true;q.push(i);ArcNode *p;while (q.size()){int t = q.front();q.pop();Visit(t);for (p = xlist[t].firstout; p; p = p->tlink){if (!vis[p->headvertex]){vis[p->headvertex] = true;q.push(p->headvertex);}}}}}cout << endl;Init_vis();
}int main()
{OLGraph g;g.CreateOLgraph();cout << "bfs:" << endl;g.BFStraverse();cout << "dfs:" << endl;g.DFStraverse();VertexType  v;cin >> v;cout << "结点" << v << "的入度为:" << endl;cout<<g.GetIn_degree(v)<<endl;cout << "结点" << v << "的出度为:" << endl;cout << g.GetOut_degree(v) << endl;cin >> v;cout << "结点" << v << "的入度为:" << endl;cout << g.GetIn_degree(v) << endl;cout << "结点" << v << "的出度为:" << endl;cout << g.GetOut_degree(v) << endl;int p;cin >> p;g.BFS_Node(p);g.DFS_Node(p);return 0;
}

测试结果:

C++ class实现十字链表存储的图(完整代码)相关推荐

  1. C++ class实现邻接矩阵存储的图(完整代码)

    代码如下: #include <iostream> #include <queue> using namespace std; typedef int VertexType; ...

  2. C++ class实现邻接表存储的图(完整代码)

    代码如下: #include <iostream> #include <queue>using namespace std; const int MaxVertexNum = ...

  3. 图的十字链表存储结构

    前面介绍了图的邻接表存储法,本节继续讲解图的另一种链式存储结构--十字链表法. 与邻接表不同,十字链表法仅适用于存储有向图和有向网.不仅如此,十字链表法还改善了邻接表计算图中顶点入度的问题. 十字链表 ...

  4. 图的十字链表存储法详解

    前面介绍了图的邻接表存储法,本节继续讲解图的另一种链式存储结构--十字链表法. 与邻接表不同,十字链表法仅适用于存储有向图和有向网.不仅如此,十字链表法还改善了邻接表计算图中顶点入度的问题. 十字链表 ...

  5. 图十字链表并求度c语言,利用十字链表存储树结构(便于同时求出某一点的入度与出度)------C语言实现...

    #include #include #include /* 利用十字链表存储有向图,可用于同时查找某个顶点的出度与入度: */ typedef struct edge{//顶点表 int headve ...

  6. 5.3稀疏矩阵的十字链表存储

    十字链表产生原因:当矩阵的非零元个数和位置在操作过程中变化较大时,就不宜采用顺序存储结构来表示三元组的线性表. 十字链表特点: 每一个非零元开用含5个域的结点表示,其中i.j和e这3个域分别表示该非零 ...

  7. 有向图的十字链表存储

    /* c7-3.h 有向图的十字链表存储表示 */#define MAX_VERTEX_NUM 20typedef struct ArcBox{int tailvex,headvex; /* 该弧的尾 ...

  8. c语言建立并存储树,利用十字链表存储树结构(便于同时求出某一点的入度与出度)------C语言实现...

    #include #include #include /* 利用十字链表存储有向图,可用于同时查找某个顶点的出度与入度: */ typedef struct edge {//顶点表 int headv ...

  9. 稀疏矩阵十字链表类java_稀疏矩阵的十字链表存储表示

    typedef struct OLNode{ int  i,j;                 //该非零元的行列下标 ElemType    e; struct  OLNode    *right ...

最新文章

  1. tf.io.gfile.glob 遍历文件
  2. Nginx 跨域使用字体
  3. Microsoft Office PowerPoint 2020中文版
  4. 安卓系统辅助功能中的指针停止移动后点击是什么?OTG
  5. 在生产环境下处理EFCore数据库迁移的五种方法
  6. 为考试而准备1——无线WCDMA 网规精选(04年)
  7. Android Studio下载安装教程及开发环境搭建
  8. CTF-MISC杂项题1
  9. 实体经济不改变经营思路和销售模式
  10. 区块链 智能合约是有状态的吗
  11. Atitit. 衡量项目规模 ----包含的类的数量 .net java类库包含多少类 多少个api方法??
  12. 关于火狐插件总结。。。
  13. web前端开发基础入门篇(一)
  14. @SpringBootApplication注解的意思
  15. unbuntu下gedit编辑花屏(重影 )问题解决
  16. 忆阻器类脑芯片与人工智能
  17. win10重启电脑Java环境变量丢失问题
  18. mPaaS 服务端核心组件:消息推送 MPS 架构及流程设计
  19. MyBatis的Dao层实现方式
  20. matlab 局部极值点,matlab 图像局部求极值

热门文章

  1. 【QGIS入门实战精品教程】9.1:QGIS构建泰森多边形(Thiessen Polygon)实例精解
  2. 基于JavaScript 数组的经典程序应用源码(强烈建议收藏)
  3. 【摄影测量原理】第二章:单幅影像解析基础
  4. 【Microstation】不能从对话框中装载/创建类型为 ‘HTML‘,id =41510001 的对话框条目,该对话框为: “文本编辑器 - 字处理器“,GCSDIALOG 已装载。
  5. Android之glide加载圆形图片地址异常监听
  6. Android之SubsamplingScaleImageView加载长图不能放缩问题
  7. Android之用setColorFilter在ImageView上面覆盖一层灰色的图层
  8. C和指针之反转字符串
  9. linux之nautilus .命令浏览当前文件目录
  10. linux之tmp文件夹