20162327WJH实验四——图的实现与应用
20162327WJH实验四——图的实现与应用
实 验 报 告
课程:程序设计与数据结构
班级: 1623
姓名: 王旌含
学号:20162327
成绩:
指导教师:娄嘉鹏 王志强
实验日期:11月20日
实验密级: 非密级
预习程度: 已预习
实验时间:15:25-17:15
必修/选修: 必修
实验序号: cs_23
实验内容
实验一
1、实验内容
- 用邻接矩阵实现无向图(边和顶点都要保存),实现在包含添加和删除结点的方法,添加和删除边的方法,size(),isEmpty(),广度优先迭代器,深度优先迭代器
2、实验过程
- 1、顶点的添加及删除方法
public boolean insertVertice(Object obj)
{
return vertices.add(obj);
}
public boolean removeVertice(Object obj){
return vertices.remove(obj);
}
- 2、边的添加及删除方法
public boolean insertEdges(int v1,int v2,int weight) throws Exception
{
boolean result = false;
if((v1 < 0 || v1 >= vertices.size())||(v2 < 0||v2 >= vertices.size()))
{
throw new Exception("v1或者v2参数越界错误!");
}
this.edges[v1][v2]=weight;
this.NumEdges++;
result = true;
return result;
}
//删除某条边
public void removeEdges(int v1,int v2) throws Exception
{
if((v1 < 0 || v1 >= vertices.size())||(v2 < 0||v2 >= vertices.size()))
{
throw new Exception("v1或者v2参数越界错误!");
}
if( v1==v2 || this.edges[v1][v2]==-1)//自己到自己的边或者边不存在则不用删除。
{
throw new Exception("边不存在!");
}
this.edges[v1][v2]=-1;
this.NumEdges--;
}
- 3、遍历的方法
public ArrayList iteratorBFS(int start) throws Exception {
int currentVertex;
int next = -1;
LinkedQueue<Integer> traversalQueue = new LinkedQueue<Integer>();
ArrayList iter = new ArrayList<>();
boolean[] visited = new boolean[vertices.size()];
for (int i = 0; i < visited.length; i++)
visited[i] = false;
traversalQueue.enqueue(start);
visited[start] = true;
while (!traversalQueue.isEmpty()) {
currentVertex = traversalQueue.dequeue();
iter.add(vertices.get(currentVertex));
for (int j = 0; j < visited.length; j++) {
if (edges[currentVertex][j]!=0&&edges[currentVertex][j]!=-1 && !visited[j]) {
traversalQueue.enqueue(j);
visited[j] = true;
}
}
}
return iter;
}
- 4、isEmpty()方法
public boolean isEmpty(Linjie g){
return (vertices.size()==0);
}
测试截图
实验二
1、实验内容
- 用邻接矩阵实现无向图(边和顶点都要保存),实现在包含添加和删除结点的方法,添加和删除边的方法,size(),isEmpty(),广度优先迭代器,深度优先迭代器
2、实验过程
- 1、构造十字链表过程
public Shizilianbiao(char[] vertex, char[][] edges) {
Numevertex = vertex.length;
Numedges = edges.length;
// 初始化顶点,建立顶点表
vertexNodeList = new VertexNode[Numevertex];
for (int i = 0; i < Numevertex; i++) {
vertexNodeList[i] = new VertexNode();
vertexNodeList[i].vertex = vertex[i];
vertexNodeList[i].firstIn = null;
vertexNodeList[i].firstOut = null;
}
// 初始化边,利用头插法建立十字链表
for (int i = 0; i < Numedges; i++) {
EdgeNode edgeNode1 = new EdgeNode();
EdgeNode edgeNode2 = new EdgeNode();
int vi = getPosition(edges[i][0], vertex);
int vj = getPosition(edges[i][1], vertex);
edgeNode1.endvertex = vi;
edgeNode1.firstvextex = vj;
edgeNode1.endlink = vertexNodeList[vi].firstOut;
vertexNodeList[vi].firstOut = edgeNode1;
edgeNode2.endvertex = vi;
edgeNode2.firstvextex = vj;
edgeNode2.firstlink = vertexNodeList[vj].firstIn;
vertexNodeList[vj].firstIn = edgeNode2;
}
}
- 2、打印邻接表和逆邻接表
public void print() {
System.out.printf("领接表:\n");
for (int i = 0; i < Numevertex; i++) {
System.out.print(vertexNodeList[i].vertex + " ");
if (vertexNodeList[i].firstOut != null) {
EdgeNode EdgeNode2 = new EdgeNode();
EdgeNode2 = vertexNodeList[i].firstOut;
System.out.print(EdgeNode2.firstvextex);
while (EdgeNode2.endlink != null) {
EdgeNode2 = EdgeNode2.endlink;
System.out.print(EdgeNode2.firstvextex);
}
System.out.print("\n");
} else {
System.out.print("\n");
}
}
System.out.print("----------\n");
System.out.printf("逆领接表:\n");
for (int i = 0; i < Numevertex; i++) {
System.out.print(vertexNodeList[i].vertex + " ");
if (vertexNodeList[i].firstIn != null) {
EdgeNode EdgeNode1 = new EdgeNode();
EdgeNode1 = vertexNodeList[i].firstIn;
System.out.print(EdgeNode1.endvertex);
while (EdgeNode1.firstlink != null) {
EdgeNode1 = EdgeNode1.firstlink;
System.out.print(EdgeNode1.endvertex);
}
System.out.print("\n");
} else {
System.out.print("\n");
}
}
}
测试截图
实验三
1、实验内容
- 实现PP19.9(实现路由器原理即寻找最短路径问题)
2、实验过程
public class ShortestPath {
// 求取最短路径
public static String[][] getShortestPath(int data[][]) {
int length = data.length;
String path[][] = new String[length][length];
for (int i = 0; i < data.length; i++)
for (int j = 0; j < data[i].length; j++) {
if (data[i][j] > 0)
path[i][j] = (i + 1) + "-->" + (j + 1);
else
path[i][j] = "不通";
}
int k = 0;
while (k < length) {// 循环将各行加入,即计算将k作为最大通过节点之后的最短路径
for (int i = 0; i < length; i++) {
if (data[k][i] > 0) {// 如果这个节点连通了其他节点,则察看是否将影响到当前的最短路径
for (int m = 0; m < length; m++) {
int temp[] = data[m];
if (temp[k] > 0) {// 如果加入当前节点和加入的节点之间是相通的,执行下面的
if (temp[i] < 0) {
if (i != m) {
temp[i] = temp[k] + data[k][i];
path[m][i] = (m + 1) + "-->" + (k + 1)
+ "-->" + (i + 1);
}
} else {
temp[i] = Math.min(temp[k] + data[k][i],
temp[i]);
path[m][i] = path[m][k] + "-->"
+ (i + 1);
}
}
data[m] = temp;
}
}
}
k++;
}
return path;
}
测试截图
- 测试代码
public static void main(String[] args) {
int data[][] = { { -1, 1, 2, -1, -1, -1 }, { -1, -1, 1, 3, -1, 7 },
{ -1, -1, -1, 1, 2, -1 }, { -1, -1, -1, -1, -1, 3 },
{ -1, -1, -1, -1, -1, 6 }, { -1, -1, -1, -1, -1, -1 } };
String pathShow[][] = getShortestPath(data);
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data[i].length; j++) {
if (data[i][j] > 0) {
System.out.print("节点" + (i + 1) + "到节点" + (j + 1)
+ "的最短路径是:" + data[i][j]);
System.out.println(" 路径是" + pathShow[i][j]);
}
}
}
System.out.println("其余没列出的节点之间是不通的");
}
码云链接
20162327WJH实验四——图的实现与应用的更多相关文章
- 20145212 实验四《Andoid开发基础》
20145212 实验四<Andoid开发基础> 实验内容 安装Android Studio 运行安卓AVD模拟器 使用Android运行出模拟手机并显示自己的学号 实验过程 一.安装An ...
- Java实验四和实验五
实验四 类的继承性和多态性 [开发语言及实现平台或实验环境] Windows2000 或XP,JDK1.6与Jcreator4.0 [实验目的] 1. 掌握OOP方式进行程序设计的方法, 2. 了 ...
- 20145337实验四Android开发基础
20145337实验四Android开发基础 实验内容 基于Android Studio开发简单的Android应用并部署测试; 了解Android组件.布局管理器的使用: 掌握Android中事件处 ...
- 信息安全系统设计基础实验四:外设驱动程序设计 20135211李行之&20135216刘蔚然
北京电子科技学院(BESTI) 实 验 报 告 封面 课程:信息安全系统设计基础 班级:1352 ...
- 20145208 实验四 Android开发基础
20145208 实验四 Android开发基础 安装Android Studio 安装的具体步骤在老师的链接中已经很详细了,在此就不做赘述了. 在此提出我觉得安装的时候需要注意的两个地方 一是安装地 ...
- 20145222黄亚奇《Java程序设计》实验四实验报告
20145222<Java程序设计>第四次实验报告 实验四 Android环境搭建 实验内容 1.搭建Android环境 2.运行Android 3.修改代码,能输出学号 实验步骤 搭建A ...
- 20145215实验四 Android开发基础
20145215实验四 Android开发基础 实验内容 基于Android Studio开发简单的Android应用并部署测试; 了解Android组件.布局管理器的使用: 掌握Android中事件 ...
- 20145236 《Java程序设计》实验四实验报告
20145236 实验四 Android开发基础 实验内容: 1.基于Android Studio开发简单的Android应用并部署测试; 2.了解Android组件.布局管理器的使用: 3.掌握An ...
- Linux 基础入门(新版)(实验一至实验四)
1.实验一 Lniux简介 操作系统:系统调用+内核 Linux 平台:大都为开源自由软件,用户可以修改定制和再发布,由于基本免费没有资金支持,部分软件质量和体验欠缺:有全球所有的 Linux ...
随机推荐
- 连接数据库及出现System.AccessViolationException错误的解决方法
调试后发现, connection.Open();以后报错,System.AccessViolationException: 尝试读取或写入受保护的内存.这通常指示其他内存已损坏,网上搜了很多都没有作 ...
- java中并发Queue种类与各自API特点以及使用场景!
一 先说下队列 队列是一种数据结构.它有两个基本操作:在队列尾部加入一个元素,和从队列头部移除一个元素(注意不要弄混队列的头部和尾部) 就是说,队列以一种先进先出的方式管理数据,如果你试图向一个 已经 ...
- 【FCS NOI2018】福建省冬摸鱼笔记 day6【FJOI 2018】福建省选混分滚蛋记 day1
记录一下day6发生的事情吧. 7:30 到达附中求索碑,被人膜,掉RP. 7:50 进考场,6楼的最后一排的最左边的位置,世界上最角落的地方,没有任何想法. 发现电脑时间和别人不一样,赶快调了一下. ...
- C 之回调函数
软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步调用.同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用:回调是一种双向调用模式,也就是 ...
- 查看sql语句加锁信息
问题: 最近使用quartz集群,总是报deadlock问题,所以需要查看一下执行的sql导致的加锁冲突. 步骤: 1.在要测试的库中创建指定表innodb_lock_monitor create t ...
- Scrapy官网程序执行示例
Windows 10家庭中文版本,Python 3.6.4,Scrapy 1.5.0, Scrapy已经安装很久了,前面也看了不少Scrapy的资料,自己尝试使其抓取微博的数据时,居然连登录页面(首页 ...
- 利用mysql的binlog恢复数据
MySQL Binary Log也就是常说的bin-log, ,是mysql执行改动产生的二进制日志文件,其主要作用有两个: * 数据回复 * 主从数据库.用于slave端执行增删改,保持与maste ...
- C#控制台应用程序之选课系统
本程序以文本文件作为存储媒介,实现了一个简化版的选课系统,主要实现了以下功能 对学生信息的增删改查 对课程信息的增删改查 对学生选课的增删改查 using System; using System.C ...
- C11多线程
参考: http://www.oschina.net/translate/cplusplus-11-threading-make-your-multitasking-life http://blog. ...
- 使用linux mysql客户端建立表时遇到格式解析的问题
发现在notepad++写好的建表脚本,粘贴到linux客户端后,执行时总是报我的脚本有问题. 我看了又看,发现建表脚本本身是没有问题,问题出在"Tab"键上和注释上边了. 解决办 ...


