图的遍历实验报告

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

实验四:图的遍历

题目:图及其应用——图的遍历

班级:姓名:学号:完成日期:

一.需求分析

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.树的结构体类型如下所示:

typedef struct

{ //弧结点与矩阵的类型

int adj; //VRType为弧的类型。图--0,1;网--权值

int *Info; //与弧相关的信息的指针,可省略

}ArcCell, AdjMatrix[max_n][max_n];

typedef struct

{

VertexType vexs[max_n];//顶点

AdjMatrix arcs; //邻接矩阵

int vexnum, arcnum; //顶点数,边数

}MGraph;

//队列的类型定义

typedef int QElemType;

typedef struct QNode

{

QElemType data;

struct QNode *next;

}QNode, *QueuePtr;

typedef struct

{

QueuePtr front;

QueuePtr rear;

}LinkQueue;

4.本程序包含三个模块

1).主程序模块

void main( )

{

创建树;

深度优先搜索遍历;

广度优先搜索遍历;

}

2).树模块——实现树的抽象数据类型

3).遍历模块——实现树的深度优先遍历和广度优先遍历各模块之间的调用关系如下:

主程序模块

树模块

遍历模块三.详细设计

#include "stdafx.h"

#include

using namespace std;

#define TRUE 1

#define FALSE 0

#define OK 1

#define max_n 20 //最大顶点数

typedef char VertexType[20];

typedef enum{DG, DN, AG, AN} GraphKind;

图的遍历操作实验报告

. .. . .. .. 实验三、图的遍历操作 一、目的 掌握有向图和无向图的概念;掌握邻接矩阵和邻接链表建立图的存储结构;掌握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、加深对二叉树的理解,逐步培养解决实际问题的编程能力。 二、实验环境 运行C或VC++的微机。 三、实验内容 1、依次输入元素值,以链表方式建立二叉树,并输出结点的值。 2、分别以前序、中序和后序遍历二叉树的方式输出结点内容。 四、设计思路 1. 对于这道题,我的设计思路是先做好各个分部函数,然后在主函数中进行顺序排列,以此完成实验要求 2.二叉树采用动态数组 3.二叉树运用9个函数,主要有主函数、构建空二叉树函数、建立二叉树函数、访问节点函数、销毁二叉树函数、先序函数、中序函数、后序函数、范例函数,关键在于访问节点 五、程序代码 #include #include #include #define OK 1 #define ERROR 0 typedef struct TNode//结构体定义 {

int data; //数据域 struct TNode *lchild,*rchild; // 指针域包括左右孩子指针 }TNode,*Tree; void CreateT(Tree *T)//创建二叉树按,依次输入二叉树中结点的值 { int a; scanf("%d",&a); if(a==00) // 结点的值为空 *T=NULL; else // 结点的值不为空 { *T=(Tree)malloc(sizeof(TNode)); if(!T) { printf("分配空间失败!!TAT"); exit(ERROR); } (*T)->data=a; CreateT(&((*T)->lchild)); // 递归调用函数,构造左子树 CreateT(&((*T)->rchild)); // 递归调用函数,构造右子树 } } void InitT(Tree *T)//构建空二叉树 { T=NULL; } void DestroyT(Tree *T)//销毁二叉树 { if(*T) // 二叉树非空 { DestroyT(&((*T)->lchild)); // 递归调用函数,销毁左子树 DestroyT(&((*T)->rchild)); // 递归调用函数,销毁右子树 free(T); T=NULL; } } void visit(int e)//访问结点 { printf("%d ",e); }

图的遍历实验报告

实验四:图的遍历 题目:图及其应用——图的遍历 班级:姓名:学号:完成日期: 一.需求分析 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

二叉树实验报告

实验题目:实验九——二叉树实验 算法设计(3) 问题分析: 1、题目要求:编写算法交换二叉树中所有结点的左右子树 2、设计思路:首先定义一个二叉树的数据类型,使用先序遍历建立该二叉树,遍历二叉树,设计左右子树交换的函数,再次遍历交换之后的二叉树,与先前二叉树进行比较。遍历算法与交换算法使用递归设计更加简洁。 3、测试数据: A、输入:1 2 4 0 0 5 0 0 3 0 0 交换前中序遍历:4 2 5 1 3 交换后中序遍历:3 1 5 2 4 交换前:交换后: B、输入:3 7 11 0 0 18 17 0 0 19 0 0 6 13 0 0 16 0 0 交换前中序遍历:11 7 17 18 19 3 13 6 16 交换后中序遍历:16 6 13 3 19 18 17 7 11 概要设计: 1、为了实现上述功能:①构造一个空的二叉树;②应用先序遍历输入,建立二叉树;③中序遍历二叉树;④调用左右子树交换函数;⑤中序遍历交换过后的二叉树。 2、本程序包括4个函数: ①主函数main() ②先序遍历二叉树建立函数creat_bt() ③中序遍历二叉树函数inorder() ④左右子树交换函数 exchange()

