当前位置:文档之家› 数据结构实验指导书(2014)

数据结构实验指导书(2014)

数据结构实验指导书(2014)
数据结构实验指导书(2014)

目录

试验步骤 (2)

试验报告规范 (4)

试验报告样例1最大公因数 (5)

试验报告样例2 进制转换 (10)

DEV C++ 调试方法简介 (16)

Visual C++6.0调试方法简介 (22)

预备实验1 字符串处理 (26)

预备实验2 文件读取 (27)

预备实验3 随机数生成 (28)

预备实验4 递归函数 (29)

预备实验5 字符串数组的查找 (30)

实验1约瑟夫环问题 (31)

实验2 逆波兰表达式求值 (32)

实验3四则运算表达式求值 (34)

实验4 优先队列与堆 (35)

实验5 图的遍历问题 (37)

实验6 最短路径问题 (39)

实验7 排序 (41)

实验8 散列表 (43)

试验步骤

(一)问题分析和任务定义

在进行设计之前,首先应该充分地分析和理解问题,明确问题要求做什么?限制条件是什么。注意:本步骤强调的是做什么?而不是怎么做。

主要完成三个方面的工作:

(1)分析并确定问题要处理的对象(数据)是什么。例如:输入数据的类型、值的范围以及输入的形式。

(2)分析并确定要实现的功能是什么。也就是说要对输入的数据进行什么样的处理。

注意:对问题中描述的需要实现的功能,应避开算法(具体的实现方法)和所

涉及的数据类型,仅需对所需完成的任务做出明确的定义。

(3)分析并确定处理后的结果如何显示。

这一步还应该为调试程序准备好测试数据,包括合法的输入数据和非法形式的输入数据;以及相应的输出结果。

(二)数据类型和系统设计

当需求分析结束,明确问题要求后,开始为编写程序设计合适的数据结构和算法。本步骤分概要设计和详细设计两步实现。

概要设计指的是,对问题描述中涉及的操作对象定义相应的抽象数据类型,并设计合适的算法;以及定义程序各个功能模块和模块之间的关系。在这个过程中,要根据问题的功能需求综合考虑,设计时空复杂度最优的抽象数据结构和算法(注意:实现提示和给出的部分代码中以及给出了建议)。抽象数据类型的实现尽可能做到数据封装,基本操作的规格说明尽可能明确具体,算法思想和过程明确有效,程序结构清晰、合理、简单和易于调试。作为概要设计的结果,应写出每个抽象数据类型的定义(包括数据结构的描述和每个基本操作的规格说明),主要模块的算法思想,并画出模块之间的调用关系图。

详细设计则定义相应的物理存储结构(抽象数据类型的物理实现)并写出各基本操作的伪码算法,以及主要模块算法的具体步骤。详细设计的结果是对数据结构和基本操作的规格说明做出进一步的求精,写出数据存储结构的类型定义,算法书写规范(采用文字性的步骤描述或者算法流程图的形式都行)。在求精的过程中,应尽量避免陷入语言细节,不必过早描述辅助数据结构和局部变量。

(三)编码实现和静态检查

在实验过程中,题目中会给出程序的部分源代码,根据试验第二步的设计结果以及源代码的提示,编码实现程序的其余部分。

编码是把详细设计的结果进一步求精为程序设计语言程序。对于编程很熟练的读者,如果基于详细设计的伪码算法就能直接在键盘上输入程序的话,则可以不必用笔在纸上写出编码,而将这一步的工作放在上机准备之后进行,即在上机调试之前直接用键盘输入。

写出编码的程序后,在上机(编译和调试)之前,认真的静态检查是必不可少的。多数初学者在编好程序后处于以下两种状态之一:一种是对自己的“精心作品”的正确性确信不疑;另一种是认为纠查错误是编译器的工作。这两种态度是极为有害的。事实上,非训练有素的程序设计者编写的程序长度超过50行时,极少不含有除语法错误以外的错误。上机动态调试决不能代替静态检查,否则调试效率是极低的。

静态检查主要有两种方法,一是用一组测试数据手工执行程序(通常应先分模块检查);二是通过阅读或给别人讲解自己的程序而深入全面地理解程序逻辑,在这个过程中再加入一些注解和断言。如果程序中逻辑概念清楚,后者将比前者有效。

(四)上机准备和上机调试

上机准备包括一下几个方面:

(1)熟悉机器的操作系统和语言集成环境的用户手册,尤其是最常用的命令操作,以便顺利进行上机的基本活动。

(2)上机调试程序时要带一本高级语言教材或手册。

(3)掌握调试工具,考虑调试方案,设计测试数据并手工得出正确结果。“磨刀不误砍柴工”。计算机各专业的学生应该能够熟练运用高级语言的程序调试器

DEBUG调试程序。

上机调试程序时要带一本高级语言教材或手册。调试最好分模块进行,自底向上,即先调试底层函数。必要时可以另写一个调用驱动程序。这种表面上的工作实际上可以大大降低调试所面临的复杂性,提高调试工作效率。

在调试过程中可以不断借助DEBUG的各种功能,提高调试效率。调试中遇到的各种异常现象往往是预料不到的,此时不应“冥思苦想”,而应动手确定疑点,通过修改程序来证实它或绕过它。调试正确后,认真整理源程序及其注释,印出带有完整注释的且格式良好的源程序清单和结果。

(五)总结和整理试验报告

按照试验报告的格式完成整个试验报告。同时总结和思考,回味设计的过程,体会调试的过程,总结编程中的收获,记录试验过程的体会,交流程序设计各个步骤的心得。“学而不思则罔,思而不学则殆。”在程序设计中,只有做到勤思考、善总结,才能不断进步。

试验报告规范

试验报告的开头应给出题目、班级、姓名、学号和完成日期,并包括以下七个内容:1.需求分析

以无歧义的陈述说明程序设计的任务,强调的是程序要做什么?明确规定:

(1)输入的形式和输入值的范围;

(2)输出的形式;

(3)程序所能达到的功能;

(4)测试数据:包括正确的输入及其输出结果和含有错误的输入及其输出结果。

2.概要设计

说明本程序中用到的所有抽象数据类型的定义、算法的基本思想、主程序的流程以及各程序模块之间的层次(调用)关系。

3.详细设计

(1)实现概要设计中定义的所有数据类型(物理数据结构),对每个操作只需要写出伪码算法;

(2)算法的具体步骤;

(3)算法的时空分析和改进设想;

(4)画出函数的调用关系图。

(5)输入和输出的格式。

4.调试分析

调试过程中遇到的问题,以及如何解决的;

5.测试结果

根据实验提供的测试数据,列出你所编写的程序的测试结果。

6.用户使用说明(可选)

说明如何使用编写的程序,详细列出每一步的操作步骤。

7.实验心得(可选)

对实验设计与实现过程的回顾和分析,以及经验和体会。

8.附录(可选)

带注释的源程序。如果是提交源程序电子版,只需列出程序文件名的清单。

试验报告样例1最大公因数

背景

因数分解,求最大公因数和公倍数等问题都是数学中古老而又重要德问题,这些问题在代数学、密码学、计算复杂性理论和量子计算机等领域中有重要意义。

问题描述

两个整数的最大公因数是同时整除二者的最大整数。试设计一个计算两个整数的最大公因数的程序。

基本要求

(1)用户输入两个正整数,其取值范围为(0,216),

(2)要求采用欧几里德算法,计算最大公因数。

测试数据

输入

759 1035

输出

69

实现提示

