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. TCP确认延时和Nagle算法

    TCP确认延时和Nagle算法 nagle 算法是   发送端 收到前一个报文的确认然后再发送下一个tcp数据.这样可以避免大量的小数据. TCP_NODELAY选项控制. Delay ACK是   ...

  2. 【环境变量】Linux 下三种方式设置环境变量与获取环境变量

    1.在Windows 系统下,很多软件安装都需要配置环境变量,比如 安装 jdk ,如果不配置环境变量,在非软件安装的目录下运行javac 命令,将会报告找不到文件,类似的错误. 2.那么什么是环境变 ...

  3. Strusts2笔记8--文件的上传和下载

    文件的和上传和下载: (1)文件的上传: Struts是通过拦截器实现文件上传的,而默认拦截器栈中包含了文件上传拦截器,故表单通过Struts2可直接将文件上传,其底层是通过apache的common ...

  4. 戴尔游匣5577安装 ubuntu/mint

    这里以mint为例. 做好usb启动盘后, 启动到读秒的时候按上下方向键唤出如下选项: 在第二个选项里按 tab 键(上图界面有提示) 进去后有如下界面: 在后面加上参数: nouveau.modes ...

  5. SQl 跨服务器查询脚本示例

    1.采用OPENDATASOURCE select top 10 *from OPENDATASOURCE('SQLOLEDB','Data Source=IP地址;User ID=连接用户名称;Pa ...

  6. c# 通过Windows服务启动外部程序

    1. 新建一个Windows服务应用程序 创建项目——>Visual C# 左侧的"+"——>Windows ——>Windows 服务(右侧模板)——>输 ...

  7. ASP.NET MVC 5使用Filter过滤Action参数防止sql注入,让你代码安全简洁

    在开发程序的过程中,稍微不注意就会隐含有sql注入的危险.今天我就来说下,ASP.NET mvc 5使用Filter过滤Action参数防止sql注入,让你代码安全简洁.不用每下地方对参数的值都进行检 ...

  8. html 列表标签

    1.有序列表 <ol> <li>你好</li> <li>你好</li> <li>你好</li> </ol> ...

  9. Python爬虫学习1: Requests模块的使用

    Requests函数库是学习Python爬虫必备之一, 能够帮助我们方便地爬取. Requests: 让HTTP服务人类. 本文主要参考了其官方文档. Requests具有完备的中英文文档, 能完全满 ...

  10. 编译环境搭建:Makefile

    前言 长久以来,笔者一直想用一种管理工具,将所编写的测试程序.算法代码以及工程代码统一管理起来.因为有些是用Java写的有些是用C++写的.虽有想法,但却无行动.这又让我想起了昨天晚上看到一部电影里所 ...