当前位置:文档之家› 图的遍历实验报告

图的遍历实验报告

图的遍历实验报告
图的遍历实验报告

实验五图的基本操作

一、实验目的

1、使学生可以巩固所学的有关图的基本知识。

2、熟练掌握图的存储结构。

3、熟练掌握图的两种遍历算法。

二、实验内容

[问题描述]

对给定图,实现图的深度优先遍历和广度优先遍历。

[基本要求]

以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。以用户指定的结点为起点,分别输出每种遍历下的结点访问序列。

【测试数据】

由学生依据软件工程的测试技术自己确定。

三、实验前的准备工作

1、掌握图的相关概念。

2、掌握图的逻辑结构和存储结构。

3、掌握图的两种遍历算法的实现。

四、实验报告要求

1、实验报告要按照实验报告格式规范书写。

2、实验上要写出多批测试数据的运行结果。

3、结合运行结果,对程序进行分析。

编程思路:

深度优先算法:计算机程序的一种编制原理,就是在一个问题出现多种可以实现的方法和技术的时候,应该优先选择哪个更合适的,也是一种普遍的逻辑思想,此种思想在运算的过程中,用到计算机程序的一种递归的思想。

度优先搜索算法:又称广度优先搜索,是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim 最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位址,彻底地搜索整张图,直到找到结果为止。

以临接链表作为存储结构,结合其存储特点和上面两种算法思想,给出两种遍历步骤:

(1)既然图中没有确定的开始顶点,那么可从图中任一顶点出发,不妨按编号的顺序,先从编号小的顶点开始。(2)要遍历到图中所有顶点,只需多次调用从某一顶点出发遍历图的算法。所以,下面只考虑从某一顶点出发遍历图的问题。

(3)为了在遍历过程中便于区分顶点是否已经被访问,设置一个访问标志数组

visited[n],n为图中顶点的个数,其初值为0,当被访问过后,其值被置为1。

(4)这就是遍历次序的问题,图的遍历通常有深度优先遍历和广度优先遍历两种方式,这两种遍历次序对无向图和有向图都适用。

1、深度优先遍历从图中某顶点v出发进行深度优先遍历的基本思想是:

(1)访问顶点v;

(2)从v的未被访问的邻接点中选取一个顶点w,从w出发进行深度优先遍历;

(3)重复上述两步,直至图中所有和v有路径相通的顶点都被访问到。

2、广度优先遍历从图中某顶点v出发进行广度优先遍历的基本思想是:

(1)访问顶点v;

(2)依次访问v的各个未被访问的邻接点v1,v2,……vk;

(3)分别从v1,v2,……vk出发依次访问它们未被访问的邻接点,并使“先被访问顶点的邻接点”先于“后被访问顶点的邻接点”被访问,直至图中所有与顶点v有路径的顶点都被访问到。广度优先遍历图是以顶点v为起始点,由近至远,依次访问和v有路径相通而且路径长度为1,2,……的顶点。为了使“先被访问顶点的邻接点”先于“后被访问顶点的邻接点”被访问,需设置队列存储访问的顶点。

代码解析:

#define MAXVEX 100

int visited[MAXVEX];

int n;