(1)注意题目给出的正整数的取值范围,定义变量时,选择合适的数据类型。

(2)欧几里德算法计算最大公因数,编写成一个独立的函数,并注意该算法对两个数据的大小关系有要求,在设计函数的输入参数以及函数处理代码时要注意处理。

选作内容

(1)设计一个求取n个正整数的最大公因数的函数。

(2)如果用户输入的正整数的取值范围为(0, 232)、(0, 264),请设计求取两个大的正整数的最大公因数的函数。

源程序及填空部分

#include “stdio.h”

typedef long elemtype;

//欧几里德算法计算最大公因数函数

elemtype gcd (elemtype M, elemtype N)

{

//填空

}

main ()

{

elemtype a, b, g;

//输入

printf(“\n本程序可以求取两个正整数的最大公因数\n”);

printf(“\n请输入第一个正整数(注意输入的数要小于2100000000):”);

scanf(“%ld”, &a);

printf(“\n请输入第二个正整数(注意输入的数要小于2100000000):”);

scanf(“%ld”, &b);

g=gcd(a, b);

//输出

printf(“\n两者的最大公因数是:%ld”, g); }

一、需求分析

1.本程序要求采用欧几里德算法,计算并输出用户输入的两个正整数的最大公因数。

2.两个正整数由用户通过键盘输入,其取值范围为(0,216)。不对非法输入做处理,即假设输入都是合法的。

3.在Dos界面输出最大公因数。

4.测试数据

输入

759 1035

输出

69

二、概要设计

抽象数据类型

为实现上述程序的功能,应以整数存储用户的输入,以及计算出的结果。

算法的基本思想

根据题目要求,采用欧几里德算法计算两个正整数的最大公因数。该算法的基本思想是辗转相除法。

设两数为a、b(b<a),求它们最大公约数(a、b)的步骤如下:

1. a ÷ b,令r为所得余数(0≤r<b)

若r = 0,算法结束;b 即为答案。

2. 互换:置a←b,b←r,并返回第一步。

程序的流程

程序由三个模块组成:

(1)输入模块:完成两个正整数的输入,存入变量a和b中。

(2)计算模块:设计一个最大公因数函数,elemtype gcd (elemtype M, elemtype N),两个整数作为函数参数,计算结果通过函数名返回。

(3)输出模块:屏幕上显示计算的最大公因数。

三、详细设计

物理数据类型

题目要求输入的正整数的取值范围在(0,216)之间,为了能够存储,采用C语言中的长整型定义变量。

typedef long elemtype

算法的具体步骤

欧几里德算法计算两个正整数的最大公因数的算法流程图如下

算法的时空分析

算法的运行时间依赖与确定余数序列有多长。可以证明,在两次迭代后,余数最多是原始值的一半。则迭代次数是2log N=O(log N)。

输入和输出的格式

输入

本程序可以求取两个正整数的最大公因数//提示

请输入第一个正整数(注意输入的数要小于2100000000)://提示

等待输入

请输入第二个正整数(注意输入的数要小于2100000000)://提示

等待输入

输出

//提示

两者的最大公因数是://输出结果的位置四、调试分析

略。

五、测试结果

输入50 15 输出 5

输入1989 1590 输出 3

六、用户使用说明(可选)

1、本程序的运行环境为DOS操作系统,执行文件为gcd.exe

2、运行程序时

提示输入两个整数

本程序可以求取两个正整数的最大公因数

请输入第一个正整数(注意输入的数要小于2100000000):

请输入第二个正整数(注意输入的数要小于2100000000):

输出

两者的最大公因数是:

七、实验心得(可选)

略。

七、附录(可选)

Gcd.c 主程序

试验报告样例2 进制转换

背景

机制转换是计算机实现计算的基本问题。

问题描述

十进制数N和其他d进制数的转换是计算机实现计算的基本问题。请编制一个满足下列要求的进制转换程序。

基本要求

(1)用户输入一个非负的十进制整数,其取值范围为(0,216),

(2)打印输出与其等值的八进制数。

测试数据

输入

1000

输出

1750

实现提示

(1)利用求模取余法,N=(N div d)× d +N mod d公式实现。

(2)由于上述计算过程是从低位到高位顺序产生八进制数的各个数位,而打印输出正好相反,利用堆栈的后进先出的特性正好实现。

选作内容

(1)设计一个能处理小数的进制转换程序。

(2)设计一个能处理负数的进制转换程序。

源程序及填空部分

#include

#include /*包含动态内存分配函数的头文件*/

typedef int ElemType;

typedef struct NodeType {

ElemType data;

struct NodeType *next;

}Node;

typedef struct {

Node * top;

int len;

}LinkStack;

void InitStack(LinkStack *S)//构造一个空栈S。

{

S->top=NULL;

S->len=0;

}

int StackEmpty(LinkStack *S)//若栈S为空栈,则返回TRUE,否则返回FALSE

{

if (S->len == 0)

return 1;

else

return 0;//返回1 表示TRUE ,否则返回0表示FALSE }

int Push(LinkStack *S, ElemType e) //新元素e入栈

{

//填空

}

int Pop(LinkStack *S, ElemType *e) //栈顶元素出栈,并以e返回其值{

//填空

}

void conversion(LinkStack *S, int N) //进制转换,保存(入栈)在S中{

//填空

}

void display(LinkStack *S) //输出,把S中元素出栈,并显示

{

//填空

}

main()

{

struct LinkStack * LS;

int N;

int d;

LS=(LinkStack *)malloc(sizeof(LinkStack)); //关键的初始化

scanf("%d", &N);

InitStack(LS);

conversion(LS, N);

display(LS);

}

一、需求分析

1.本程序要求对用户输入一个非负的十进制整数,打印输出与其等值的八进制数。2.十进制整数由用户通过键盘输入,其取值范围为(0,28)。不对非法输入做处理,即假设输入都是合法的。

3.在Dos界面输出其等值的八进制数。

4.测试数据

输入

1348

输出

2504

二、概要设计

抽象数据类型

为实现上述程序的功能,应以整数存储用户的输入。

为了实现求模取余法,利用堆栈保存计算的结果。堆栈定义如下:

ADT stack

数据对象:整数

基本操作:

InitStack(&S)//构造一个空栈S。

StackEmpty(S)//若栈S为空栈,则返回TRUE,否则返回FALSE

Push(S,&e)//新元素e入栈

Pop(&S,&e)//栈顶元素出栈,并以e返回其值

算法的基本思想

根据题目要求,用求模取余法,N=(N div d)×d +N mod d公式实现。

由于上述计算过程是从低位到高位顺序产生八进制数的各个数位,而打印输出正好相反,利用堆栈的后进先出的特性正好实现。

程序的流程

程序由三个模块组成:

(1)输入模块:完成正整数的输入,存入变量N中。

(2)转换模块:实现求模取余法,余数依次入堆栈中。

(3)输出模块:从堆栈中取数,并显示在屏幕上。

三、详细设计

物理数据类型

题目要求输入的正整数的取值范围在(0,28)之间,为了能够存储,变量N采用C 语言中的int定义变量。

因为堆栈需存储的元素个数和十进制数N的大小直接相关,其长度变化很大,所以堆栈采用单链表来实现其物理数据结构。堆栈的每个元素只需存储0-8的字符,所以栈中元素类型定义为字符型。

typedef int ElemType

typedef struct NodeType {

ElemType data;

struct NodeType *next;

}Node;

typedef struct {

Node * top;

int len;

}LinkStack;

V oid InitStack(LinkStack *S)//构造一个空栈S。