各函数间关系如下: 详细设计: 1、结点类型 typedef struct binode //定义二叉树 { int data; //数据域 struct binode *lchild,*rchild; //左孩子、右孩子 }binode,*bitree; 2、各函数操作 ① 先序遍历建二叉树函数 bitree creat_bt() { 输入结点数据; 判断是否为0{ 若是,为空; 不是,递归;} 返回二叉树; } ② 左右子树交换函数 void exchange(bitree t) { 判断结点是否为空{ 否,交换左右子树; 递归;} } ③ 中序遍历函数 void inorder(bitree bt) { 判断是否为空{ 递归左子树; 输出; 递归右子树;} } main () creat_bt () inorder () exchange ()

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

数据结构实验报告 实验:图的遍历 一、实验目的: 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) %显示其直方图

二叉树的建立和遍历的实验报告doc

二叉树的建立和遍历的实验报告 篇一:二叉树的建立及遍历实验报告 实验三:二叉树的建立及遍历 【实验目的】 (1)掌握利用先序序列建立二叉树的二叉链表的过程。 (2)掌握二叉树的先序、中序和后序遍历算法。 【实验内容】 1. 编写程序,实现二叉树的建立,并实现先序、中序和后序遍历。 如:输入先序序列abc###de###,则建立如下图所示的二叉树。 并显示其先序序列为:abcde 中序序列为:cbaed 后序序列为:cbeda 【实验步骤】 1.打开VC++。 2.建立工程:点File->New,选Project标签,在列表中选Win32 Console Application,再在右边的框里为工程起好名字,选好路径,点OK->finish。至此工程建立完毕。 3.创建源文件或头文件:点File->New,选File标签,在列表里选C++ Source File。给文件起好名字,选好路径,点OK。至此一个源文件就被添加到了你刚创建的工程之中。

4.写好代码 5.编译->链接->调试 #include #include #define OK 1 #define OVERFLOW -2 typedef int Status; typedef char TElemType; typedef struct BiTNode { TElemType data; struct BiTNode *lchild, *rchild; }BiTNode,*BiTree; Status CreateBiTree(BiTree &T) { TElemType ch; scanf("%c",&ch); if (ch=='#') T= NULL; else { if (!(T = (BiTNode *)malloc(sizeof(BiTNode))))

数据结构实验报告图实验

邻接矩阵的实现 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; } }

二叉树的遍历算法实验报告

二叉树实验报告 09信管石旭琳 20091004418 一、实验目的: 1、理解二叉树的遍历算法及应用 2、理解哈夫曼树及其应用。 3、掌握哈夫曼编码思想。 二、实验内容: 1、建立二叉树二叉链表 2、实现二叉树递归遍历算法(中序、前序、后序) 3、求二叉树高度 4、求二叉树结点个数 5、求二叉树叶子个数 6、将序号为偶数的值赋给左子树 三、主要程序: #include #include typedef int ElemType; struct BiTNode { ElemType data; struct BiTNode *lch,*rch; }BiTNode,*BiTree; struct BiTNode *creat_bt1(); struct BiTNode *creat_bt2(); void preorder (struct BiTNode *t); void inorder (struct BiTNode *t); void postorder (struct BiTNode *t); void numbt (struct BiTNode *t); int n,n0,n1,n2; void main() { int k; printf("\n\n\n"); printf("\n\n 1.建立二叉树方法1(借助一维数组建立)"); printf("\n\n 2.建立二叉树方法2(先序递归遍历建立)"); printf("\n\n 3.先序递归遍历二叉树"); printf("\n\n 4.中序递归遍历二叉树"); printf("\n\n 5.后序递归遍历二叉树"); printf("\n\n 6.计算二叉树结点个数"); printf("\n\n 7.结束程序运行");

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

一.实验目的 熟悉图的存储结构,掌握用单链表存储数据元素信息和数据元素之间的关系的信息的方法,并能运用图的深度优先搜索遍历一个图,对其输出。 二.实验原理 深度优先搜索遍历是树的先根遍历的推广。假设初始状态时图中所有顶点未曾访问,则深度优先搜索可从图中某个顶点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

细胞个数实验报告doc

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

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

二叉树的遍历实验报告

二叉树的遍历实验报告 一、需求分析 在二叉树的应用中,常常要求在树中查找具有某种特征的结点,或者对树中全部结点逐一进行某种处理,这就是二叉树的遍历问题。 对二叉树的数据结构进行定义,建立一棵二叉树,然后进行各种实验操作。 二叉树是一个非线性结构,遍历时要先明确遍历的规则,先访问根结点还时先访问子树,然后先访问左子树还是先访问有右子树,这些要事先定好,因为采用不同的遍历规则会产生不同的结果。本次实验要实现先序、中序、后序三种遍历。 基于二叉树的递归定义,以及遍历规则,本次实验也采用的是先序遍历的规则进行建树的以及用递归的方式进行二叉树的遍历。 二、系统总框图

