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实验四——图的实现与应用的更多相关文章

  1. 20145212 实验四《Andoid开发基础》

    20145212 实验四<Andoid开发基础> 实验内容 安装Android Studio 运行安卓AVD模拟器 使用Android运行出模拟手机并显示自己的学号 实验过程 一.安装An ...

  2. Java实验四和实验五

    实验四 类的继承性和多态性 [开发语言及实现平台或实验环境] Windows2000 或XP,JDK1.6与Jcreator4.0 [实验目的] 1.  掌握OOP方式进行程序设计的方法, 2.  了 ...

  3. 20145337实验四Android开发基础

    20145337实验四Android开发基础 实验内容 基于Android Studio开发简单的Android应用并部署测试; 了解Android组件.布局管理器的使用: 掌握Android中事件处 ...

  4. 信息安全系统设计基础实验四:外设驱动程序设计 20135211李行之&20135216刘蔚然

    北京电子科技学院(BESTI) 实 验 报 告 封面 课程:信息安全系统设计基础                                           班级:1352           ...

  5. 20145208 实验四 Android开发基础

    20145208 实验四 Android开发基础 安装Android Studio 安装的具体步骤在老师的链接中已经很详细了,在此就不做赘述了. 在此提出我觉得安装的时候需要注意的两个地方 一是安装地 ...

  6. 20145222黄亚奇《Java程序设计》实验四实验报告

    20145222<Java程序设计>第四次实验报告 实验四 Android环境搭建 实验内容 1.搭建Android环境 2.运行Android 3.修改代码,能输出学号 实验步骤 搭建A ...

  7. 20145215实验四 Android开发基础

    20145215实验四 Android开发基础 实验内容 基于Android Studio开发简单的Android应用并部署测试; 了解Android组件.布局管理器的使用: 掌握Android中事件 ...

  8. 20145236 《Java程序设计》实验四实验报告

    20145236 实验四 Android开发基础 实验内容: 1.基于Android Studio开发简单的Android应用并部署测试; 2.了解Android组件.布局管理器的使用: 3.掌握An ...

  9. Linux 基础入门(新版)(实验一至实验四)

    1.实验一  Lniux简介   操作系统:系统调用+内核 Linux 平台:大都为开源自由软件,用户可以修改定制和再发布,由于基本免费没有资金支持,部分软件质量和体验欠缺:有全球所有的 Linux ...

随机推荐

  1. C++ Qt多线程 TcpSocket服务器实例

    服务器: incomming incomming.pro #------------------------------------------------- # # Project created ...

  2. Electron 开发环境下总是 crash

    全局安装一个 electron devtool 关掉 崩溃时选择重新打开

  3. Indepence Mode 备份 weblogic

    一般不在administation server 停止这个模式 管理服务器挂了,不会影响其他服务器的运行 备份一个domain copy  一个  /bin  把启动的脚本做一个修改  里面的doma ...

  4. 读sru代码

    1. def read_corpus(path, eos="</s>"): data = [ ] with open(path) as fin: for line in ...

  5. python函数,模块及eclipse配置python开发环境

    一.eclipse的使用 1.作用 (1)最好用的IDE (2)可调式debug (3)查看可执行过程 (4)可查看源代码 2.安装eclipse及配置 目录安装Pythonpython for ec ...

  6. Spiral Matrix I & II

    Spiral Matrix I Given an integer n, generate a square matrix filled with elements from 1 to n^2 in s ...

  7. Oracle11g用户、权限、角色、概要文件管理及审计

    第10章 安全管理 1 用户管理 2 权限管理 3 角色管理    : 4 概要文件管理 5 审计 操作系统:win7    Oracle安装目录:E盘 数据库名字:orcl  密码:123456 先 ...

  8. 正则表达式基础->

    描述:(grep) 正则表达式是一种字符模式,用于在查找过程中匹配指定的字符.在大多数程序里,正则表达式都被置于两个正斜杠之间,它匹配被查找的行中任何位置出现的相同模式 基础正则表达式 正则表达式 描 ...

  9. Gitlab权限管理

    使用管理员登陆gitlab(版本为8.9)创建一个组 给用户授权 创建新用户 再创建两个dev1和dev2 然后再到项目界面授权给pm授权master 创建库(事先先建一个java组) 设置权限 创建 ...

  10. 七、springcloud之配置中心Config(二)之高可用集群

    方案一:传统作法(不推荐) 服务端负载均衡 将所有的Config Server都指向同一个Git仓库,这样所有的配置内容就通过统一的共享文件系统来维护,而客户端在指定Config Server位置时, ...