{

S->top = NULL;

S->len=0;

}

int StackEmpty(LinkStack *S)//若栈S为空栈,则返回TRUE,否则返回FALSE {

若S->len= = 0 //返回1 表示TRUE ,否则返回0表示FALSE

}

int Push(LinkStack *S,ElemType e)//新元素e入栈

{

//分配新空间,建立一个新结点

L =(Node *) malloc (sizeof(Node));

若L ==NULL 返回0表示FALSE;入栈失败

L->data = e; L->next = S->top; //插入

S->top = L; S->len++;

返回1 表示TRUE,入栈成功

}

int Pop(LinkStack &S,ElemType *e)//栈顶元素出栈,并以e返回其值

{

若栈空,返回0表示FALSE;出栈失败

*e = S->top->data; L = S->top;

S->top = S->top->next;free(L);

S->len--;

返回1 表示TRUE,出栈成功

}

算法的具体步骤

求模取余法流程图如下:函数名conversion(*S, N)

输出的算法(函数Display (*S)):栈顶元素出栈,转换为字符的Ascii码,然后用字符格式输出。

算法的时空分析

算法的执行,主要是每次N除8,以及入栈,出栈显示,由于采用链表实现,入栈和出栈的时间复杂度都是O(1),那么进制转换的时间复杂度,主要由N的大小决定,具体来说是要除8几次,即8 k >= N。由此可知上述设计的时间复杂度是O(log8N)。

函数的调用关系图

主程序

输入和输出的格式

输入

本程序可以把输入的十进制数转换为八进制的数//提示

请输入十进制的正整数(注意输入的数要小于2100000000)://提示

等待输入

输出

//提示

八进制数数是://输出结果的位置

四、调试分析

略。

五、测试结果

略。

六、用户使用说明(可选)

1、本程序的运行环境为DOS操作系统,执行文件为conversion.exe

2、运行程序时

提示输入

本程序可以把输入的十进制数转换为八进制的数

请输入十进制的正整数(注意输入的数要小于2100000000):输出

八进制数数是:

七、实验心得(可选)

略。

七、附录(可选)

conversion.c 主程序

stack.h 堆栈实现(数据结构)

DEV C++ 调试方法简介

一、DEV C++下的调试的几个基本步骤。

1. 把“生成调试信息”设置为Yes。方法如下:

Tools(工具)--> Compiler Options(编译器选项)--> Settings(设置)

2. 编译程序。

程序“编译”编译后会出来这个对话框。

点击“关闭”,关闭该按钮。

3. 设置断点(Break point)

把光标移动到您想暂停执行的那一行,按ctrl + F5,或者直接用鼠标点击下图红线标明的区域。(如下图)

4. 开始调试(Debug)

按F8 开始调试,或者点击“调试”选项(Debug )后就弹出下拉菜单(如下图)。如果您没有把“生成调试信息”设置为Yes,Dev-C++ 会提示说您的工程中没有调试信息。点击Yes,Dev-C++ 会自动把“生成调试信息”设置为Yes,并且重新编译您的工程。程序运行到断点处会暂停;

按F7 执行当前行,并跳到下一行;

ctrl + F7 跳到下一断点,shift + F4 跳到光标所在行,并在该行设置断点。

注意一点。比如。设置的“断点”是printf语句处。那执行只执行到scanf语句后就不会显示答案了。如下图。

大家看到那蓝条,这是做什么的呢,这是因为设置的“断点”是printf语句后,但又显示不出答案。如果想得到答案。可以按左下角的。“下一步”如下图。

5. 查看变量的值

开始调试后,在图示区域按右键(如果您使用的是左手习惯,则是左键),选择“添加监测(Add Watch)”;或者直接按F4。在弹出窗口中输入您想查看的变量名,然后按确定(OK),就可以看到该变量的值:

用鼠标选择源文件中的变量名,然后按F4 也可以查看变量的值,该变量会出现在左边的监测列表中:

如果在环境选项(Environment Options)中选择了“通过鼠标监测变量(Watch variable under mouse)”,用鼠标指向您想要查看的变量一段时间,该变量也会被添加到监测列表中。

重要提示:

1) 当您想查看指针指向的变量的值的时候,按F4,然后输入星号及指针的名字(如*pointer)。如果没加*,看到的将会是一个地址,也就是指针的值。

2) 有时,调试器(Debugger)可能不知道某个指针的类型,从而不能显示该指针指向的变量的值。此时,我们需要手动输入该指针的类型。按F4 后,以*(type *)pointer 形式输入。例如,*(int *)pointer。

6. 最后点击“停止执行”就退出调试了。如下图。

二、调式例子

下面这个程序,编译能正常通过,但是运行时计算结果无法显示,通过调式可以找出存在死循环。

#include

#include

int main(int argc, char *argv[])

{

int i=1, sum=0;

while(i<=100)

sum+=i;

i++;

printf("1到100的和是%d\n",sum);

system("PAUSE");

return 0;

}

上面这个程序是用来计算从1到100之间所有整数之和。该程序在Dev C++可以正常编译通过,如下图。

但是执行时,程序不显示结果。因此,通过调式来找出程序中存在的逻辑问题。

第一步:设置断点。

第二步:设置查看,在调式过程中通过查看变量的值来判断程序中存在的问题。

第三步:按F8调式,程序运行之断点处停止,在断点处开始是红色的,当运行至断点处时变成蓝色。同时可以看到变量的值sum=0和i=1,这是它们的初始值。

第四步:按F7,单步调式,按逻辑,i应等于2,sum应等于1。但我们发现结果是sum=1,而i=1;

第五步:经过多次单步调式,发现i的值不变,sum的值每次多1,同时发现,i++这一行在循环的过程中没有被执行到。因此,可以分析出本程序是一个死循环,故不会输出结果。

第六步:改进程序,得到正确答案。

数据结构课程实验指导书

数据结构实验指导书 一、实验目的 《数据结构》是计算机学科一门重要的专业基础课程,也是计算机学科的一门核心课程。本课程较为系统地论述了软件设计中常用的数据结构以及相应的存储结构与实现算法,并做了相应的性能分析和比较,课程内容丰富,理论系统。本课程的学习将为后续课程的学习以及软件设计水平的提高打下良好的基础。 由于以下原因,使得掌握这门课程具有较大的难度: 1)理论艰深,方法灵活,给学习带来困难; 2)内容丰富,涉及的知识较多,学习有一定的难度; 3)侧重于知识的实际应用,要求学生有较好的思维以及较强的分析和解决问题的能力,因而加大了学习的难度; 根据《数据结构》课程本身的特性,通过实验实践内容的训练,突出构造性思维训练的特征,目的是提高学生分析问题,组织数据及设计大型软件的能力。 课程上机实验的目的,不仅仅是验证教材和讲课的内容,检查自己所编的程序是否正确,课程安排的上机实验的目的可以概括为如下几个方面: (1)加深对课堂讲授内容的理解 实验是对学生的一种全面综合训练。是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。通常,实验题中的问题比平时的习题复杂得多,也更接近实际。实验着眼于原理与应用的结合点,使学生学会如何把书上学到的知识用于解决实际问题,培养软件工作所需要的动手能力;另一方面,能使书上的知识变" 活" ,起到深化理解和灵活掌握教学内容的目的。 不少学生在解答习题尤其是算法设计时,觉得无从下手。实验中的内容和教科书的内容是密切相关的,解决题目要求所需的各种技术大多可从教科书中找到,只不过其出