三、各模块设计分析 (1)建立二叉树结构 建立二叉树时,要先明确是按哪一种遍历规则输入,该二叉树是按你所输入的遍历规则来建立的。本实验用的是先序遍历的规则进行建树。 二叉树用链表存储来实现,因此要先定义一个二叉树链表存储结构。因此要先定义一个结构体。此结构体的每个结点都是由数据域data 、左指针域Lchild 、右指针域Rchild 组成,两个指针域分别指向该结点的左、右孩子,若某结点没有左孩子或者右孩子时,对应的指针域就为空。最后,还需要一个链表的头指针指向根结点。 要注意的是,第一步的时候一定要先定义一个结束标志符号,例如空格键、#等。当它遇到该标志时,就指向为空。 建立左右子树时,仍然是调用create ()函数,依此递归进行下去,

直到遇到结束标志时停止操作。 (2)输入二叉树元素 输入二叉树时,是按上面所确定的遍历规则输入的。最后,用一个返回值来表示所需要的结果。 (3)先序遍历二叉树 当二叉树为非空时,执行以下三个操作:访问根结点、先序遍历左子树、先序遍历右子树。 (4)中序遍历二叉树 当二叉树为非空时,程序执行以下三个操作:访问根结点、先序遍历左子树、先序遍历右子树。 (5)后序遍历二叉树 当二叉树为非空时,程序执行以下三个操作:访问根结点、先序遍历左子树、先序遍历右子树。 (6)主程序 需列出各个函数,然后进行函数调用。 四、各函数定义及说明 因为此二叉树是用链式存储结构存储的,所以定义一个结构体用以存储。 typedef struct BiTNode { char data; struct BiTNode *Lchild; struct BiTNode *Rchild;

图的基本操作 实验报告

实验五图的基本操作 一、实验目的 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;

二叉树的建立和遍历的实验报告

竭诚为您提供优质文档/双击可除二叉树的建立和遍历的实验报告 篇一:二叉树遍历实验报告 数据结构实验报告 报告题目:二叉树的基本操作学生班级: 学生姓名:学号: 一.实验目的 1、基本要求:深刻理解二叉树性质和各种存储结构的特点及适用范围;掌握用指针类型描述、访问和处理二叉树的运算;熟练掌握二叉树的遍历算法;。 2、较高要求:在遍历算法的基础上设计二叉树更复杂操作算法;认识哈夫曼树、哈夫曼编码的作用和意义;掌握树与森林的存储与便利。二.实验学时: 课内实验学时:3学时课外实验学时:6学时三.实验题目 1.以二叉链表为存储结构,实现二叉树的创建、遍历(实验类型:验证型)1)问题描述:在主程序中设计一个简单的菜单,分别调用相应的函数功能:1…建立树2…前序