struct edgenode{

int adjvex;//临接结点序号 int info; //临接结点信息 edgenode*next; };连接结点的存储类型

struct vexnode{

int data;//结点信息 int No;

edgenode*link;

};数组结点类型

/*BFS遍历时所需存储类型*/ struct queue{ int front,rear; edgenode**base; };

typedef vexnode adjlist[MAXVEX];

采用用户交换模式来创建临接链表:

void CreatGroup(adjlist&g,int&n){

int e,s,d; printf("输入结点(n)个数和边(e)个数:"); cin>>n>>e;

for(int i=0;i

printf("\n输入第%d个结点信息No=",i); scanf("%d",&g[i].data);

g[i].link=NULL;

}

/*建立临接链表,创建的是有向图*/

for(int i=0;i

printf("第%d条边=>\n\t起点序号,终点序号:",i+1);

cin>>s>>d;//表示弧由s指向d

edgenode*p=new edgenode;

/*每一个点的临接结点没有顺序,为了插入p->adjvex方便每次插入结点都插入在临接表的首位置,这样后插入的结点反而在前面*/

p->adjvex=d; p->info=g[d].data; p->next=g[s].link; g[s].link=p; }

}

void DFS(adjlist g,int v){

visited[v]=0; printf("%d==>",v);//遍历过的结点用visited[v]=0进行标记 edgenode*p=g[v].link;//查找连接结点

while(p) {

if(visited[p->adjvex])

DFS(g,p->adjvex); p=p->next;

}

}

/*广度优先搜索法(类似于树的层次遍历法)*/

void BFS(adjlist g,int v){

visited[v]=0;

printf("%d==>",v);

queue Q;

edgenode*p=g[v].link;

Q.base=new edgenode*[MAXVEX];

Q.front=Q.rear=0;

Q.base[Q.rear++]=p;

while(Q.front!=Q.rear) {

visited[Q.base[Q.front]->adjvex]=0;

printf("%d==>",Q.base[Q.front]->adjvex);

while(p) {

if(visited[p->adjvex]) Q.base[Q.rear++]=p;

p=p->next;

}

p=g[Q.base[++Q.front]->adjvex].link; }

}

心得体会:

数据结构顾名思义讲求的是一种存储结构,一路

走来先后学习了表、树,最后学习的是图,对于每种

存储结构学习之初都会学习一些基本操作,而操作之

中又以创建和遍历为最基本的操作,只有熟练掌握了

以后才能对其他操作进行研究和学习。

图的存储结构相比表和树都要复杂,其操作过程

也较难进行掌握。仅仅是创建图的存储结构便分为矩

阵、临接链表、十字链表等,对于每一种存储结构又

分为有向与无向之分。然而,深度优先和广度优先是

两种算法,其算法思想并不依赖与元素的存储方式,

也就是说算法思想不会因为存储结构的改变而发生改

变,当然对于不同的存储结构仅仅是代码的表现形式

不同而已,正所谓一同百通,只要熟悉存储结构的特

点又对算法思想烂熟于心便可无往不胜。

图的遍历操作实验报告

. .. . .. .. 实验三、图的遍历操作 一、目的 掌握有向图和无向图的概念;掌握邻接矩阵和邻接链表建立图的存储结构;掌握DFS及BFS对图的遍历操作;了解图结构在人工智能、工程等领域的广泛应用。 二、要求 采用邻接矩阵和邻接链表作为图的存储结构,完成有向图和无向图的DFS 和BFS操作。 三、DFS和BFS 的基本思想 深度优先搜索法DFS的基本思想:从图G中某个顶点Vo出发,首先访问Vo,然后选择一个与Vo相邻且没被访问过的顶点Vi访问,再从Vi出发选择一个与Vi相邻且没被访问过的顶点Vj访问,……依次继续。如果当前被访问过的顶点的所有邻接顶点都已被访问,则回退到已被访问的顶点序列中最后一个拥有未被访问的相邻顶点的顶点W,从W出发按同样方法向前遍历。直到图中所有的顶点都被访问。 广度优先算法BFS的基本思想:从图G中某个顶点Vo出发,首先访问Vo,然后访问与Vo相邻的所有未被访问过的顶点V1,V2,……,Vt;再依次访问与V1,V2,……,Vt相邻的起且未被访问过的的所有顶点。如此继续,直到访问完图中的所有顶点。 四、示例程序 1.邻接矩阵作为存储结构的程序示例

#include"stdio.h" #include"stdlib.h" #define MaxVertexNum 100 //定义最大顶点数 typedef struct{ char vexs[MaxVertexNum]; //顶点表 int edges[MaxVertexNum][MaxVertexNum]; //邻接矩阵,可看作边表int n,e; //图中的顶点数n和边数e }MGraph; //用邻接矩阵表示的图的类型 //=========建立邻接矩阵======= void CreatMGraph(MGraph *G) { int i,j,k; char a; printf("Input VertexNum(n) and EdgesNum(e): "); scanf("%d,%d",&G->n,&G->e); //输入顶点数和边数 scanf("%c",&a); printf("Input Vertex string:"); for(i=0;in;i++) { scanf("%c",&a); G->vexs[i]=a; //读入顶点信息,建立顶点表 }

图的遍历实验报告

实验四:图的遍历 题目:图及其应用——图的遍历 班级:姓名:学号:完成日期: 一.需求分析 1.问题描述:很多涉及图上操作的算法都是以图的遍历操作为基础的。试写一个程序,演示在连通的无向图上访问全部结点的操作。 2.基本要求:以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。以用户指定的结点为起点,分别输出每种遍历下的结点访问序列和相应生成树的边集。 3.测试数据:教科书图7.33。暂时忽略里程,起点为北京。 4.实现提示:设图的结点不超过30个,每个结点用一个编号表示(如果一个图有n个结点,则它们的编号分别为1,2,…,n)。通过输入图的全部边输入一个图,每个边为一个数对,可以对边的输入顺序作出某种限制,注意,生成树的边是有向边,端点顺序不能颠倒。 5.选作内容: (1).借助于栈类型(自己定义和实现),用非递归算法实现深度优先遍历。 (2).以邻接表为存储结构,建立深度优先生成树和广度优先生成树,再按凹入表或树形打印生成树。 二.概要设计 1.为实现上述功能,需要有一个图的抽象数据类型。该抽象数据类型的定义为: ADT Graph { 数据对象V:V是具有相同特性的数据元素的集合,称为顶点集。 数据关系R: R={VR} VR={ | v,w v且P(v,w),表示从v到w得弧,谓词P(v,w)定义了弧的意义或信息} } ADT Graph 2.此抽象数据类型中的一些常量如下: #define TRUE 1 #define FALSE 0 #define OK 1 #define max_n 20 //最大顶点数 typedef char VertexType[20]; typedef enum{DG, DN, AG, AN} GraphKind; enum BOOL{False,True}; 3.树的结构体类型如下所示:

数电实验报告1-数电实验报告实验一

实验一门电路逻辑功能及测试 一、实验目得 1、熟悉门电路逻辑功能。 2、熟悉数字电路学习机及示波器使用方法。 二、实验仪器及材料 1、双踪示波器 2、器件 74LS00 二输入端四与非门2片 74LS20 四输入端双与非门1片 74LS86二输入端四异或门1片 74LS04 六反相器1片 三、预习要求 1、复习门电路工作原理相应逻辑表达示。 2、熟悉所有集成电路得引线位置及各引线用途。 3、了解双踪示波器使用方法。 四、实验内容 实验前按学习机使用说明先检查学习机就是否正常,然后选择实验用得集成电路,按自己设计得实验接线图接好连线,特别注意Vcc及地线不能接错。线接好后经实验指导教师检查无误方可通电。试验中改动接线须先断开电源,接好线后在通电实验。 1、测试门电路逻辑功能。 (1)选用双输入与非门74LS20一只,插入面包板,按图 连接电路,输入端接S1~S4(电平开关输入插口),输 出端接电平显示发光二极管(D1~D8任意一个)。 (2)将电平开关按表1、1置位,分别测出电压及逻辑状态。(表1、1)

2、异或门逻辑功能测试 (1)选二输入四异或门电路74LS86,按图接线,输入端1﹑2﹑4﹑5接电平开关,输出端A﹑B﹑Y接电平显示发光二极管。 (2)将电平开关按表1、2置位,将结果填入表中。 表1、2 3、逻辑电路得逻辑关系

(1)选用四二输入与非门74LS00一只,插入面包板,实验电路自拟。将输入输出逻辑关系分 别填入表1、3﹑表1、4。 (2)写出上面两个电路得逻辑表达式。 表1、3 Y=A ⊕B 表1、4 Y=A ⊕B Z=AB 4、逻辑门传输延迟时间得测量 用六反相器(非门)按图1、5接线,输80KHz 连续脉冲,用双踪示波器测输入,输出相位差,计算每个门得平均传输延迟时间得tpd 值 : tpd =0、2μs/6=1/30μs 5、利用与非门控制输出。 选用四二输入与非门74LS00一只,插入面包板,输入接任一电平开关,用示波器观察S对输出脉冲得控制作用: 一端接高有效得脉冲信号,另一端接控制信号。只有控制信号端为高电平时,脉冲信号才能通过。这就就是与非门对脉冲得控制作用。 6.用与非门组成其她门电路并测试验证 (1)组成或非门。 用一片二输入端与非门组成或非门 Y = A+ B = A ? B 画出电路图,测试并填表1、5 中。 表1、5 图如下: (2)组成异或门 ① 将异或门表达式转化为与非门表达式。 A ⊕B={[(AA)'B]'[A( B B)']}' ② 画出逻辑电路图。 ③ 测试并填表1、6。表1、6

数据结构实验报告-图的遍历

数据结构实验报告 实验:图的遍历 一、实验目的: 1、理解并掌握图的逻辑结构和物理结构——邻接矩阵、邻接表 2、掌握图的构造方法 3、掌握图的邻接矩阵、邻接表存储方式下基本操作的实现算法 4、掌握图的深度优先遍历和广度优先原理 二、实验内容: 1、输入顶点数、边数、每个顶点的值以及每一条边的信息,构造一个无向图G,并用邻接矩阵存储改图。 2、输入顶点数、边数、每个顶点的值以及每一条边的信息,构造一个无向图G,并用邻接表存储该图 3、深度优先遍历第一步中构造的图G,输出得到的节点序列 4、广度优先遍历第一部中构造的图G,输出得到的节点序列 三、实验要求: 1、无向图中的相关信息要从终端以正确的方式输入; 2、具体的输入和输出格式不限; 3、算法要具有较好的健壮性,对错误操作要做适当处理; 4、程序算法作简短的文字注释。 四、程序实现及结果: 1、邻接矩阵: #include #include #define VERTEX_MAX 30 #define MAXSIZE 20 typedef struct { int arcs[VERTEX_MAX][VERTEX_MAX] ; int vexnum,arcnum; } MGraph; void creat_MGraph1(MGraph *g) { int i,j,k; int n,m; printf("请输入顶点数和边数:"); scanf("%d%d",&n,&m); g->vexnum=n; g->arcnum=m; for (i=0;iarcs[i][j]=0;

数字图像实验报告讲解

数 字 图 像 实 验 报 告 学院:计算机与信息工程学院 专业:通信工程 学号:1008224072 姓名:张清峰

实验一图像增强—灰度变换 专业:通信工程学号:1008224072姓名:张清峰 一、实验目的: 1、了解图像增强的目的及意义,加深对图像增强的感性认识,巩固所学理论知识。 2、学会对图像直方图的分析。 3、掌握直接灰度变换的图像增强方法。 二、实验原理及知识点 术语‘空间域’指的是图像平面本身,在空间与内处理图像的方法是直接对图像的像素进行处理。空间域处理方法分为两种:灰度级变换、空间滤波。空间域技术直接对像素进行操作其表达式为 g(x,y)=T[f(x,y)] 其中f(x,y)为输入图像,g(x,y)为输出图像,T是对图像f进行处理的操作符,定义在点(x,y)的指定领域内。 定义点(x,y)的空间邻近区域的主要方法是,使用中心位于(x,y)的正方形或长方形区域,。此区域的中心从原点(如左上角)开始逐像素点移动,在移动的同时,该区域会包含不同的领域。T应用于每个位置(x,y),以便在该位置得到输出图像g。在计算(x,y)处的g值时,只使用该领域的像素。 灰度变换T的最简单形式是使用领域大小为1×1,此时,(x,y)处的g值仅由f 在该点处的亮度决定,T也变为一个亮度或灰度级变化函数。当处理单设(灰度)图像时,这两个术语可以互换。由于亮度变换函数仅取决于亮度的值,而与(x,y)无关,所以亮度函数通常可写做如下所示的简单形式: s=T(r) 其中,r表示图像f中相应点(x,y)的亮度,s表示图像g中相应点(x,y)的亮度。 三、实验内容: 1、图像数据读出 2、计算并分析图像直方图 3、利用直接灰度变换法对图像进行灰度变换 下面给出灰度变化的MATLAB程序 f=imread('C:\ch17\tu\6.jpg'); g=imhist(f,256); imshow(g) %显示其直方图

数据结构实验---图的储存与遍历

数据结构实验---图的储存与遍历

学号: 姓名: 实验日期: 2016.1.7 实验名称: 图的存贮与遍历 一、实验目的 掌握图这种复杂的非线性结构的邻接矩阵和邻接表的存储表示,以及在此两种常用存储方式下深度优先遍历(DFS)和广度优先遍历(BFS)操作的实现。 二、实验内容与实验步骤 题目1:对以邻接矩阵为存储结构的图进行DFS 和BFS 遍历 问题描述:以邻接矩阵为图的存储结构,实现图的DFS 和BFS 遍历。 基本要求:建立一个图的邻接矩阵表示,输出顶点的一种DFS 和BFS 序列。 测试数据:如图所示 题目2:对以邻接表为存储结构的图进行DFS 和BFS 遍历 问题描述:以邻接表为图的存储结构,实现图的DFS 和BFS 遍历。 基本要求:建立一个图的邻接表存贮,输出顶点的一种DFS 和BFS 序列。 测试数据:如图所示 V0 V1 V2 V3 V4 三、附录: 在此贴上调试好的程序。 #include #include #include V0 V1 V4 V3 V2 ??? ? ??? ? ????????=010000000101010 1000100010A 1 0 1 0 3 3 4

#define M 100 typedef struct node { char vex[M][2]; int edge[M ][ M ]; int n,e; }Graph; int visited[M]; Graph *Create_Graph() { Graph *GA; int i,j,k,w; GA=(Graph*)malloc(sizeof(Graph)); printf ("请输入矩阵的顶点数和边数(用逗号隔开):\n"); scanf("%d,%d",&GA->n,&GA->e); printf ("请输入矩阵顶点信息:\n"); for(i = 0;in;i++) scanf("%s",&(GA->vex[i][0]),&(GA->vex[i][1])); for (i = 0;in;i++) for (j = 0;jn;j++) GA->edge[i][j] = 0; for (k = 0;ke;k++) { printf ("请输入第%d条边的顶点位置(i,j)和权值(用逗号隔开):",k+1); scanf ("%d,%d,%d",&i,&j,&w); GA->edge[i][j] = w; } return(GA); } void dfs(Graph *GA, int v) { int i; printf("%c%c\n",GA->vex[v][0],GA->vex[v][1]); visited[v]=1;

数据结构实验报告图实验

邻接矩阵的实现 1. 实验目的 (1)掌握图的逻辑结构 (2)掌握图的邻接矩阵的存储结构 (3)验证图的邻接矩阵存储及其遍历操作的实现2. 实验内容 (1)建立无向图的邻接矩阵存储 (2)进行深度优先遍历 (3)进行广度优先遍历3.设计与编码MGraph.h #ifndef MGraph_H #define MGraph_H const int MaxSize = 10; template class MGraph { public: MGraph(DataType a[], int n, int e); ~MGraph(){ void DFSTraverse(int v); void BFSTraverse(int v); private: DataType vertex[MaxSize]; int arc[MaxSize][MaxSize]; }

int vertexNum, arcNum; }; #endif MGraph.cpp #include using namespace std; #include "MGraph.h" extern int visited[MaxSize]; template MGraph::MGraph(DataType a[], int n, int e) { int i, j, k; vertexNum = n, arcNum = e; for(i = 0; i < vertexNum; i++) vertex[i] = a[i]; for(i = 0;i < vertexNum; i++) for(j = 0; j < vertexNum; j++) arc[i][j] = 0; for(k = 0; k < arcNum; k++) { cout << "Please enter two vertexs number of edge: " cin >> i >> j; arc[i][j] = 1; arc[j][i] = 1; } }

数据结构图的遍历实验报告

实验项目名称:图的遍历 一、实验目的 应用所学的知识分析问题、解决问题,学会用建立图并对其进行遍历,提高实际编程能力及程序调试能力。 二、实验容 问题描述:建立有向图,并用深度优先搜索和广度优先搜素。输入图中节点的个数和边的个数,能够打印出用邻接表或邻接矩阵表示的图的储存结构。 三、实验仪器与设备 计算机,Code::Blocks。 四、实验原理 用邻接表存储一个图,递归方法深度搜索和用队列进行广度搜索,并输出遍历的结果。 五、实验程序及结果 #define INFINITY 10000 /*无穷大*/ #define MAX_VERTEX_NUM 40 #define MAX 40 #include #include #include #include

typedef struct ArCell{ int adj; }ArCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedef struct { char name[20]; }infotype; typedef struct { infotype vexs[MAX_VERTEX_NUM]; AdjMatrix arcs; int vexnum,arcnum; }MGraph; int LocateVex(MGraph *G,char* v) { int c = -1,i; for(i=0;ivexnum;i++) if(strcmp(v,G->vexs[i].name)==0) { c=i; break;} return c;} MGraph * CreatUDN(MGraph *G)//初始化图,接受用户输入{ int i,j,k,w; char v1[20],v2[20]; printf("请输入图的顶点数,弧数:"); scanf("%d%d",&G->vexnum,&G->arcnum);

细胞个数实验报告doc

细胞个数实验报告 篇一:细胞计数实验报告 细胞计数实验报告 一、目的 培养的细胞在一般条件下要求有一定的密度才能生长良好,所以要进行细胞计数 二、原理 细胞计数的原理和方法与血细胞计数相同。显微镜直接计数法是将一定稀释的菌体或孢子悬液注入血球计数板的计数室中,于显微镜下直接计数的一种简便、快速、直观的方法。因为计数板是一块特别的载玻片。其上由四条槽构成三个平台;中间较宽的平台又被一短横槽隔成两半,每一边的平台上各刻有一个方格网,每个方格网共分为九个大方格,一个大方格分成16个中方格,每个中方格又分成25个小方格,无论哪种每个大方格中的小方格都是400个。每一个大方格边长为0.1mm,所以计数室的容积为0.1mm3。计数时,通常只用4个四周大方格内的细胞数即可。然后求出每个大方格的平均值,即得出一个大方格中的平均细胞数,再换算成lml菌液中的总细胞数。若设大方格中平均细胞数为N,菌液稀释倍数为M,则计算方法为: lml菌液中的总菌数=平均每个中格中菌的个数=10000xMxN=10000MN(个)

三、实验材料 普通显微镜、血球计数板、试管、吸管,微量移液管、细胞悬浮液 四、实验步骤 1、将血球计数板及盖片用擦试干净,并将盖片盖在计数板上。 2、将细胞悬液吸出少许,注射在盖片边缘,使悬液充满盖片和计数板之间。 3、镜下观察,计算计数板四大格细胞总数,压线细胞只计左侧和上方的。然后按下式计算: 细胞数/ml=4大格细胞总数/ 4×10000 注意:镜下偶见由两个以上细胞组成的细胞团,应按单个细胞计算,若细胞团占10%以上,说明分散不好,需重新制备细胞悬液 五、实验结果 六、讨论与反思 注意多计数几次,求平均值 细胞要比较均匀的分布,四个大方格上的细胞数不应相差太多,否则重新混匀细胞悬浮液,再次计数 篇二:细胞生物学实验报告 染色体标本的制备及观察 泮力菁 XX00140091XX级生物基地同组者:商倩倩

数据结构实验 - 图的储存与遍历

一、实验目的 掌握图这种复杂的非线性结构的邻接矩阵和邻接表的存储表示,以及在此两种常用存储方式下深度优先遍历(DFS)和广度优先遍历(BFS)操作的实现。 二、实验内容与实验步骤 题目1:对以邻接矩阵为存储结构的图进行DFS 和BFS 遍历 问题描述:以邻接矩阵为图的存储结构,实现图的DFS 和BFS 遍历。 基本要求:建立一个图的邻接矩阵表示,输出顶点的一种DFS 和BFS 序列。 测试数据:如图所示 题目2:对以邻接表为存储结构的图进行DFS 和BFS 遍历 问题描述:以邻接表为图的存储结构,实现图的DFS 和BFS 遍历。 基本要求:建立一个图的邻接表存贮,输出顶点的一种DFS 和BFS 序列。 测试数据:如图所示 三、附录: 在此贴上调试好的程序。 #include #include #include ????????????????=010******* 010101000100010A

#define M 100 typedef struct node { char vex[M][2]; int edge[M ][ M ]; int n,e; }Graph; int visited[M]; Graph *Create_Graph() { Graph *GA; int i,j,k,w; GA=(Graph*)malloc(sizeof(Graph)); printf ("请输入矩阵的顶点数和边数(用逗号隔开):\n"); scanf("%d,%d",&GA->n,&GA->e); printf ("请输入矩阵顶点信息:\n"); for(i = 0;in;i++) scanf("%s",&(GA->vex[i][0]),&(GA->vex[i][1])); for (i = 0;in;i++) for (j = 0;jn;j++) GA->edge[i][j] = 0; for (k = 0;ke;k++) { printf ("请输入第%d条边的顶点位置(i,j)和权值(用逗号隔开):",k+1); scanf ("%d,%d,%d",&i,&j,&w); GA->edge[i][j] = w; } return(GA); } void dfs(Graph *GA, int v) { int i; printf("%c%c\n",GA->vex[v][0],GA->vex[v][1]); visited[v]=1;

图的基本操作 实验报告

实验五图的基本操作 一、实验目的 1、使学生可以巩固所学的有关图的基本知识。 2、熟练掌握图的存储结构。 3、熟练掌握图的两种遍历算法。 二、实验内容 [问题描述] 对给定图,实现图的深度优先遍历和广度优先遍历。 [基本要求] 以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。以用户指定的结点为起点,分别输出每种遍历下的结点访问序列。 【测试数据】 由学生依据软件工程的测试技术自己确定。 三、实验前的准备工作 1、掌握图的相关概念。 2、掌握图的逻辑结构和存储结构。 3、掌握图的两种遍历算法的实现。 四、实验报告要求 1、实验报告要按照实验报告格式规范书写。 2、实验上要写出多批测试数据的运行结果。 3、结合运行结果,对程序进行分析。

五、算法设计 1、程序所需头文件已经预处理宏定义和结构体定义如下 #include #define MaxVerNum 100 struct edgenode { int endver; int inform; edgenode* edgenext; }; struct vexnode { char vertex; edgenode* edgelink; }; struct Graph { vexnode adjlists[MaxVerNum]; int vexnum; int arcnum; }; 2、创建无向图 void CreatAdjList(Graph* G) { int i,j,k; edgenode* p1; edgenode* p2; cout<<"请输入顶点数和边数:"<>G->vexnum>>G->arcnum; cout<<"开始输入顶点表:"<vexnum;i++) { cin>>G->adjlists[i].vertex; G->adjlists[i].edgelink=NULL; } cout<<"开始输入边表信息:"<arcnum;k++) { cout<<"请输入边对应的顶点:"; cin>>i>>j; p1=new edgenode; p1->endver=j; p1->edgenext=G->adjlists[i].edgelink; G->adjlists[i].edgelink=p1;

数据结构实验七图的创建与遍历

实验七图的创建与遍历 实验目的: 通过上机实验进一步掌握图的存储结构及基本操作的实现。 实验内容与要求: 要求: ⑴能根据输入的顶点、边/弧的信息建立图; ⑵实现图中顶点、边/弧的插入、删除; ⑶实现对该图的深度优先遍历; ⑷实现对该图的广度优先遍历。 备注:单号基于邻接矩阵,双号基于邻接表存储结构实现上述操作。算法设计: #include #include #define INFINITY 32767 #define MAX_VEX 20 //最大顶点个数#define QUEUE_SIZE (MAX_VEX+1) //队列长度 using namespace std; bool *visited; //访问标志数组 //图的邻接矩阵存储结构 typedef struct{ char *vexs; //顶点向量 int arcs[MAX_VEX][MAX_VEX]; //邻接矩阵 int vexnum,arcnum; //图的当前顶点数和弧数 }Graph; //队列类 class Queue{ public: void InitQueue() { base=(int *)malloc(QUEUE_SIZE*sizeof(int)); front=rear=0; } void EnQueue(int e) { base[rear]=e; rear=(rear+1)%QUEUE_SIZE; } void DeQueue(int &e) { e=base[front]; front=(front+1)%QUEUE_SIZE; } public: int *base; int front; int rear; }; //图G中查找元素c的位置 int Locate(Graph G,char c) { for(int i=0;i

图的深度优先遍历实验报告.doc

一.实验目的 熟悉图的存储结构,掌握用单链表存储数据元素信息和数据元素之间的 关系的信息的方法,并能运用图的深度优先搜索遍历一个图,对其输出。 二.实验原理 深度优先搜索遍历是树的先根遍历的推广。假设初始状态时图中所有顶 点未曾访问,则深度优先搜索可从图中某个顶点 v 出发,访问此顶点,然后依次从 v 的未被访问的邻接点出发深度优先遍历图,直至图中所有 与 v 有路径相通的顶点都被访问到;若此时图有顶点未被访问,则另选图中一个未曾访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。 图的邻接表的存储表示: #define MAX_VERTEX_NUM 20 #define MAXNAME 10 typedef char VertexType[MAXNAME]; typedef struct ArcNode{ int adjvex; struct ArcNode *nextarc; }ArcNode; typedef struct VNode{ VertexType data; ArcNode *firstarc;

}VNode,AdjList[MAX_VERTEX_NUM]; typedef struct{ AdjList vertices; int vexnum,arcnum; int kind; }ALGraph; 三.实验容 编写 LocateVex 函数, Create 函数, print 函数, main 函数,输入要构造的图的相关信息,得到其邻接表并输出显示。 四。实验步骤 1)结构体定义,预定义,全局变量定义。 #include"stdio.h" #include"stdlib.h" #include"string.h" #define FALSE 0 #define TRUE 1 #define MAX 20 typedef int Boolean; #define MAX_VERTEX_NUM 20

汇编实验报告

汇编语言程序设计 实验报告 学号:100511530 班级:电气信息类1005 姓名:陆淑琴 指导老师:李诗高

实验一、汇编语言上机的基本过程及环境 【实验目的】 (1)熟悉汇编语言的编辑、汇编、连接及调试的全过程,重点掌握使用DEBUG调试程序的方法。 (2)了解汇编语言的程序结构。 【实验内容】 (1)在数据段中定义两个数(数据自拟,包含有正数和负数),要求编写程序分别计算出这两个数的和、差、积、商,并用Debug的相关命令查询计算结果(包括对CF,OF,SF,ZF的影响)。 (2)首先对AX,BX,CX寄存器赋初值(数据自拟),再将AX寄存器的中间八位,BX的低四位和CX的高四位拼接成一个新的字,并把结果存入偏移地址为0000H的存储单元。其中BX的低四位作为结果字的高四位,CX的高四位作为结果字的低四位。并用Debug的相关命令查询内存单元的结果字。 源代码: DA TA SEGMENT val1 DW 1000h val2 DW 2000h maxv DW ? DA TA ENDS STACK SEGMENT STACK 'STACK'

DB 100H DUP(?) STACK ENDS CODE SEGMENT 'CODE' ASSUME CS:CODE, DS:DATA,SS:STACK .386 MAIN: MOV AX, DATA; MOV DS, AX PUSH val1 PUSH val2 CALL MAX ; POP maxv ;栈顶返回值出栈 MOV AX, 4c00H INT 21H MAX PROC PUSH BP ;执行该指令前堆栈情况 MOV BP, SP ;执行后堆栈情况 MOV AX, [BP+4] CMP AX, [BP+6] JA EXIT MOV AX, [BP+6] EXIT: MOV [BP+6], AX ;用栈顶返回值 POP BP RET 2 ;执行后堆栈情况 MAX ENDP CODE ENDS END MAIN 【实验步骤】 (1)用编辑软件(记事本、UltraEdit等)编辑一个扩展文件名为ASM的汇编语言源程序。 (2)用汇编程序MASM汇编上述的汇编语言源程序,形成目标代码文件。(扩展名为OBJ) (3)用连接程序LINK连接目标代码文件,形成可执行文件。(扩展名为EXE)(4)用DEBUG32调试可执行文件,观察执行结果,以验证其正确性。

数字测量实验报告

实验一计数器、译码器电路 一、实验目的 1.掌握555门电路构成的矩形波发生器; 2.掌握分频器电路; 3.掌握计数器电路; 4.掌握译码驱动电路; 二、实验要求 1.熟悉Multisim仿真软件; 2.采用Multisim绘制数字式电子钟电路; 3.应用Multisim仿真软件进行仿真和调试; 4.分析结果,写出实验报告; 三、实验步骤 1.振荡器电路图: 振荡器电路给数字式电子钟提供一个频率稳定、准确的32768Hz的矩形波波信号,其可保证数字式电子钟的走时准确及稳定,本实验采用555门电路构成的矩形波发生器。 给出振荡器电路仿真图与仿真波形 2.分频器电路: 分频器电路将32768Hz的高频方波信号经32768(215)次分频后得到1Hz的方波信号供秒计数器进行计数。分频器实际上也就是计数器。

给出分频器电路仿真图与仿真波形 3.时间计数器电路: 时间计数电路由秒个位、十位计数器、分个位、十位计数及时个位、十位计数电路构成。其中:秒个位和秒十位计数器、分个位和分十位计数为六十进制计数器,而根据设计要求时个位和时十位构成的为十二进制计数器。 图1为2片74160构成的60秒计时电路,图2为两位的小时计时电路,其中个位采用数码管,十位采用发光二极管,要求仿真图中均采用数码管。 图1 秒计时电路

图2 计时电路 给出时间计数器电路仿真图 4.译码驱动电路: 译码驱动电路将计数器输出的8421BCD码转换为数码管需要的逻辑状态,并且为保证数码管正常工作提供足够的工作电流。 5.数码管: 数码管通常有发光二极(LED)管数码管、液晶(LCD)数码管,本设计提供的为LED数码管。 6. 给出实验仿真总图

数据结构实验—图实验报告

精品文档数据结构 实 验 报 告

目的要求 1.掌握图的存储思想及其存储实现。 2.掌握图的深度、广度优先遍历算法思想及其程序实现。 3.掌握图的常见应用算法的思想及其程序实现。 实验内容 1.键盘输入数据,建立一个有向图的邻接表。 2.输出该邻接表。 3.在有向图的邻接表的基础上计算各顶点的度,并输出。 4.以有向图的邻接表为基础实现输出它的拓扑排序序列。 5.采用邻接表存储实现无向图的深度优先递归遍历。 6.采用邻接表存储实现无向图的广度优先遍历。 7.在主函数中设计一个简单的菜单,分别调试上述算法。 源程序: 主程序的头文件:队列 #include #include #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int QElemType; typedef struct QNode{ //队的操作 QElemType data; struct QNode *next; }QNode,*QueuePtr; typedef struct { QueuePtr front; QueuePtr rear; }LinkQueue; void InitQueue(LinkQueue &Q){ //初始化队列 Q.front =Q.rear =(QueuePtr)malloc(sizeof(QNode)); if(!Q.front) exit(OVERFLOW); //存储分配失败 Q.front ->next =NULL; } int EnQueue(LinkQueue &Q,QElemType e) //插入元素e为Q的新的队尾元素{ QueuePtr p; p=(QueuePtr)malloc(sizeof(QNode)); if(!p) exit(OVERFLOW); p->data=e;

初中化学《常见的酸和碱》单元教学设计以及思维导图(1)学习资料

常见的酸和碱主题设计 适用年级九年级 所需时间课内共用6课时,每周3课时;课外共用1课时 主题单元学习概述 本单元的教学核心内容,隶属于课程标准中第二个“一级主题”——“身边的化学物质”在的二级主题——生活中的常见化合物,是其主要内容之一。本主题单元旨在引导学生认识和探究身边的化学物质酸和碱,了解它们对人类生活的影响,体会科学进步对提高人类生活质量所做出的巨大贡献;增强学生对化学的好奇心和探究欲望,使学生初步认识物质的用途和性质之间的关系,帮助学生从化学的角度认识和理解人与自然的关系,初步形成科学的物质观和合理利用物质的意识。 本主题单元内容来源于人教版教材初中化学九年级课本第十单元。该主题单元共分为以下四个专题: 专题一:酸及其性质。让学生认识常见的酸,认识酸的性质并知道认识物质性质的方法;学会对浓酸的使用;了解酸的应用。 专题二:碱及其性质。让学生认识常见的碱,认识碱的性质并进一步学习认识物质性质的方法;学会对浓碱的使用;了解碱的应用。 专题三:酸碱中和反应。理解中和反应的实质就是酸和碱中的H+和OH-结合成H2O;知道可以通过中和反应的方法降低酸或碱的含量。

专题四:溶液的酸碱性。了解酸碱指示剂和pH试纸检验溶液酸碱性的方法,并知道酸碱性对人体健康和农作物生长的影响。 本主题单元的教学重点:酸和碱的化学性质,酸碱的中和反应,溶液酸碱性对生命活动的意义。 主要的学习方式:探究学习、自主学习与合作学习等。 预期教学成果:探究实验报告、思维导图、课堂综合检测、主题单元检测等。 主题单元规划思维导图 主题单元学习目标

知识与技能: 1.了解酸和碱的性质 2.理解物质的酸碱性及中和反应的实质 3.初步学会测定溶液酸碱性的方法及判断溶液酸碱性强弱的方法 过程与方法: 1.通过比较常见酸和碱学会概括归纳的学习方法 2.通过对酸和碱的化学性质的认识过程学习探究认识事物的方法 3.通过对酸碱溶液的酸碱性的认识学习建立微观与宏观相联系的思维方式 4.通过对溶液酸碱性的测定及酸碱混合后pH的变化测定体会间接观察法在实验探究中的作用 情感态度与价值观: 1.通过对酸碱性质的探究,增进对科学探究的理解,提高科学探究能力和分析问题、解决问题的能力 2.通过了解酸和碱对生命活动的重要意义,进一步激发学生学习化学的兴趣 3.通过对酸碱对生命活动的作用及中和反应的应用学习体会化学的价值所在 对应课标 1.认识常见酸碱的主要性质和用途,知道酸碱的腐蚀性 2.初步学会常见酸碱溶液的稀释方法

数字图像实验报告

数字图像处理实验报告 学院名称:信息科学与工程学院 专业班级:计科0801 姓名:谢旭芳 学号:0909080423 指导老师:赵欢喜

实验二数字图像的空间域滤波和频域滤波 一.实验目的 1.掌握图像滤波的基本定义及目的; 2.理解空间域滤波的基本原理及方法; 3.掌握进行图像的空域滤波的方法。 4.掌握傅立叶变换及逆变换的基本原理方法; 5.理解频域滤波的基本原理及方法; 6.掌握进行图像的频域滤波的方法。 二.实验内容描述 1.空间平滑滤波: a)读出eight.tif这幅图像,给这幅图像分别加入椒盐噪声和高斯噪声后并与 前一张图显示在同一图像窗口中;(提示:加噪音函数为imnoise) b)对加入噪声图像选用不同的平滑(低通)模板做运算,对比不同模板所 形成的效果,要求在同一窗口中显示;(提示:fspecial、imfilter或filter2, 或自己编码实现) c)使用函数imfilter时,分别采用不同的填充方法(或边界选项,如零填 充、’replicate’、’symmetric’、’circular’)进行低通滤波,显示处理后的图 像 d)运用for循环,将加有椒盐噪声的图像进行10次,20次均值滤波,查看 其特点,显示均值处理后的图像;(提示:利用fspecial函数的’average’类型 生成均值滤波器) e)对加入椒盐噪声的图像分别采用均值滤波法,和中值滤波法对有噪声的 图像做处理,要求在同一窗口中显示结果。(提示:medfilt2) f)自己设计平滑空间滤波器,并将其对噪声图像进行处理,显示处理后的 图像; 2.空间锐化滤波 a)读出blurry_moon.tif这幅图像,采用3×3的拉普拉斯算子w = [ 1, 1, 1; 1

数据结构实验报告--图实验

图实验 一,邻接矩阵的实现 1.实验目的 (1)掌握图的逻辑结构 (2)掌握图的邻接矩阵的存储结构 (3)验证图的邻接矩阵存储及其遍历操作的实现 2.实验内容 (1)建立无向图的邻接矩阵存储 (2)进行深度优先遍历 (3)进行广度优先遍历 3.设计与编码 MGraph.h #ifndef MGraph_H #define MGraph_H const int MaxSize = 10; template class MGraph { public: MGraph(DataType a[], int n, int e); ~MGraph(){ } void DFSTraverse(int v); void BFSTraverse(int v); private: DataType vertex[MaxSize]; int arc[MaxSize][MaxSize]; int vertexNum, arcNum; }; #endif MGraph.cpp #include using namespace std; #include "MGraph.h" extern int visited[MaxSize]; template MGraph::MGraph(DataType a[], int n, int e)

{ int i, j, k; vertexNum = n, arcNum = e; for(i = 0; i < vertexNum; i++) vertex[i] = a[i]; for(i = 0;i < vertexNum; i++) for(j = 0; j < vertexNum; j++) arc[i][j] = 0; for(k = 0; k < arcNum; k++) { cout << "Please enter two vertexs number of edge: "; cin >> i >> j; arc[i][j] = 1; arc[j][i] = 1; } } template void MGraph::DFSTraverse(int v) { cout << vertex[v]; visited[v] = 1; for(int j = 0; j < vertexNum; j++) if(arc[v][j] == 1 && visited[j] == 0) DFSTraverse(j); } template void MGraph::BFSTraverse(int v) { int Q[MaxSize]; int front = -1, rear = -1; cout << vertex[v]; visited[v] = 1; Q[++rear] = v; while(front != rear) { v = Q[++front]; for(int j = 0;j < vertexNum; j++) if(arc[v][j] == 1 && visited[j] == 0){ cout << vertex[j]; visited[j] = 1;

相关主题
文本预览
相关文档 最新文档