现的形式呈多样化,因此需要仔细体会,在反复实践的过程中才能掌握。 (2) 培养学生软件设计的综合能力 平时的练习较偏重于如何编写功能单一的" 小" 算法,而实验题是软件设计的综合训练,包括问题分析、总体结构设计、用户界面设计、程序设计基本技能和技巧,多人合作,以至一整套软件工作规范的训练和科学作风的培养。 通过实验使学生不仅能够深化理解教学内容,进一步提高灵活运用数据结构、算法和程序设计技术的能力,而且可以在需求分析、总体结构设计、算法设计、程序设计、上机操作及程序调试等基本技能方面受到综合训练。实验着眼于原理与应用的结合点,使学生学会如何把书本上和课堂上学到的知识用于解决实际问题,从而培养计算机软件工作所需要的动手能力。 (3) 熟悉程序开发环境,学习上机调试程序一个程序从编辑,编译,连接到运行,都要在一定的外部操作环境下才能进行。所谓" 环境" 就是所用的计算机系统硬件,软件条件,只有学会使用这些环境,才能进行 程序开发工作。通过上机实验,熟练地掌握程序的开发环境,为以后真正编写计算机程序解决实际问题打下基础。同时,在今后遇到其它开发环境时就会触类旁通,很快掌握新系统的使用。 完成程序的编写,决不意味着万事大吉。你认为万无一失的程序,实际上机运行时可能不断出现麻烦。如编译程序检测出一大堆语法错误。有时程序本身不存在语法错误,也能够顺利运行,但是运行结果显然是错误的。开发环境所提供的编译系统无法发现这种程序逻辑错误,只能靠自己的上机经验分析判断错误所在。程序的调试是一个技巧性很强的工作,尽快掌握程序调试方法是非常重要的。分析问题,选择算法,编好程序,只能说完成一半工作,另一半工作就是调试程序,运行程序并得到正确结果。 二、实验要求 常用的软件开发方法,是将软件开发过程划分为分析、设计、实现和维护四个阶段。虽然数据结构课程中的实验题目的远不如从实际问题中的复杂程度度高,但为了培养一个软件工作者所应具备的科学工作的方法和作风,也应遵循以下五个步骤来完成实验题目: 1) 问题分析和任务定义 在进行设计之前,首先应该充分地分析和理解问题,明确问题要求做什么?限制条件是什么。本步骤强调的是做什么?而不是怎么做。对问题的描述应避开算法和所涉及的数据类型,而是对所需完成的任务作出明确的回答。例如:输入数据的类型、值的范围以及输入的

(完整版)数据结构实验报告全集

数据结构实验报告全集 实验一线性表基本操作和简单程序 1 .实验目的 (1 )掌握使用Visual C++ 6.0 上机调试程序的基本方法; (2 )掌握线性表的基本操作:初始化、插入、删除、取数据元素等运算在顺序存储结构和链表存储结构上的程序设计方法。 2 .实验要求 (1 )认真阅读和掌握和本实验相关的教材内容。 (2 )认真阅读和掌握本章相关内容的程序。 (3 )上机运行程序。 (4 )保存和打印出程序的运行结果,并结合程序进行分析。 (5 )按照你对线性表的操作需要,重新改写主程序并运行,打印出文件清单和运行结果 实验代码: 1)头文件模块 #include iostream.h>// 头文件 #include// 库头文件------ 动态分配内存空间 typedef int elemtype;// 定义数据域的类型 typedef struct linknode// 定义结点类型 { elemtype data;// 定义数据域 struct linknode *next;// 定义结点指针 }nodetype; 2)创建单链表

nodetype *create()// 建立单链表,由用户输入各结点data 域之值, // 以0 表示输入结束 { elemtype d;// 定义数据元素d nodetype *h=NULL,*s,*t;// 定义结点指针 int i=1; cout<<" 建立一个单链表"<> d; if(d==0) break;// 以0 表示输入结束 if(i==1)// 建立第一个结点 { h=(nodetype*)malloc(sizeof(nodetype));// 表示指针h h->data=d;h->next=NULL;t=h;//h 是头指针 } else// 建立其余结点 { s=(nodetype*) malloc(sizeof(nodetype)); s->data=d;s->next=NULL;t->next=s; t=s;//t 始终指向生成的单链表的最后一个节点

大学物理学实验指导书_4

大学物理学实验指导书 大学物理实验 力学部分 实验一长度与体积的测量 实验类型:验证 实验类别:专业主干课 实验学时:2 所属课程:大学物理

所涉及的课程和知识点:误差原理有效数字 一、实验目的 通过本实验的学习,使学生掌握测长度的几种常用仪器的使用,并会正确读数。练习作好记录和误差计算。 二、实验要求 (1)分别用游标卡尺、螺旋测微计测金属圆筒、小钢球的内外径及高度,并求体积。(2)练习多次等精度测量误差的处理方法。 三、实验仪器设备及材料 游标卡尺,螺旋测微计,金属圆柱体,小钢球,铜丝 四、实验方案 1、用游标卡尺测量并计算所给样品的体积。 2、分别用千分尺和读数显微镜测量所给金属丝的直径。 数据处理 注意:有效数字的读取和运用,自拟表格,按有关规则进行数据处理。 描述实验过程(步骤)以及安全注意事项等,设计性实验由学生自行设计实验方案。 五、考核形式 实际操作过程实验报告 六、实验报告 实验原理,实验步骤,实验数据处理,误差分析和处理。 对实验中的特殊现象、实验操作的成败、实验的关键点等内容进行整理、解释、分析总结,回答思考题,提出实验结论或提出自己的看法等。 七、思考题 1、游标卡尺测量长度时如何读数 游标本身有没有估读数 2、千分尺以毫米为单位可估读到哪一位初读数的正负如何判断 待测长度如何确定 实验二单摆 实验类型:设计 实验类别:专业主干课 实验学时:2 所属课程:大学物理 所涉及的课程和知识点:力学单摆周期公式 一、实验目的 通过本实验的学习,使学生掌握使用停表和米尺,测准单摆的周期和摆长。利用单摆周期公式求当地的重力加速度

二、实验要求 (1)测摆长为1m时的周期求g值。 (2)改变摆长,每次减少10cm,测相应周期T,作T—L图,验证单摆周期公式。 三、实验仪器设备及材料 单摆、米尺、游标卡尺、停表。 四、实验方案 利用试验台上所给的设备及材料,自己制作一个单摆,然后设计实验步骤测出单摆的周期,再根据单摆的周期公式计算当地的重力加速速。 改变摆长,讨论对实验结果的影响并分析误差产生的原因 五、考核形式 实际操作过程实验报告 六、实验报告 实验原理,实验步骤,实验数据处理,误差分析和处理。 对实验中的特殊现象、实验操作的成败、实验的关键点等内容进行整理、解释、分析总结,回答思考题,提出实验结论或提出自己的看法等。 七、思考题 1、为什么测量周期不宜直接测量摆球往返一次摆动的周期试从误差分析来说明。 2、在室内天棚上挂一单摆,摆长很长,你设法用简单的工具测出摆长不许直接测量摆长。 实验三牛顿第二定律的验证 实验类型:验证 实验类别:专业主干课 实验学时:2 所属课程:大学物理 所涉及的课程和知识点:力学牛顿第二定律摩擦 一、实验目的 通过本实验的学习,使学生掌握气垫导轨的使用,使学生通过在气垫导轨上验证牛顿第二定律,更深刻的理解牛顿第二定律的物理本质。 二、实验要求 验证当m一定时,a∝F,当F一定时,a∝1/m。 三、实验仪器设备及材料 气垫导轨,数字毫秒计,光电门,气源 四、实验方案 1、调整气垫导轨水平。 在导轨的端部小心安装好滑轮,使其转动自如,细心调整好导轨的水平。

