C++ 图

#include <iostream>
#include <string>
#include <queue>
#include <stack>
using namespace std;  bool visited[100]; //顶点是否已被访问的标志数组  //十字链表存储图
//弧结点
struct ArcBox
{  //弧结点头尾结点位置  int tailvex;  int headvex;  //弧头和弧尾相同的弧的链域  ArcBox *hlink;  ArcBox *tlink;
};  //顶点节点
struct VexNode
{  string data; //顶点名称  ArcBox *firstin; //指向第一条入弧  ArcBox *firstout; //指向第一条出弧
};  class OLGraph
{
private:  VexNode *xlist; //指向顶点数组的指针  int vexnum;  //顶点数  int arcnum;  //弧数  int maxnum; //顶点数的最大值
public:  OLGraph(int num=20)  {  xlist=new VexNode[num];  maxnum=num;  }  int Locate_Vex(string v)  {  for(int i=0;i<vexnum;i++)  {  if(xlist[i].data==v)  return i;  }  return -1;  }  void CreateDG_OLG()  {  //构造有向图  string v1,v2;  int i,j,k;  cout<<"输入顶点数和边的数目:";  cin>>vexnum>>arcnum;  while(vexnum>maxnum)       {  cout<<"顶点数目大于最大限制,请重新输入:";  cin>>vexnum;  }  cout<<"输入各个顶点的名称:";  for(i=0;i<vexnum;i++)  {  cin>>xlist[i].data;  xlist[i].firstin=NULL;  xlist[i].firstout=NULL;  }  for(k=0;k<arcnum;k++)  {  cout<<"输入第"<<k+1<<"条边的两个顶点(尾—>头的顺序):";  cin>>v1>>v2;  i=Locate_Vex(v1);  j=Locate_Vex(v2);  while(i == -1 || j == -1)  {  cout<<"结点位置输入错误,重新输入: ";  cin>>v1>>v2;  i=Locate_Vex(v1);  j=Locate_Vex(v2);     }         ArcBox *p=new ArcBox;  p->tailvex=i;  p->headvex=j;  p->hlink=xlist[j].firstin;  p->tlink=xlist[i].firstout;  xlist[i].firstout=xlist[j].firstin=p;  }  cout<<"有向图构造完成"<<endl;  }  //统计顶点入度  int In_degree(string v)  {  int pos=Locate_Vex(v);  if(pos == -1)  {  cout<<"结点不在图中"<<endl;  return -1;  }  ArcBox *p=xlist[pos].firstin;  int ins=0;  while(p)  {  ins++;  p=p->hlink;  }  return ins;  }  //统计顶点出度  int Out_degree(string v)  {  int pos=Locate_Vex(v);  if(pos == -1)  {  cout<<"结点不在图中"<<endl;  return -1;  }  ArcBox *p=xlist[pos].firstout;  int out=0;  while(p)  {  out++;  p=p->tlink;  }  return out;  }  //深度优先遍历  void DFS(int v)  {  visited[v]=true;  cout<<xlist[v].data<<"  ";  ArcBox *p=xlist[v].firstout;  while(p)  {  if(!visited[p->headvex])  DFS(p->headvex);  p=p->tlink;  }  }  void DFS_Traverse()  {  for(int i=0;i<vexnum;i++)  visited[i]=false;  for(int i=0;i<vexnum;i++) if(!visited[i])  DFS(i);     }  //广度优先遍历  void BFS(int v)  {  visited[v]=true;  cout<<xlist[v].data<<"  ";  queue<int> qu;  int vex;  ArcBox *p;  qu.push(v);  while(!qu.empty())  {  vex=qu.front();  qu.pop();  p=xlist[vex].firstout;  while(p)  {  if(!visited[p->headvex])  {  visited[p->headvex]=true;  cout<<xlist[p->headvex].data<<"  ";  qu.push(p->headvex);  }  p=p->tlink;  }  }  }  void BFS_Traverse()  {  for(int i=0;i<vexnum;i++)  visited[i]=false;  for(int i=0;i<vexnum;i++)  if(!visited[i])  BFS(i);  }  void DFS_2(int v)  {  visited[v]=true;  cout<<xlist[v].data<<"  ";  stack<int> s;  ArcBox *p;  int pos;  s.push(v);  while(!s.empty())  {  pos=s.top();  p=xlist[pos].firstout;  while(p && visited[p->headvex])  p=p->tlink;  if(!p)  s.pop();  else  {  visited[p->headvex]=true;  cout<<xlist[p->headvex].data<<"  ";  s.push(p->headvex);  }  }  }  void DFS_Traverse_2()  {  for(int i=0;i<vexnum;i++)  visited[i]=false;  for(int i=0;i<vexnum;i++)  if(!visited[i])  DFS_2(i);  }  //求连通分支数  int Connect_Cpnt()  {  for(int i=0;i<vexnum;i++)  visited[i]=false;  cout<<"下面的每一行显示一个连通分支:"<<endl;  int num=1;  DFS(0);  cout<<endl;  for(int i=0;i<vexnum;i++)  {  if(!visited[i])  {  num++;  DFS(i);  cout<<endl;  }  }  return num;  }
};
#include "Graphis.h"
#include <iostream>
#include <string>
using namespace std;  int main()
{  OLGraph G;  string v;  int ins,out,a;  G.CreateDG_OLG();  cout<<"输入要统计哪个结点的入度:";  cin>>v;  ins=G.In_degree(v);  if(ins != -1)  cout<<"顶点"<<v<<"的入度为:"<<ins<<endl;  cout<<"输入要统计哪个结点的出度:";  cin>>v;  out=G.Out_degree(v);  if(out != -1)  cout<<"顶点"<<v<<"的出度为:"<<out<<endl;  cout<<"深度优先遍历:";  G.DFS_Traverse();  cout<<endl;  cout<<"广度优先遍历:";  G.BFS_Traverse();  cout<<endl;  cout<<"计算图的连通分支"<<endl;  int num=G.Connect_Cpnt();  cout<<"图的连通分支数目为:"<<num<<endl;  cout<<"深度优先遍历非递归:";  G.DFS_Traverse_2();  cout<<endl;  return 0;
}  

java版

package graphis;public class ArcBox {//弧结点头尾结点位置  int tailvex;  int headvex;  //弧头和弧尾相同的弧的链域  ArcBox hlink;  ArcBox tlink; }
package graphis;public class VexNode {String data; //顶点名称  ArcBox firstin; //指向第一条入弧  ArcBox firstout; //指向第一条出弧
}
package graphis;
import java.util.*;public class OLGraph {boolean visited[]=new boolean[100];public  VexNode[] xlist=new VexNode[20]; //指向顶点数组的指针  private int vexnum;  //顶点数  private int arcnum;  //弧数  private int maxnum; //顶点数的最大值  public  OLGraph(int num)  {  this.xlist=new VexNode[num];for(int i=0;i<20;i++){xlist[i]=new VexNode();}maxnum=num;  }  int Locate_Vex(String v)  {  for(int i=0;i<vexnum;i++)  {  if(xlist[i].data.equals(v);                  return i;  }  return -1;  }  void CreateDG_OLG()  {  //构造有向图  String v1,v2;  int i,j,k;  System.out.println("输入顶点数和边的数目:");  Scanner input = new Scanner(System.in);vexnum = input.nextInt();arcnum =  input.nextInt(); while(vexnum>maxnum)       {  System.out.println("顶点数目大于最大限制,请重新输入:");  vexnum=input.nextInt(); ;  }  System.out.println("输入各个顶点的名称:");  for(i=0;i<vexnum;i++)  {  xlist[i].data=input.next();xlist[i].firstin=null;  xlist[i].firstout=null;  }  for(k=0;k<arcnum;k++)  {  System.out.println("输入第"+k+1+"条边的两个顶点(尾—>头的顺序):");v1=input.next();v2=input.next();  i=Locate_Vex(v1);  j=Locate_Vex(v2);  while(i == -1 || j == -1)  {  System.out.println("结点位置输入错误,重新输入: ");  v1=input.next();v2=input.next();    i=Locate_Vex(v1);  j=Locate_Vex(v2);     }         ArcBox p=new ArcBox();  p.tailvex=i;  p.headvex=j;  p.hlink=xlist[j].firstin;  p.tlink=xlist[i].firstout;  xlist[i].firstout=xlist[j].firstin=p;  }  System.out.println("有向图构造完成\n");  input.close();}  //统计顶点入度  int In_degree(String v)  {  int pos=Locate_Vex(v);  if(pos == -1)  {  System.out.println("结点不在图中\n");  return -1;  }  ArcBox p=xlist[pos].firstin;  int ins=0;  while(p!=null)  {  ins++;  p=p.hlink;  }  return ins;  }  //统计顶点出度  int Out_degree(String v)  {  int pos=Locate_Vex(v);  if(pos == -1)  {  System.out.println("结点不在图中\n");  return -1;  }  ArcBox p=xlist[pos].firstout;  int out=0;  while(p!=null)  {  out++;  p=p.tlink;  }  return out;  }  //深度优先遍历  void DFS(int v)  {  visited[v]=true;  System.out.println(xlist[v].data+"  ");  ArcBox p=xlist[v].firstout;  while(p!=null)  {  if(!visited[p.headvex])  DFS(p.headvex);  p=p.tlink;  }  }  void DFS_Traverse()  {  for(int i=0;i<vexnum;i++)  visited[i]=false;  for(int i=0;i<vexnum;i++) if(!visited[i])  DFS(i);     }  //广度优先遍历  void BFS(int v)  {  visited[v]=true;  System.out.println(xlist[v].data+"  ");  Queue<Integer> qu= new LinkedList<Integer>();  int vex;  ArcBox p;  qu.offer(v);  while(qu.peek()!=null)  {  vex=qu.peek();  qu.poll();  p=xlist[vex].firstout;  while(p!=null)  {  if(!visited[p.headvex])  {  visited[p.headvex]=true;  System.out.println(xlist[p.headvex].data+"  ");  qu.offer(p.headvex);  }  p=p.tlink;  }  }  }  void BFS_Traverse()  {  for(int i=0;i<vexnum;i++)  visited[i]=false;  for(int i=0;i<vexnum;i++)  if(!visited[i])  BFS(i);  }  void DFS_2(int v)  {  visited[v]=true;  System.out.println(xlist[v].data+"  ");  Stack<Integer> s = new Stack<Integer>();   ArcBox p;  int pos;  s.push(v);  while(!s.empty())  {  pos=s.peek(); p=xlist[pos].firstout;  while(p!=null && visited[p.headvex])  p=p.tlink;  if(p==null)  s.pop();  else  {  visited[p.headvex]=true;  System.out.println(xlist[p.headvex].data+"  ");  s.push(p.headvex);  }  }  }  void DFS_Traverse_2()  {  for(int i=0;i<vexnum;i++)  visited[i]=false;  for(int i=0;i<vexnum;i++)  if(!visited[i])  DFS_2(i);  }  //求连通分支数  int Connect_Cpnt()  {  for(int i=0;i<vexnum;i++)  visited[i]=false;  System.out.println("下面的每一行显示一个连通分支:\n");  int num=1;  DFS(0);  System.out.println("\n");   for(int i=0;i<vexnum;i++)  {  if(!visited[i])  {  num++;  DFS(i);  System.out.println("\n");  }  }  return num;  }  }
package graphis;import java.util.Scanner;public class Test {public static void main(String args[]){OLGraph G=new OLGraph(20);  String v;  int ins,out;  G.CreateDG_OLG();  System.out.println("输入要统计哪个结点的入度:"); Scanner input = new Scanner(System.in);v=input.next();  ins=G.In_degree(v);  if(ins != -1)  System.out.println("顶点"+v+"的入度为:"+ins+'\n');  System.out.println("输入要统计哪个结点的出度:");  v=input.next(); out=G.Out_degree(v);  if(out != -1)  System.out.println("顶点"+v+"的出度为:"+out+'\n');  System.out.println("深度优先遍历:");  G.DFS_Traverse();  System.out.println('\n');  System.out.println("广度优先遍历:");  G.BFS_Traverse();  System.out.println('\n');  System.out.println("计算图的连通分支"+'\n');  int num=G.Connect_Cpnt();  System.out.println("图的连通分支数目为:"+num+'\n');  System.out.println("深度优先遍历非递归:");  G.DFS_Traverse_2();  System.out.println('\n');  input.close();}}

C++ 十字链表图转java版相关推荐

  1. 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

  2. 我的世界java版不会玩_我的世界:五张MC趣图,Java版玩家永远不懂基岩版玩家的痛...

    <我的世界>1.17版本目前已经更新了8个快照版本,在玩家的期望中,Mojang总算是加入了新的洞穴--噪声洞穴(Noise Caves).虽然这属于洞穴与山崖更新的一大步,Java版玩家 ...

  3. 数据结构(二)---单链表的实现---java版

    package com.cn.hbut.domain; //节点设置 public class Node { Object data; Node next; //初始化一个数据域以及next域均为nu ...

  4. 链表 java详解_链表详解——Java版

    什么是链表? 链表是一个线性结构,但是存储的数据可以是非线性的.链表由一个个子节点构成,每个节点有两个部分:数据域和指针域,数据域就是实际存储数据的,指针域可以有一个和两个,单链表就是单个指针域指向后 ...

  5. [Java] 超简图床(Java版) —— 专为Api而生

    v1.2已更新,添加新浪图床v1.1已更新,支持保存配置,配置不会随着服务器重启而被重置 PHP版本请看这里:https://www.52pojie.cn/forum.php?mod=viewthre ...

  6. 图论:十字链表的基本概念理解

    <写博客是为了学习理解更深刻> 在学习甲鱼课的十字链表时稍稍有点懵,进C站查找一番后发现也没有比较亲近小白的描述和解释.抱着让自己理解更深刻以及与大家分享的态度写下了这篇博客.如有错误请指 ...

  7. java用十字链表实现无向图_实验四:图的实现与应用

    20162317袁逸灏 实验四:图的实现与应用 实验内容 用 邻接矩阵 十字链表 实现无向图中的 添加结点 删除结点 添加边 删除边 size() isEmpty() 广度优先迭代器 深度优先迭代器 ...

  8. 数据结构——图的十字链表实现

    十字链表定义 之前的邻接表对于有向图来说,可分为邻接表和逆邻接表,对于出入度要求不同时,生成的邻接表也不同 十字链表的出现就是将 邻接表和逆邻接表整合在一起 在同一个代码中,对于一个顶点可以找到其出度 ...

  9. 【数据结构】图的存储结构(邻接矩阵、邻接表、十字链表、邻接多重表)及实现(C语言)

    目录 1. 邻接矩阵表示法 1.1 图的邻接矩阵 1.2 创建有向网的邻接矩阵 2. 邻接表表示法 2.1 图的邻接表存储结构 2.2 创建有向图的邻接表 3. 十字链表表示法 3.1 图的十字链表存 ...

最新文章

  1. 计组--习题--总线
  2. thinkphp隐藏后台地址
  3. 基于源码仿建视频解析网站
  4. devc++鼠标变成了光标_游戏鼠标到底能不能提升你的实力?
  5. 微信小程序自定义组件实现
  6. mongo数据库 备份 还原
  7. linux开发操作系统,Linux 操作系统应用与开发
  8. Linux下安装和配置solr/tomcat/IK分词器 详细实例一.
  9. docker下mongodb备份导入数据库
  10. 供应IMX335/IMX386/IMX258/OV4689/OV5640/OV8865/光学防抖摄像头模组
  11. html单页模板wap,单页模板html
  12. python使用ffmpeg合并两个MP4视频
  13. 超搜索引擎BBMAO
  14. android开发 自定义锁屏界面,插件锁屏桌面自定义 “安卓4.0”界面美化教程
  15. 阿里云专网服务器连接互联网的设置
  16. 天原笔记(2)——气团与锋
  17. excel实现自动排序
  18. CCF推荐会议 | 计算机理论:截稿日期纵览(含ESA,CONCUR等)
  19. 《C语言》罗马数字问题
  20. 回归年、恒星年、太阳日、恒星日和闰秒相关知识

热门文章

  1. 【OkHttp】OkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 )
  2. 【计算理论】可判定性 ( 对角线方法 | 使用对角线方法证明 通用任务图灵机 语言 不可判定 )
  3. 【计算机网络】数据链路层 : 信道划分 介质访问控制 ( 数据链路 | 介质访问控制分类 | 频分多路复用 FDM | 时分多路复用 TDM | 波分复用 WDM | 码分多路复用 CDM 计算 )★
  4. Python爬虫从入门到放弃(十二)之 Scrapy框架的架构和原理
  5. 《软件构架实践》阅读笔记三
  6. 【转】关于TP3.2 验证码不显示的问题
  7. Golang下的Log处理
  8. Spring2.5.6学习笔记-实例化bean的几种方法
  9. 一个低级错误,关于timer
  10. Matlab Robotic Toolbox V9.10工具箱(三):轨迹规划