遍历树3…中序遍历树4…后序遍历树5…求二叉树的高度6…求二叉树的叶子节点7…非递归中序遍历树0…结束2)实验要求:在程序中定义下述函数,并实现要求的函数功能:createbinTree(binTree structnode*lchild,*rchild; }binTnode;元素类型: intcreatebinTree(binTree voidpreorder(binTreevoidInorder(binTree voidpostorder(binTreevoidInordern(binTreeintleaf(bi nTree intpostTreeDepth(binTree 2、编写算法实现二叉树的非递归中序遍历和求二叉树高度。1)问题描述:实现二叉树的非递归中序遍历和求二叉树高度2)实验要求:以二叉链表作为存储结构 3)实现过程: 1、实现非递归中序遍历代码: voidcbiTree::Inordern(binTreeinttop=0;p=T;do{ while(p!=nuLL){ stack[top]=p;;top=top+1;p=p->lchild;}; if(top>0){ top=top-1;p=stack[top];

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

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

目的要求 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.掌握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.问题描述 设输入该二叉树的前序序列为: ABC##DE#G##F##HI##J#K##(#代表空子树) 请编程完成下列任务: ⑴请根据此输入来建立该二叉树,并输出该二叉树的前序、中序和后序序列; ⑵按层次遍历的方法来输出该二叉树按层次遍历的序列; ⑶求该二叉树的高度。 2.设计描述 (1)二叉树是一种树形结构,遍历就是要让树中的所有节点被且仅被访问一次,即按一定规律排列成一个线性队列。二叉(子)树是一种递归定义的结构,包含三个部分:根结点(N)、左子树(L)、右子树(R)。根据这三个部分的访问次序对二叉树的遍历进行分类,总共有6种遍历方案:NLR、LNR、LRN、NRL、RNL和LNR。研究二叉树的遍历就是研究这6种具体的遍历方案,显然根据简单的对称性,左子树和右子树的遍历可互换,即NLR与NRL、LNR与RNL、LRN 与RLN,分别相类似,因而只需研究NLR、LNR和LRN三种即可,分别称为“先序遍历”、“中序遍历”和“后序遍历”。采用递归方式就可以容易的实现二叉树的遍历,算法简单且直观。 (2)此外,二叉树的层次遍历即按照二叉树的层次结构进行遍历,按照从上到下,同一层从左到右的次序访问各节点。遍历算法可以利用队列来实现,开始时将整个树的根节点入队,然后每从队列中删除一个节点并输出该节点的值时,都将它的非空的左右子树入队,当队列结束时算法结束。

(3)计算二叉树高度也是利用递归来实现:若一颗二叉树为空,则它的深度为0,否则深度等于左右子树的最大深度加一。 3.源程序 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include #include #include #define ElemType char struct BTreeNode { ElemType data; struct BTreeNode* left; struct BTreeNode* right; }; void CreateBTree(struct BTreeNode** T) { char ch; scanf_s("\n%c", &ch); if (ch == '#') *T = NULL;

图的遍历操作实验报告

实验三、图的遍历操作 一、目的 掌握有向图和无向图的概念;掌握邻接矩阵和邻接链表建立图的存储结构;掌握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"" #include"" ertex); irstedge; irstedge; } } }//endwhile } //==========主函数=========== void main() { ALGraph *G; G=(ALGraph *)malloc(sizeof(ALGraph));

CreatALGraph(G); printf("Print Graph DFS: "); DFS(G); printf("\n"); printf("Print Graph BFS: "); BFS(G,3); printf("\n"); } 五、实验内容 1调试程序。设计一个有向图和一个无向图,任选一种存储结构,完成有向图和无向图的DFS(深度优先遍历)和BFS(广度优先遍历)的操作。 邻接矩阵作为存储结构的运行结果: 邻接链表作为存储结构的运行结果: 六、实验报告要求 画出你所设计的图,写出两种方法的遍历序列。

数字图像实验报告

数字图像处理实验报告 学院名称:信息科学与工程学院 专业班级:计科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.掌握二叉链表的存储结构; 2.掌握二叉链表的建立; 3.掌握二叉树的先序遍历、中序遍历、后序遍历的递归算法; 4. 掌握二叉树遍历算法的应用; 二.实习内容 1.按先序序列建立二叉树的二叉链表(算法6.4)(空树用#表示) 2.对生成的二叉树分别进行先序遍历、中序遍历、后序遍历,输出结果。 3.统计二叉树中结点个数; 4. 求二叉树的高度; 三.实验步骤 1.定义二叉链表的存储结构 #include "stdio.h" #include "stdlib.h" typedef char TElemType; typedef struct BiTNode { TElemType data; struct BiTNode *lchild, *rchild; // 左右孩子指针 }BiTNode,*BiTree; 2.编写函数CreateBiTree,按先序序列建立二叉树的二叉链表; 测试的字符序列为abdg###e##c#f##; 程序代码为: void CreateBiTree(BiTree &T) { // 算法6.4:按先序次序输入二叉树中结点的值(可为字符型或整型,在主程中定义),构造二叉链表表示的二叉树T。以#表示空树 TElemType ch; scanf("%c",&ch); if(ch=='#') // 空 T=NULL; else { T=(BiTree )malloc(sizeof(BiTNode)); // 生成根结点 if(!T)

exit(-1); T->data=ch; CreateBiTree(T->lchild);// 递归构造左子树 CreateBiTree(T->rchild);// 构造右子树 } } 2. 编写二叉树的先序遍历、中序遍历、后序遍历的递归算法 int preOrderTraverse(BiTree T) { // 初始条件:二叉树T存在,先序递归遍历T; if(T==NULL) return 1; if(T!=NULL) // T不空 {printf("%5c",T->data); // 访问根结点preOrderTraverse(T->lchild);// 先序遍历左子树 preOrderTraverse(T->rchild);// 先序遍历右子树 } } int inOrderTraverse(BiTree T) { // 初始条件:二叉树T存在,中序递归遍历T; if(T==NULL) return 1; if(T!=NULL) // T不空 { inOrderTraverse(T->lchild);// 中序遍历左子树 printf("%5c",T->data); // 访问根结点inOrderTraverse(T->rchild);// 中序遍历右子树 } } int postOrderTraverse(BiTree T) { // 初始条件:二叉树T存在, // 操作结果:后序递归遍历T; if(T==NULL) return 1; if(T!=NULL) // T不空 { postOrderTraverse(T->lchild);// 后序遍历左子树 postOrderTraverse(T->rchild);// 后序遍历右子树 printf("%5c",T->data); // 访问根结点

相关文档
最新文档