数据结构实验指导书(2016.03.11)

《数据结构》实验指导书 郑州轻工业学院 2016.02.20

目录 前言 (3) 实验01 顺序表的基本操作 (7) 实验02 单链表的基本操作 (19) 实验03 栈的基本操作 (32) 实验04 队列的基本操作 (35) 实验05 二叉树的基本操作 (38) 实验06 哈夫曼编码 (40) 实验07 图的两种存储和遍历 (42) 实验08 最小生成树、拓扑排序和最短路径 (46) 实验09 二叉排序树的基本操作 (48) 实验10 哈希表的生成 (50) 实验11 常用的内部排序算法 (52) 附:实验报告模板 .......... 错误!未定义书签。

前言 《数据结构》是计算机相关专业的一门核心基础课程,是编译原理、操作系统、数据库系统及其它系统程序和大型应用程序开发的重要基础,也是很多高校考研专业课之一。它主要介绍线性结构、树型结构、图状结构三种逻辑结构的特点和在计算机内的存储方法,并在此基础上介绍一些典型算法及其时、空效率分析。这门课程的主要任务是研究数据的逻辑关系以及这种逻辑关系在计算机中的表示、存储和运算,培养学生能够设计有效表达和简化算法的数据结构,从而提高其程序设计能力。通过学习,要求学生能够掌握各种数据结构的特点、存储表示和典型算法的设计思想及程序实现,能够根据实际问题选取合适的数据表达和存储方案,设计出简洁、高效、实用的算法,为后续课程的学习及软件开发打下良好的基础。另外本课程的学习过程也是进行复杂程序设计的训练过程,通过算法设计和上机实践的训练,能够培养学生的数据抽象能力和程序设计能力。学习这门课程,习题和实验是两个关键环节。学生理解算法,上机实验是最佳的途径之一。因此,实验环节的好坏是学生能否学好《数据结构》的关键。为了更好地配合学生实验,特编写实验指导书。 一、实验目的 本课程实验主要是为了原理和应用的结合,通过实验一方面使学生更好的理解数据结构的概念

数据结构实验报告代码

线性表 代码一 #include "stdio.h" #include "malloc.h" #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 typedef struct { int * elem; int length; int listsize; }SqList; int InitList_Sq(SqList *L) { L->elem = (int*)malloc(LIST_INIT_SIZE*sizeof(int)); if (!L->elem) return ERROR; L->length = 0; L->listsize = LIST_INIT_SIZE; return OK; } int ListInsert_Sq(SqList *L, int i,int e) { int *p,*newbase,*q; if (i < 1 || i > L->length+1) return ERROR; if (L->length >= L->listsize) { newbase = (int *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof (int)); if (!newbase) return ERROR; L->elem = newbase; L->listsize += LISTINCREMENT; } q = &(L->elem[i-1]); //插入后元素后移for(p=&(L->elem[L->length-1]);p>=q;p--) *(p+1)=*p; *q=e; L->length++; return OK; } int ListDelete_Sq(SqList *L, int i, int *e) {

大学物理实验课后答案

实验一霍尔效应及其应用 【预习思考题】 1.列出计算霍尔系数、载流子浓度n、电导率σ及迁移率μ的计算公式,并注明单位。 霍尔系数,载流子浓度,电导率,迁移率。 2.如已知霍尔样品的工作电流及磁感应强度B的方向,如何判断样品的导电类型? 以根据右手螺旋定则,从工作电流旋到磁感应强度B确定的方向为正向,若测得的霍尔电压为正,则样品为P型,反之则为N型。 3.本实验为什么要用3个换向开关? 为了在测量时消除一些霍尔效应的副效应的影响,需要在测量时改变工作电 流及磁感应强度B的方向,因此就需要2个换向开关;除了测量霍尔电压,还要测量A、C间的电位差,这是两个不同的测量位置,又需要1个换向开关。总之,一共需要3个换向开关。 【分析讨论题】 1.若磁感应强度B和霍尔器件平面不完全正交,按式(5.2-5)测出的霍尔系数比实际值大还是小?要准确测定值应怎样进行? 若磁感应强度B和霍尔器件平面不完全正交,则测出的霍尔系数比实际值偏小。要想准确测定,就需要保证磁感应强度B和霍尔器件平面完全正交,或者设法测量出磁感应强度B和霍尔器件平面的夹角。 2.若已知霍尔器件的性能参数,采用霍尔效应法测量一个未知磁场时,测量误差有哪些来源? 误差来源有:测量工作电流的电流表的测量误差,测量霍尔器件厚度d的长度测量仪器的测量误差,测量霍尔电压的电压表的测量误差,磁场方向与霍尔器件平面的夹角影响等。 实验二声速的测量 【预习思考题】 1. 如何调节和判断测量系统是否处于共振状态?为什么要在系统处于共振的条件下进行声速测定? 答:缓慢调节声速测试仪信号源面板上的“信号频率”旋钮,使交流毫伏表指针指示达到最大(或晶体管电压表的示值达到最大),此时系统处于共振状态,显示共振发生的信号指示灯亮,信号源面板上频率显示窗口显示共振频率。在进行声速测定时需要测定驻波波节的位置,当发射换能器S1处于共振状态时,发射的超声波能量最大。若在这样一个最佳状态移动S1至每一个波节处,媒质压缩形变最大,则产生的声压最大,接收换能器S2接收到的声压为最大,转变成电信号,晶体管电压表会显示出最大值。由数显表头读出每一个电压最大值时的位置,即对应的波节位置。因此在系统处于共振的条件下进行声速测定,可以容易和准确地测定波节的位置,提高测量的准确度。 2. 压电陶瓷超声换能器是怎样实现机械信号和电信号之间的相互转换的? 答:压电陶瓷超声换能器的重要组成部分是压电陶瓷环。压电陶瓷环由多晶结构的压电材料制成。这种材料在受到机械应力,发生机械形变时,会发生极化,同时在极化方向产生电场,这种特性称为压电效应。反之,如果在压电材料上加交

数据结构实验指导书

《数据结构》实验指导书 实验一顺序表 实验目的: 熟悉顺序表的逻辑特性、存储表示方法和顺序表的基本操作。 实验要求: 了解并熟悉顺序表的逻辑特性、存储表示方法和顺序表的基本操作的实现和应用。 实验内容: 1、编写程序实现在线性表中找出最大的和最小的数据元素,并符合下列要求: (1)设数据元素为整数,实现线性表的顺序存储表示。 (2)从键盘输入10个数据元素,利用顺序表的基本操作建立该表。 (3)利用顺序表的基本操作,找出表中最大的和最小的数据元素(用于比较的字段为整数)。 2、编写一个程序实现在学生成绩中找出最高分和最低分,并符合下列要求: (1)数据元素为学生成绩(含姓名、成绩等字段)。 (2)要求尽可能少地修改第一题的程序来得到此题的新程序,即要符合第一题的所有要求。(这里用于比较的字段为分数) 实验二链表 实验目的: 熟悉链表的逻辑特性、存储表示方法的特点和链式表的基本操作。 实验要求: 了解并熟悉链式表的逻辑特性、存储表示方法和链式表的基本操作的实现和应用。

