北京电子科技学院(BESTI)
实 验 报 告
课程:程序设计与数据结构
班级: 1623
姓名: 石亚鑫
学号:20162303
成绩: 2分
指导教师:娄嘉鹏 王志强
实验日期:11月20日
实验密级: 非密级
预习程度: 已预习
实验时间:15:25-17:15
必修/选修: 必修
实验序号: cs_03
实验内容
实验一
- 用邻接矩阵实现无向图(边和顶点都要保存),实现在包含添加和删除结点的方法,添加和删除边的方法,size(),isEmpty(),广度优先迭代器,深度优先迭代器
- 给出伪代码,产品代码,测试代码(不少于5条测试)
- 上方提交代码链接
- 附件提交测试截图
实验二
- 用十字链表实现无向图(边和顶点都要保存),实现在包含添加和删除结点的方法,添加和删除边的方法,size(),isEmpty(),广度优先迭代器,深度优先迭代器
- 给出伪代码,产品代码,测试代码(不少于5条测试)
- 上方提交代码链接
- 附件提交测试截图
实验三
- 实现PP19.9
- 给出伪代码,产品代码,测试代码(不少于5条测试)
- 上方提交代码链接
- 附件提交测试截图
实验步骤
(1) 实验一
邻接矩阵
逻辑结构分为两部分:V和E集合。因此,用一个一维数组存放图中所有顶点数据;用一个二维数组存放顶点间关系(边或弧)的数据,这个二维数组称为邻接矩阵。
代码
- 添加和删除结点的方法,添加和删除边的方法
//添加结点
public void insertVertex(Object vertex) {
vertexList.add(vertexList.size(),vertex);
}
//添加边
public void insertEdge(int v1,int v2,int weight) {
edges[v1][v2]=weight;
numOfEdges++;
}
//删除结点
public void deleteEdge(int v1,int v2) {
edges[v1][v2]=0;
numOfEdges--;
}
- size(),isEmpty()
//得到顶点的数目
public int getVertsCount() {
return nVerts;
}
//得到边的数目
public int getNumOfEdges() {
return nVerts;
}
public boolean isEmpty()
{
if ( vertexList.size()== 0)
return true;
else
return false;
}
- 广度优先迭代器,深度优先迭代器
//私有函数,深度优先遍历
private void depthFirstSearch(boolean[] isVisited,int i) {
//首先访问该结点,在控制台打印出来
System.out.print(getValueByIndex(i)+" ");
//置该结点为已访问
isVisited[i]=true;
int w=getFirstNeighbor(i);//
while (w!=-1) {
if (!isVisited[w]) {
depthFirstSearch(isVisited,w);
}
w=getNextNeighbor(i, w);
}
}
//私有函数,广度优先遍历
private void broadFirstSearch(boolean[] isVisited,int i) {
int u,w;
LinkedList queue=new LinkedList();
//访问结点i
System.out.print(getValueByIndex(i)+" ");
isVisited[i]=true;
//结点入队列
queue.addLast(i);
while (!queue.isEmpty()) {
u=((Integer)queue.removeFirst()).intValue();
w=getFirstNeighbor(u);
while(w!=-1) {
if(!isVisited[w]) {
//访问该结点
System.out.print(getValueByIndex(w)+" ");
//标记已被访问
isVisited[w]=true;
//入队列
queue.addLast(w);
}
//寻找下一个邻接结点
w=getNextNeighbor(u, w);
}
}
实现
(2) 实验二
十字链表
邻接表,存储方法跟树的孩子链表示法相类似,是一种顺序分配和链式分配相结合的存储结构。如这个表头结点所对应的顶点存在相邻顶点,则把相邻顶点依次存放于表头结点所指向的单向链表中。
代码
- 添加和删除结点的方法,添加和删除边的方法
//添加结点
public void addVertex(Vertex vertex) {
vertex.setIndex(nVerts);
vertexList.add(vertex);
nVerts++;
}
//添加边
public void addEdge(int start, int end) {
vertexList.get(start).addAdj(vertexList.get(end));
if (!isDirected) {
vertexList.get(end).addAdj(vertexList.get(start));
}
}
//删除边
public void deleteEdge(int start, int end) {
vertexList.get(start).addAdj(vertexList.get(end));
if (!isDirected) {
vertexList.get(end).addAdj(vertexList.get(start));
}}
- size(),isEmpty()
//得到顶点的个数
public int getNumOfVertex() {
return vertexList.size();
}
//得到边的数目
public int getNumOfEdges() {
return numOfEdges;
}
public boolean isEmpty()
{
if ( numOfEdges== 0)
return true;
else
return false;
}
- 广度优先迭代器,深度优先迭代器
// 深度优先遍历
public void dfs() {
theStack = new StackX(nVerts);
vertexList.get(0).wasVisted = true;
dfs.add(vertexList.get(0));
theStack.push(vertexList.get(0));
Vertex vertex;
while (!theStack.isEmpty()) {
vertex = getAdjVertex((Vertex) theStack.peek());
if (vertex == null) {
theStack.pop();
} else {
vertex.wasVisted = true;
dfs.add(vertex);
theStack.push(vertex);
}
}
}
// 广度优先遍历
public void bfs() {
theQueue = new Queue(nVerts);
vertexList.get(0).wasVisted = true;
bfs.add(vertexList.get(0));
theQueue.insert(vertexList.get(0));
Vertex vertex1;
while (!theQueue.isEmpty()) {
Vertex vertex2 = (Vertex) theQueue.remove();
while ((vertex1 = getAdjVertex(vertex2)) != null) {
vertex1.wasVisted = true;
bfs.add(vertex1);
theQueue.insert(vertex1);
}
}
}
截图
(3) 实验三
创建计算机网络路由系统
输入网路中点到点的线路
以及每条线路使用的费用
系统输出网络中各点之间最便宜的路径
指出不相同的所有位置
根据我的看法,就是求出有权图的最短路径。
实现
统计自己的PSP(Personal Software Process)时间
步骤 | 耗时 | 百分比 |
---|---|---|
需求分析 | 60min | 13.6% |
代码实现 | 300min | 68.1% |
测试 | 60min | 13.6% |
分析总结 | 20min | 4.5% |