C++ 十字链表图转java版
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版相关推荐
- 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)
常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...
- 我的世界java版不会玩_我的世界:五张MC趣图,Java版玩家永远不懂基岩版玩家的痛...
<我的世界>1.17版本目前已经更新了8个快照版本,在玩家的期望中,Mojang总算是加入了新的洞穴--噪声洞穴(Noise Caves).虽然这属于洞穴与山崖更新的一大步,Java版玩家 ...
- 数据结构(二)---单链表的实现---java版
package com.cn.hbut.domain; //节点设置 public class Node { Object data; Node next; //初始化一个数据域以及next域均为nu ...
- 链表 java详解_链表详解——Java版
什么是链表? 链表是一个线性结构,但是存储的数据可以是非线性的.链表由一个个子节点构成,每个节点有两个部分:数据域和指针域,数据域就是实际存储数据的,指针域可以有一个和两个,单链表就是单个指针域指向后 ...
- [Java] 超简图床(Java版) —— 专为Api而生
v1.2已更新,添加新浪图床v1.1已更新,支持保存配置,配置不会随着服务器重启而被重置 PHP版本请看这里:https://www.52pojie.cn/forum.php?mod=viewthre ...
- 图论:十字链表的基本概念理解
<写博客是为了学习理解更深刻> 在学习甲鱼课的十字链表时稍稍有点懵,进C站查找一番后发现也没有比较亲近小白的描述和解释.抱着让自己理解更深刻以及与大家分享的态度写下了这篇博客.如有错误请指 ...
- java用十字链表实现无向图_实验四:图的实现与应用
20162317袁逸灏 实验四:图的实现与应用 实验内容 用 邻接矩阵 十字链表 实现无向图中的 添加结点 删除结点 添加边 删除边 size() isEmpty() 广度优先迭代器 深度优先迭代器 ...
- 数据结构——图的十字链表实现
十字链表定义 之前的邻接表对于有向图来说,可分为邻接表和逆邻接表,对于出入度要求不同时,生成的邻接表也不同 十字链表的出现就是将 邻接表和逆邻接表整合在一起 在同一个代码中,对于一个顶点可以找到其出度 ...
- 【数据结构】图的存储结构(邻接矩阵、邻接表、十字链表、邻接多重表)及实现(C语言)
目录 1. 邻接矩阵表示法 1.1 图的邻接矩阵 1.2 创建有向网的邻接矩阵 2. 邻接表表示法 2.1 图的邻接表存储结构 2.2 创建有向图的邻接表 3. 十字链表表示法 3.1 图的十字链表存 ...
最新文章
- 计组--习题--总线
- thinkphp隐藏后台地址
- 基于源码仿建视频解析网站
- devc++鼠标变成了光标_游戏鼠标到底能不能提升你的实力?
- 微信小程序自定义组件实现
- mongo数据库 备份 还原
- linux开发操作系统,Linux 操作系统应用与开发
- Linux下安装和配置solr/tomcat/IK分词器 详细实例一.
- docker下mongodb备份导入数据库
- 供应IMX335/IMX386/IMX258/OV4689/OV5640/OV8865/光学防抖摄像头模组
- html单页模板wap,单页模板html
- python使用ffmpeg合并两个MP4视频
- 超搜索引擎BBMAO
- android开发 自定义锁屏界面,插件锁屏桌面自定义 “安卓4.0”界面美化教程
- 阿里云专网服务器连接互联网的设置
- 天原笔记(2)——气团与锋
- excel实现自动排序
- CCF推荐会议 | 计算机理论:截稿日期纵览(含ESA,CONCUR等)
- 《C语言》罗马数字问题
- 回归年、恒星年、太阳日、恒星日和闰秒相关知识
热门文章
- 【OkHttp】OkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 )
- 【计算理论】可判定性 ( 对角线方法 | 使用对角线方法证明 通用任务图灵机 语言 不可判定 )
- 【计算机网络】数据链路层 : 信道划分 介质访问控制 ( 数据链路 | 介质访问控制分类 | 频分多路复用 FDM | 时分多路复用 TDM | 波分复用 WDM | 码分多路复用 CDM 计算 )★
- Python爬虫从入门到放弃(十二)之 Scrapy框架的架构和原理
- 《软件构架实践》阅读笔记三
- 【转】关于TP3.2 验证码不显示的问题
- Golang下的Log处理
- Spring2.5.6学习笔记-实例化bean的几种方法
- 一个低级错误,关于timer
- Matlab Robotic Toolbox V9.10工具箱(三):轨迹规划