实验内容: 1、编写一个程序建立存放学生成绩的有序链表并实现相关操作,要求如下: (1)设学生成绩表中的数据元素由学生姓名和学生成绩字段组成,实现这样的线性表的链式存储表示。 (2)键盘输入10个(或若干个,特殊数据来标记输入数据的结束)数据元素,利用链表的基本操作建立学生成绩单链表,要求该表为有序表 并带有头结点。(用于比较的字段为分数)。 (3)输入关键字值x,打印出表中所有关键字值<=x的结点。(用于比较的关键字字段为分数)。 (4)输入关键字值x,删除表中所有关键字值<=x的结点。(用于比较的关键字字段为分数)。 (5)输入关键字值x,并插入到表中,使所在的链表仍为有序表。(用于比较的字段为分数)。 实验三栈的应用 实验目的: 熟悉栈的逻辑特性、存储表示方法和栈的基本操作。 实验要求: 了解并熟悉栈的逻辑特性、顺序和链式存储表示方法和栈的基本操作的实现和应用。 实验内容: (1)判断一个表达式中的括号(仅有一种括号,小、中或大括号) 是否配对。编写并实现它的算法。 (2)用不同的存储方法,求解上面的问题。 (3)* 若表达式中既有小括号,又有大括号(或中括号),且允许 互相嵌套,但不能交叉,写出判断这样的表达式是否合法的算 法。如 2+3*(4-{5+2}*3)为合法;2+3*(4-{5+2 * 3} 、 2+3*(4-[5+2 * 3)为不合法。

数据结构实验一的源代码

#include #include typedef struct Node { int key;//密码 int num;//编号 struct Node *next;//指向下一个节点 } Node, *Link; void InitList(Link &L) //创建一个空的链表{ L = (Node *)malloc(sizeof(Node)); if (!L) exit(1); L->key = 0; L->num = 0; L->next = L; } void Creatlinklist(int n, Link &L) //初始化链表{ Link p, q; q = L; for (int i = 1; i <= n; i++) { p = (Node *)malloc(sizeof(Node)); if (!p) exit(1); scanf("%d", &p->key); p->num = i; L->next = p; L = p; } L->next = q->next; free(q); } Link Locate_m(Link &p, int m)//找到第m个 { Link q; for (int j = 1; jnext; q = p->next; m = q->key;

return q; } void Delete_m(Link &L, Link p, Link q)//删除第m个{ p->next = q->next; free(q); } void main() { Link L, p, q; int n, m; L = NULL; InitList(L);//构造出一个只有头结点的空链表 printf("请输入初始密码人数每个人的密码:\n"); scanf("%d", &m);//初始密码为m scanf("%d", &n);// Creatlinklist(n, L);//构建 p = L; for (int i = 1; i <= n; i++) { q = Locate_m(p, m);//找到第m个 printf("%d", q->num); Delete_m(L, p, q);//删除第m个 } system("pause"); }

大学物理实验4-指导书

1.1 静电场 实验内容 图示静电场的基本性质: 同心球壳电场及电势分布图。 实验设置 有两个均匀带电的金属同心球壳配置如图。内球壳(厚度不计)半径为R 1=5.0 cm ,带电荷 q 1 = 0.6?10-8 C ;外球壳半径R 2 = 7.5 cm ,外半径R 3 = 9.0 cm ,所带总电荷q 2 = - 2.0?10-8 C 。 实验任务 画出该同心球壳的电场及电势分布。 实验步骤及方法 基本原理:根据高斯定理推导出电场及电势的 分布公式;利用数据分析软件,如Microsoft Excel 绘制电场及电势的分布图。 在如图所示的带电体中,因内球壳带电q 1,由于静电感应,外球壳的内表面上将均匀地分布电荷-q 1;根据电荷平衡原理,外球壳的外表面上所带电荷除了原来的q2外,还因为内表面感应了-q 1而生成+q 1,所以外球壳的外表面上将均匀分布电荷q 1+q 2。 在推导电场和电势分布公式时,须根据r 的变化范围分别讨论r < R 1、R 1 < r < R 2、R 2 < r < R 3、r > R 3几种情况。 场强分布: 当r < R 1时, 001=?=???E dS E S 当R 1 < r < R 2时, ?= ???0 1 εq dS E S 2 1 0241 r q E επ= 当R 2 < r < R 3时, 00 3=?=???E dS E S 当r > R 3时, 1

2 210 40 2 141r q q E q q dS E S += ? += ??? επε 电势分布: 根据电势的定义,可以求得电势的分布。 当r < R 1时, 3 2 10210110143211414141 3 3 2 21 1R q q R q R q U dr E dr E dr E dr E dr E U R R R R R R r r ++ -=?+?+?+?=?=?????∞ ∞ επεπεπ 当R 1 < r < R 2时, 3 2 102101014321414141 3 3 2 2R q q R q r q U dr E dr E dr E dr E U R R R R r r ++ -=?+?+?=?=????∞ ∞ επεπεπ 当R 2 < r < R 3时, 3 2 10143141 3 3 R q q U dr E dr E dr E U R R r r += ?+?=?=???∞ ∞ επ 当r > R 3时, r q q U dr E dr E U r r 2 1014141 += ?=?=??∞ ∞επ 至此,可以用MS Excel 来绘制电场及电势分布图。方法如下: 打开Excel 后会有一个默认的表格出现(如下图) 在A1、A2、A3单元格内分别输入“R1=”、“R2=”、“R3=”;在B1、B2、B3单元格内分别输入R1、R2、R3的数值。

2017数据结构实验指导书

《数据结构》实验指导书 贵州大学 电子信息学院 通信工程

目录 实验一顺序表的操作 (3) 实验二链表操作 (8) 实验三集合、稀疏矩阵和广义表 (19) 实验四栈和队列 (42) 实验五二叉树操作、图形或网状结构 (55) 实验六查找、排序 (88) 贵州大学实验报告 (109)

实验一顺序表的操作 实验学时:2学时 实验类型:验证 实验要求:必修 一、实验目的和要求 1、熟练掌握线性表的基本操作在顺序存储和链式存储上的实现。 2、以线性表的各种操作(建立、插入、删除等)的实现为重点。 3、掌握线性表的动态分配顺序存储结构的定义和基本操作的实现。 二、实验内容及步骤要求 1、定义顺序表类型,输入一组整型数据,建立顺序表。 typedef int ElemType; //定义顺序表 struct List{ ElemType *list; int Size; int MaxSize; }; 2、实现该线性表的删除。 3、实现该线性表的插入。 4、实现线性表中数据的显示。 5、实现线性表数据的定位和查找。 6、编写一个主函数,调试上述算法。 7、完成实验报告。 三、实验原理、方法和手段 1、根据实验内容编程,上机调试、得出正确的运行程序。 2、编译运行程序,观察运行情况和输出结果。 四、实验条件 运行Visual c++的微机一台 五、实验结果与分析 对程序进行调试,并将运行结果进行截图、对所得到的的结果分析。 六、实验总结 记录实验感受、上机过程中遇到的困难及解决办法、遗留的问题、意见和建议等,并将其写入实验报告中。

【附录----源程序】 #include #include using namespace std; typedef int ElemType; struct List { ElemType *list; int Size; int MaxSize; }; //初始化线性表 bool InitList(List &L) { L.MaxSize=20; L.list=new ElemType[L.MaxSize]; for(int i=0;i<20&&L.list==NULL;i++) { L.list=new ElemType[L.MaxSize]; } if(L.list==NULL) { cout<<"无法分配内存空间,退出程序"<L.Size+1||pos<1) { cout<<"位置无效"<

数据结构实验程序

顺序表的基本操作 #include using namespace std; typedef int datatype; #define maxsize 1024 #define NULL -1 typedef struct { datatype *data; int last; }sequenlist; void SETNULL(sequenlist &L) { L.data=new datatype[maxsize]; for(int i=0;i>https://www.doczj.com/doc/9512132009.html,st; cout<<"请输入"<>L.data[i]; } int LENGTH(sequenlist &L) { int i=0; while(L.data[i]!=NULL) i++; return i; } datatype GET(sequenlist &L,int i) { if(i<1||i>https://www.doczj.com/doc/9512132009.html,st) { cout<<"error1"<

int j=0; while(L.data[j]!=x) j++; if(j==https://www.doczj.com/doc/9512132009.html,st) { cout<<"所查找值不存在!"<=maxsize-1) { cout<<"overflow"; return NULL; } else if(i<1||(i>https://www.doczj.com/doc/9512132009.html,st)) { cout<<"error2"<=i-1;j--) L.data[j+1]=L.data[j]; L.data[i-1]=x; https://www.doczj.com/doc/9512132009.html,st++; } return 1; } int DELETE(sequenlist &L,int i) { int j; if((i<1)||(i>https://www.doczj.com/doc/9512132009.html,st+1)) { cout<<"error3"<

磁性物理实验指导书

磁性物理实验 讲义 磁性物理课程组编写 电子科技大学微电子与固体电子学院 二O一二年九月

目录 一、起始磁导率温度特性测量和居里温度测试计算分析 (1) 二、电阻率测试及磁损耗响应特性分析 (3) 三、磁致伸缩系数测量与分析 (6) 四、磁化强度测量与分析 (9) 五、磁滞回线和饱和磁感应强度测量 (11) 六、磁畴结构分析表征 (12)

一、起始磁导率温度特性测量和居里温度测试计算分析 (一) 、实验目的: 了解磁性材料的起始磁导率的测量原理,学会测量材料的起始磁导率,并能够从自发磁化起源机制来分析温度和离子占位对材料起始磁导率和磁化强度的影响。 (二)、实验原理及方法: 一个被磁化的环型试样,当径向宽度比较大时,磁通将集中在内半径附近的区域分布较密,而在外半径附近处,磁通密度较小,因此,实际磁路的有效截面积要小于环型试样的实际截面。为了使环型试样的磁路计算更符合实际情况,引入有效尺寸参数。有效尺寸参数为:有效平均半径r e ,有效磁路长度l e ,有效横截面积A e ,有效体积V e 。矩形截面的环型试样及其有效尺寸参数计算公式如下。 ???? ??-=21 1 211ln r r r r r e (1) ???? ??-=21 12 11ln 2r r r r l e π (2) ???? ??-=2112 211ln r r r r h A e (3) e e e l A V = (4) 其中:r 1为环型磁芯的内半径,r 2为环型磁芯的外半径,h 为磁芯高度。 利用磁芯的有效尺寸可以提高测量的精确性,尤其是试样尺寸不能满足均匀磁化条件时,应用等效尺寸参数计算磁性参数更合乎实际结果。材料的起始磁导率(i μ)可通过对环型磁心施加线圈后测量其电感量(L )而计算得到。计算公式如式(5)所示。 2 0i e e A N L l μμ= (5)

《数据结构》实验指导书

《数据结构》实验指导书 实验类别:课内实验实验课程名称:数据结构 实验室名称:软件工程实验室实验课程编号:N02070601 总学时:64 学分: 4 适用专业:计算机科学与技术、网络工程、物联网工程、数字媒体专业 先修课程:计算机科学导论、离散数学 实验在教学培养计划中地位、作用: 数据结构是计算机软件相关专业的主干课程,也是计算机软硬件专业的重要基础课程。数据结构课程实验的目的是通过实验掌握数据结构的基本理论和算法,并运用它们来解决实际问题。数据结构课程实验是提高学生动手能力的重要的实践教学环节,对于培养学生的基本素质以及掌握程序设计的基本技能并养成良好的程序设计习惯方面发挥重要的作用。 实验一线性表的应用(2学时) 1、实验目的 通过本实验,掌握线性表链式存储结构的基本原理和基本运算以及在实际问题中的应用。 2、实验内容 建立某班学生的通讯录,要求用链表存储。 具体功能包括: (1)可以实现插入一个同学的通讯录记录; (2)能够删除某位同学的通讯录; (3)对通讯录打印输出。 3、实验要求 (1)定义通讯录内容的结构体; (2)建立存储通讯录的链表结构并初始化; (3)建立主函数: 1)建立录入函数(返回主界面) 2)建立插入函数(返回主界面) 3)建立删除函数(返回主界面) 4)建立输出和打印函数(返回主界面) I)通过循环对所有成员记录输出 II)输出指定姓名的某个同学的通讯录记录 5)退出 实验二树的应用(2学时) 1、实验目的 通过本实验掌握二叉排序树的建立和排序算法,了解二叉排序树在实际中的应用并熟练运用二叉排序树解决实际问题。 2、实验内容 建立一个由多种化妆品品牌价格组成的二叉排序树,并按照价格从低到高的顺序 打印输出。 3、实验要求 (1)创建化妆品信息的结构体; (2)定义二叉排序树链表的结点结构; (3)依次输入各类化妆品品牌的价格并按二叉排序树的要求创建一个二叉排序树链表;(4)对二叉排序树进行中序遍历输出,打印按价格从低到高顺序排列的化妆品品牌信息。 实验三图的应用(2学时)

数据结构实验报告

《用哈夫曼编码实现文件压缩》 实验报告 课程名称数据结构 实验学期2015至2016学年第一学期 学生所在系部计算机学院 年级2014专业班级物联B142班 学生姓名杨文铎学号201407054201 任课教师白磊 实验成绩

用哈夫曼编码实现文件压缩 1、了解文件的概念。 2、掌握线性表的插入、删除的算法。 3、掌握Huffman树的概念及构造方法。 4、掌握二叉树的存储结构及遍历算法。 5、利用Haffman树及Haffman编码,掌握实现文件压缩的一般原理。 微型计算机、Windows系列操作系统、Visual C++6.0软件 根据ascii码文件中各ascii字符出现的频率情况创建Haffman树,再将各字符对应的哈夫曼编码写入文件中,实现文件压缩。 本次实验采用将字符用长度尽可能短的二进制数位表示的方法,即对于文件中出现的字符,无须全部都用S为的ascii码进行存储,根据他们在文件中出现的频率不同,我们利用Haffman算法使每个字符能以最短的二进制数字符进行存储,已达到节省存储空间,压缩文件的目的,解决了压缩需要采用的算法,程序的思路已然清晰: 1、统计需压缩文件中的每个字符出现的频率 2、将每个字符的出现频率作为叶子节点构建Haffman树,然后将树中结点引向 其左孩子的分支标“0”,引向其右孩子的分支标“1”;每个字符的编码 即为从根到每个叶子的路径上得到的0、1序列,这样便完成了Haffman 编码,将每个字符用最短的二进制字符表示。 3、打开需压缩文件,再将需压缩文件中的每个ascii码对应的haffman编码按bit 单位输出。 4、文件压缩结束。 (1)构造haffman树的方法一haffman算法 构造haffman树步骤: I.根据给定的n个权值{w1,w2,w3…….wn},构造n棵只有根结点的二叉 树,令起权值为wj。 II.在森林中选取两棵根结点权值最小的树作左右子树,构造一棵新的二叉树,置新二叉树根结点权值为其左右子树根结点权值之和。 III.在森林中删除这两棵树,同时将得到的二叉树加入森林中。 IV.重复上述两步,知道只含一棵树为止,这棵树即哈夫曼树。 对于haffman的创建算法,有以下几点说明: a)这里的Haffman树采用的是基于数组的带左右儿子结点及父结点下标作为

大学物理 学习指南

学习指南 1、物理实验课的教学目的 大学物理实验教学目的与中学阶段的物理实验教学有着本质的不同。“大学物理实验”是一门独立的基础课程,它不是“大学物理学”的分支或组成部分。虽然物理实验必须以物理学的理论为基础,运用物理学的原理进行实验或研究,但是“大学物理实验”又独立于“大学物理学”,它不是以验证物理定律、加强理解物理规律为主要目的的,分散的力、热、电、磁、光实验的堆切,而是以物理实验的基本技术或基本物理量的测量方法为主线,再贯穿以现代误差理论,现代物理实验仪器设备、器件的原理、使用方法,构建成一个完整的,但又不断发展的课程体系框架。其教学目的如下: (1)掌握基本物理量的各种测量方法,学会分析测量的误差,学会基本的实验数据处理方法,能正确的表达测量结果,并对测量结果进行正确的评价(测量不确定度)。 (2)掌握物理实验的基本知识、基本技能,常用实验仪器设备、器件的原理及使用方法,并能正确运用物理学理论指导实验。 (3)培养、提高基本实验能力,并进一步培养创新能力。基本实验能力是指能顺利完成某种实验活动(科研实验或教学实验)的各种相关能力的总和,主要包括: 观察思维能力──在实验中通过观察分析实验现象,并得出正确规

律的能力。 使用仪器能力──能借助教材或仪器使用说明书掌握仪器的调整和使用方法的能力。 故障分析能力──对实验中出现的异常现象能正确找出原因并排除故障的能力。 数据处理能力──能正确记录、处理实验数据,正确分析实验误差的能力。 报告写作能力──能撰写规范、合格的实验报告的能力。 初步实验设计能力──能根据课题要求,确定实验方案和条件,合理选择实验仪器的能力。 (4)培养从事科学实验的素质。包括理论联系实际和实事求是的科学作风;严肃认真的工作态度;吃苦耐劳、勇于创新的精神;遵守操作规程,爱护公共财物的优良品德;以及团结协作、共同探索的精神。 2、大学物理实验课的基本程序 实验课与理论课不同,它的特点是同学们在教师的指导下自己动手,独立完成实验任务,通常每个实验的学习都要经历三个阶段。 (1)实验的准备 实验前必须认真阅读讲义,做好必要的预习,才能按质按量按时完成实验。同时,预习也是培养阅读能力的学习环节。预习时要写预习报告,预习报告包括以下内容:

数据结构实验指导书(C版)

数据结构实验指导书(C语言版) 2017年9月

目录 1、顺序表的实现 (1) 2、链栈的实现 (3) 3、前序遍历二叉树 (5) 4、图的深度优先遍历算法 (7) 5、散列查找 (9)

1、顺序表的实现 1. 实验目的 ⑴掌握线性表的顺序存储结构; ⑵验证顺序表及其基本操作的实现; ⑶理解算法与程序的关系,能够将顺序表算法转换为对应的程序。 2. 实验内容 ⑴建立含有若干个元素的顺序表; ⑵对已建立的顺序表实现插入、删除、查找等基本操作。 3. 实现提示 定义顺序表的数据类型——顺序表结构体SeqList,在SeqList基础上实现题目要求的插入、删除、查找等基本操作,为便于查看操作结果,设计一个输出函数依次输出顺序表的元素。简单起见,本实验假定线性表的数据元素为int型,要求学生: (1)将实验程序调试通过后,用模板类改写; (2)加入求线性表的长度等基本操作; (3)重新给定测试数据,验证抛出异常机制。 4. 实验程序 在编程环境下新建一个工程“顺序表验证实验”,并新建相应文件,文件包括顺序表结构体SeqList的定义,范例程序如下: #define MaxSize 100 /*假设顺序表最多存放100个元素*/ typedef int DataType; /*定义线性表的数据类型,假设为int型*/ typedef struct { DataType data[MaxSize]; /*存放数据元素的数组*/ int length; /*线性表的长度*/ } SeqList; 文件包括建立顺序表、遍历顺序表、按值查找、插入操作、删除操作成员函数的定义,范例程序如下: int CreatList(SeqList *L, DataType a[ ], int n) { if (n > MaxSize) {printf("顺序表的空间不够,无法建立顺序表\n"); return 0;} for (int i = 0; i < n; i++) L->data[i] = a[i]; L->length = n; return 1; }

数据结构上机实验线性表单链表源代码

#include template class LinearList { public: virtual bool IsEmpty()const=0; virtual int Length()const=0; virtual bool Find(int i,T& x)const=0; virtual int Search(T x)const=0; virtual bool Insert(int i,T x)=0; virtual bool Update(int i,T x)=0; virtual bool Delete(int i)=0; virtual void Output(ostream& out)const=0; protected: int n; }; #include "linearlist" template class SeqList:public LinearLisr { public: SeqList(int mSize); ~SeqList(){delete [] elements;} bool IsEmpty()const; bool Find(int i,T& x)const; int Length()const; int Search(T x)const; bool Insert(int i,T x); bool Update(int i,T x); bool Delete(int i); void Output(ostream& out)const; private: int maxLength; T *elements; }; template SeqList::SeqList(int mSize) { maxLength=mSize;

数据结构实验报告

数据结构实验报告 第 6 次实验 学号:20141060106 :叶佳伟 一、实验目的 1、复习图的逻辑结构、存储结构及基本操作; 2、掌握邻接矩阵、邻接表及图的创建、遍历; 3、了解图的应用。 二、实验容 1、(必做题)假设图中数据元素类型是字符型,请采用邻接矩阵或邻接表实现图的以下基本操作: ( 1)构造图(包括有向图、有向网、无向图、无向网); ( 2)根据深度优先遍历图; ( 3)根据广度优先遍历图。 三、算法描述 (采用自然语言描述) 四、详细设计 (画出程序流程图) 五、程序代码 (给出必要注释) #include #include #include #include #include #define INFINITY 255678 /*赋初值用*/ #define MAX_VERTEX_NUM 20 /* 最大顶点个数*/ enum {DG, DN, UDG, UDN}; . .

typedef struct ArcCell { int adj;/*顶点关系类型,对无权图,用1(是)或0(否)表示相邻否;对带权图,则为权值*/ char *info;/*弧相关信息指针*/ }AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedef struct { char vexs[MAX_VERTEX_NUM][5];/*顶点向量*/ AdjMatrix arcs; /*邻接矩阵*/ int vexnum, arcnum;/*图的当前顶点数和弧数*/ int kind; }MGraph; void CreateDG(MGraph *G); void CreateDN(MGraph *G); void CreateUDG(MGraph *G); void CreateUDN(MGraph *G); int LocateVex(MGraph *G, char v[]); void print(MGraph *G); int main(void) { MGraph *G; G = (MGraph *)malloc(sizeof(MGraph)); printf("请选者0-有向图,1-有向网,2-无向图,3-无向网: "); scanf("%d", &G->kind); switch(G->kind) { case DG : CreateDG(G); print(G); break; case DN : CreateDN(G); print(G); break; case UDG : CreateUDG(G); . .

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