数据结构课程实验报告

数据结构课程实验报告
数据结构课程实验报告

课程实验报告课程名称:数据结构

专业班级:信息安全1302班

学号:

姓名:

指导教师:

报告日期:2015年5月14日

计算机科学与技术学院

目录

1 课程实验概述 (1)

2 实验一基于顺序结构的线性表实现 (2)

2.1 问题描述 (2)

2.2 系统设计 (2)

2.3 系统实现 (2)

2.4 效率分析 (11)

3 实验二基于链式结构的线性表实现 (12)

3.1 问题描述 (12)

3.2 系统设计 (12)

3.3 系统实现 (12)

3.4 效率分析 (20)

4 实验三基于二叉链表的二叉树实现 (22)

4.1 问题描述 (22)

4.2 系统设计 (22)

4.3 系统实现 (22)

4.4 效率分析 (32)

5 实验总结与评价 (35)

6 附录程序代码 (37)

1 课程实验概述

本次课程实验总共分为三个实验:基于顺序结构的线性表实现;基于链式结构的线性表实现;基于二叉链表的二叉树实现。三个实验均以C语言实现并要求提供能够实现功能的演示系统,物理结构与元素类型自定。

通过课程实验加深对线性表以及二叉树数据结构和算法的理解。在编程过程中通过亲自实践形成良好的代码风格,在调试程序过程中能够发现很多C语言基础问题以及固有的错误观点,进一步提升编程能力。实验报告中也包括很多有益的东西,比如:基于数据结构的系统划分方法;递归算法设计方法和技巧;对于有天然递归属性的问题如何构造非递归算法。对实验报告格式的严格要求也会为今后撰写论文打下坚实的基础。另外更重要的一点是,从开始设计、编程、到撰写报告的整个过程,是对分析问题、解决问题的综合能力的锻炼。虽然本次的三个实验均是比较经典的数据结构,要实现其功能不是非常难,但是依然需要细心、耐心,尤其是在调试程序和撰写报告工程中。与此同时,和同学的交流以及老师的交流也是非常重要的一个环节。在交流过程中能够发现自身的问题、开阔思路。当然,交流并不意味着抄袭。独立完成整个课程实验才能有所收获。

总之,本次实验旨在巩固课堂所学的知识,提高编程能力,提高分析解决问题的能力。

2 实验一基于顺序结构的线性表实现

2.1 问题描述

线性表有两类存储结构:顺序结构和链式结构。实验一将通过顺序存储结构实现线性表的基本操作。

要求:

1)提供一个实现功能的演示系统

2)具体物理结构和数据元素类型自行选定

2.2 系统设计

1)背景

运行环境:Windows

程序语言:C语言

开发环境:CodeBlocks

2)功能描述

基于顺序存储结构,实现线性表的基本的,常见的运算:表的构造、表的销毁、表的重置、空表的查看、获取表的长度、获取数据元素、获取前驱、后继、查找数据元素、插入数据元素、删除数据元素及输出线性表。

2.3 系统实现

1)顺序表的动态分配存储结构以及部分全程量

#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量

#define LISTINCREMENT 10 //线性表存储空间的分配增量

typedef struct{

int *elem; //存储空间基址

int length; //表长

int listsize; //分配的存储容量

}SqList;

2)相关函数说明以及基本算法思想

status IntiaList(SqList * L);

status DestroyList(SqList * L);

status ClearList(SqList *L);

status ListEmpty(SqList L);

int ListLength(SqList L);

status GetElem(SqList L,int i,ElemType * e);

status LocateElem(SqList L,ElemType e);

status PriorElem(SqList L,ElemType cur,ElemType * pre_e);

status NextElem(SqList L,ElemType cur,ElemType * next_e);

status ListInsert(SqList * L,int i,ElemType e);

status ListDelete(SqList * L,int i,ElemType * e);

status ListTrabverse(SqList L);

int InitList(SqList *L)

//功能描述:构造一个空线性表L。

//算法思想:申请存储数据元素空间,然后表长置0,存储容量置为LIST_INIT_SIZE

status Destroylist(SqList *L)

//功能描述:销毁已存在的线性表L。

//算法思想:存储空间基址置空,长度置0,当前存储容量置0

status ClearList(SqList *L)

//功能描述:重置已存在的线性表L。

//算法思想:长度置0

status ListEmpty(SqList L)

//功能描述:若线性表L为空表,返回1,否则返回0。

//算法思想:如果线性表的当前长度为0,则返回1,否则返回0

int ListLength(SqList L)

//功能描述:返回线性表L中数据元素的个数。

//算法思想:若线性表存在,则返回L.length

status GetElem(SqList L,int i,int *e)

//功能描述:用e返回线性表L中第i个元素的值。

//算法思想:将L中第i个数据元素放到e中并返回

status LocateElem(SqList L,int e)

//功能描述:返回线性表L中数据元素e的位序;若线性表中不存在数据元素e,

则返回值为0。

//算法思想:用一个for循环比较e和线性表中的数据元素,如果存在元素与e 相等,返回元素位置,否则返回0

status PriorElem(SqList L,ElemType cur,ElemType * pre_e)

//功能描述:若pre_e是L的数据元素,且不是第一个,则用pre_e返回他的前驱,否则操作失败,pre_e无定义。

//算法思想:定位元素,然后返回他前面的那个元素

status NextElem(SqList L,ElemType cur,ElemType * next_e);

//功能描述:功能描述:若next_e是L的数据元素,且不是第一个,则用next_e 返回他的前驱,否则操作失败,next_e无定义。

//算法思想:定位元素,然后返回他后面的那个元素

status ListInsert(SqList *L,int i,int e)

//功能描述:在元素ai之前插入新元素e。

//算法思想:在线性表中找到第i个数据元素,将它以及后面的元素后移,再在第i个元素赋值为e数据元素,并且表长加1

status ListDelete(SqList *L,int i,int *e)

//功能描述:删除线性表L中第i个数据元素。

//算法思想:在线性表中找到第i个数据元素,将其放到e中,并将后面的数据元素前移,表长减1

status ListTrabverse(SqList L)

//功能描述:输出线性表L。

//算法思想:若线性表存在,则用for循环输出线性表

3)部分算法流程图

插入函数流程图

删除函数流程图

4)部分运行截图

图1 界面

1<=i<=length+1

从第i+1个元素都左移

一位,表长减1 返 回

*e =L->elem[i-1];

开 始

N

Y

图2 列出线性表内容

图3 插入元素

图4 查找元素在线性表中的位置

图5 线性表的长度

图6 前驱

图7 后继

图8 得到某位置的元素

图9 置空

2.4 效率分析

status ListInsert(SqList *L,int i,int e)

算法时间主要花费在移动元素上,与元素个数和插入位置有关,假设在任一位置上插入是等概率的,则平均需要移动一半的元素,表长为n,算法的时间复杂度为O(n)。

status ListDelete(SqList *L,int i,int *e)

算法时间主要花费在移动元素上,与元素个数和删除位置有关,假设在任一位置上删除是等概率的,则平均需要移动一半的元素,表长为n,算法的时间复杂度为O(n)。

status LocateElem(SqList L,int e)

算法时间主要花费在寻找符合条件的元素的那个for循环上,花费的时间与元素的位置有关,表长为n,算法时间复杂度为O(n)。

status ListTrabverse(SqList L)

算法时间几乎全部花在遍历上,与表长有关,算法的时间复杂度为O(n)。status PriorElem(SqList L,ElemType cur,ElemType * pre_e) 算法时间主要花费在定位上,花费的时间与元素的位置有关,表长为n,算法时间复杂度为O(n)。

status NextElem(SqList L,ElemType cur,ElemType * next_e) 算法时间主要花费在定位上,花费的时间与元素的位置有关,表长为n,算法时间复杂度为O(n)。

其余函数的算法时间复杂度均为O(c)

3 实验二基于链式结构的线性表实现

3.1 问题描述

线性表有两类存储结构:顺序结构和链式结构。实验二将通过链式结构实现线性表的基本操作。

要求:

3)提供一个实现功能的演示系统

4)具体物理结构和数据元素类型自行选定

3.2 系统设计

1)背景

运行环境:Windows

程序语言:C语言

开发环境:CodeBlocks

2)功能描述

基于链式结构,实现线性表的基本的,常见的运算:表的构造、表的销毁、表的重置、空表的查看、获取表的长度、获取数据元素、获取前驱、后继、查找数据元素、插入数据元素、删除数据元素及输出线性表。

3.3 系统实现

1)链式表的动态分配存储结构以及部分全程量

#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量

#define LISTINCREMENT 10 //线性表存储空间的分配增量

typedef struct Node{ //链式表(链式结构)的定义

ElemType elem;

struct Node *next;

}List,*SqList;

2)相关函数说明以及基本算法思想

status IntiaList(SqList * L);

status DestroyList(SqList * L);

status ClearList(SqList *L);

status ListEmpty(SqList L);

int ListLength(SqList L);

status GetElem(SqList L,int i,ElemType * e);

status LocateElem(SqList L,ElemType e);

status PriorElem(SqList L,ElemType cur,ElemType * pre_e);

status NextElem(SqList L,ElemType cur,ElemType * next_e);

status ListInsert(SqList * L,int i,ElemType e);

status ListDelete(SqList * L,int i,ElemType e);

status ListTrabverse(SqList L);

status InitList(SqList *L)

//功能描述:构造一个空线性表L。

//算法思想:申请存储数据元素空间,然后表长置0,存储容量置为LIST_INIT_SIZE

status Destroylist(LinkList *L)

//功能描述:毁已存在的线性表L。

//算法思想:用循环释放每一个结点,然后将*L置空

status ClearList(SqList *L)

//功能描述:重置已存在的线性表L。

//算法思想:长度置0

Status ListEmpty(LinkList L)

//功能描述:若线性表L为空表,返回1,否则返回0。

//算法思想:如果线性表L的指针域为空,则返回1,否则返回0

int ListLength(LinkList L)

//功能描述:若线性表存在,则返回线性表L中数据元素的个数。

//算法思想:构建线性表以及其他操作中,均将线性表表头结点的数据域作为线性表长度计数操作,所以将直接返回表头结点数据域的元素。

status GetElem(LinkList *L,int i)

//功能描述:返回线性表L中第i个元素的值。

//算法思想:用while循环到第i个元素,若存在则把第i个元素放到e中,并返回,否则返回0

status LocateElem(LinkList L,int e)

//功能描述:返回线性表L中数据元素e的位序;若线性表中不存在数据元素e,则返回值为0.

//算法思想:用一个for循环和比较e与线性表中的数据元素,如果有相等的元素,则该函数返回元素位置,否则返回0

status PriorElem(SqList L,ElemType cur,ElemType * pre_e)

//功能描述:若pre_e是L的数据元素,且不是第一个,则用pre_e返回他的前驱,否则操作失败,pre_e无定义。

//算法思想:定位元素,然后返回他前面的那个元素

status NextElem(SqList L,ElemType cur,ElemType * next_e);

//功能描述:功能描述:若next_e是L的数据元素,且不是第一个,则用next_e 返回他的前驱,否则操作失败,next_e无定义。

//算法思想:定位元素,然后返回他后面的那个元素

status ListInsert(LinkList *L,int i,int e)

//功能描述:在元素ai之前插入新元素e。

//算法思想:用while循环在线性表中找到第i个数据元素,若找到,则创建一个新的存储空间s,其数据域为额e,然后将s的指针域指向p的指针域指向的结点,再将p的指针域指向s,返回1,否则,返回0

status ListDelete(LinkList *L,int i,int *e)

//功能描述:删除线性表L中第i个数据元素。

//算法思想:用while循环在线性表中找到第i-1个数据元素,若找到,将这个结点p的下一个结点q的数据域放到e中,并将p的指针域指向q的指针域指向的的结点,并返回被删除的数据,否则,返回0

status ListTrabverse(LinkList L)

//功能描述:输出线性表L。

//算法思想:用for循环,输出线性表中的所有元素

3)部分算法流程图

插入结点流程图

删除结点流程图4)部分运行截图

图1 查看线性表

图2 查找元素

图3 插入元素

数据结构实验报告

2013-2014-1学期 《数据结构》实验报告 专业:信息管理与信息系统 班级: 姓名: 学号: 完成日期:2013.12.01

实验名称:二叉树的创建与遍历 一、实验目的 建立一棵二叉树,并对其进行遍历(先序、中序、后序),打印输出遍历结果。 二、实验要求 1、建立一棵用二叉链表方式存储的二叉树,并对其进行遍历(先序、中序和后序),打印输出遍历结果。 2、从键盘接受扩展先序序列,以二叉链表作为存储结构,建立二叉树,并将遍历结果打印输出。 三、实验步骤(包括所选择的二叉树的创建算法和常用三种遍 历算法的说明、完整的程序代码及必要的注释。) 1、用二叉链表创建二叉树: ①输入根结点值;②若左子树不空,则输入左子树,否则输入一个结束符‘#’;③若右子树不空,则输入右子树,否则输入一个结束符‘#’。 2、遍历该二叉树 (1) 先序遍历(DLR) 若二叉树为空,则结束返回。否则:①访问根结点;②先序遍历左子树;③先序遍历右子树。 (2) 中序遍历(LDR) 若二叉树为空,则结束返回。否则:①中序遍历左子树;②访问根结点;③中序遍历右子树。 (3) 后序遍历(LRD) 若二叉树为空,则结束返回。否则:①后序遍历

左子树;②后序遍历右子树;③访问根结点。 3、程序代码: #include #include #include #define NULL 0 typedef struct BiTNode { char data; struct BiTNode *Lchild,*Rchild; }BiTNode,*BiTree; BiTree Create(BiTree T) { char ch; ch=getchar(); if(ch=='#') T=NULL; else { if(!(T=(BiTNode *)malloc(sizeof(BiTNode)))) printf("Error!"); T->data=ch; T->Lchild=Create(T->Lchild); T->Rchild=Create(T->Rchild); } return T; } void Preorder(BiTree T) { if(T) { printf("%c",T->data); Preorder(T->Lchild); Preorder(T->Rchild); } } void zhongxu(BiTree T) { if(T) { zhongxu(T->Lchild); printf("%c",T->data);

数据结构实验报告格式

《数据结构课程实验》大纲 一、《数据结构课程实验》的地位与作用 “数据结构”是计算机专业一门重要的专业技术基础课程,是计算机专业的一门核心的关键性课程。本课程较系统地介绍了软件设计中常用的数据结构以及相应的存储结构和实现算法,介绍了常用的多种查找和排序技术,并做了性能分析和比较,内容非常丰富。本课程的学习将为后续课程的学习以及软件设计水平的提高打下良好的基础。 由于以下原因,使得掌握这门课程具有较大的难度: (1)内容丰富,学习量大,给学习带来困难; (2)贯穿全书的动态链表存储结构和递归技术是学习中的重点也是难点; (3)所用到的技术多,而在此之前的各门课程中所介绍的专业性知识又不多,因而加大了学习难度; (4)隐含在各部分的技术和方法丰富,也是学习的重点和难点。 根据《数据结构课程》课程本身的技术特性,设置《数据结构课程实验》实践环节十分重要。通过实验实践内容的训练,突出构造性思维训练的特征, 目的是提高学生组织数据及编写大型程序的能力。实验学时为18。 二、《数据结构课程实验》的目的和要求 不少学生在解答习题尤其是算法设计题时,觉得无从下手,做起来特别费劲。实验中的内容和教科书的内容是密切相关的,解决题目要求所需的各种技术大多可从教科书中找到,只不过其出现的形式呈多样化,因此需要仔细体会,在反复实践的过程中才能掌握。 为了帮助学生更好地学习本课程,理解和掌握算法设计所需的技术,为整个专业学习打好基础,要求运用所学知识,上机解决一些典型问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握所用到的一些技术。数据结构中稍微复杂一些的算法设计中可能同时要用到多种技术和方法,如算法设计的构思方法,动态链表,算法的编码,递归技术,与特定问题相关的技术等,要求重点掌握线性链表、二叉树和树、图结构、数组结构相关算法的设计。在掌握基本算法的基础上,掌握分析、解决实际问题的能力。 三、《数据结构课程实验》内容 课程实验共18学时,要求完成以下六个题目: 实习一约瑟夫环问题(2学时)

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

数据结构实验报告全集 实验一线性表基本操作和简单程序 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 始终指向生成的单链表的最后一个节点

图形学实验报告

山东建筑大学测绘地理信息学院 实验报告 (2016—2017学年第一学期) 课程:计算机图形学 专业:地理信息科学 班级:地信141 学生姓名:王俊凝 学号:20140113010 指

实验一直线生成算法设计 一、实验目的 掌握基本图形元素直线的生成算法,利用编程语言C分别实现直线和圆的绘制算法。 二、实验任务 在TurboC环境下开发出绘制直线和圆的程序。 三、实验仪器设备 计算机。 四、实验方法与步骤 1 运行TurboC编程环境。 2 编写Bresenham直线绘制算法的函数并进行测试。 3 编写中点圆绘制算法的函数并进行测试。 4 增加函数参数,实现直线颜色的设置。 提示: 1. 编程时可分别针对直线和圆的绘制算法,设计相应的函数,例如void drawline(…)和void drawcircle(…),直线的两个端点可作为drawline的参数,圆的圆心和半径可作为drawcircle的参数。 2. 使用C语言编写一个结构体类型用来表示一个点,结构体由两个成员构成,x和y。这样,在向函数传入参数时,可使用两个点类型来传参。定义方法为:

typedef struct{ int x; int y; }pt2; 此处,pt2就是定义的一个新的结构体数据类型,之后就可用pt2来定义其他变量,具体用法见程序模板。 3. 在main函数中,分别调用以上函数,并传入不同的参数,实现对直线的绘制。 4. 线的颜色也可作为参数传入,参数可采用TurboC语言中的预设颜色值,具体参见TurboC图形函数。 五、注意事项 1 代码要求正确运行,直线和圆的位置应当为参数,实现可配置。 2 程序提交.c源文件,函数前和关键代码中增加注释。 程序模板 #include #include typedef struct{ int x; int y; }pt2; /*declare your drawing functions.*/ void drawline(pt2 startpt,pt2 endpt,int color); void drawcircle(pt2 centerpt,int radius,int color); void circlePlotPoints(pt2 centerpt,int x,int y,int color); int main() { int color,radius;

数据结构实验报告

数据结构实验报告 一.题目要求 1)编程实现二叉排序树,包括生成、插入,删除; 2)对二叉排序树进行先根、中根、和后根非递归遍历; 3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。 4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信息(至少包括学号、姓名、成绩3项),对比查找效率,并说明在什么情况下二叉排序树效率高,为什么? 二.解决方案 对于前三个题目要求,我们用一个程序实现代码如下 #include #include #include #include "Stack.h"//栈的头文件,没有用上 typedefintElemType; //数据类型 typedefint Status; //返回值类型 //定义二叉树结构 typedefstructBiTNode{ ElemType data; //数据域 structBiTNode *lChild, *rChild;//左右子树域 }BiTNode, *BiTree; intInsertBST(BiTree&T,int key){//插入二叉树函数 if(T==NULL) { T = (BiTree)malloc(sizeof(BiTNode)); T->data=key; T->lChild=T->rChild=NULL; return 1; } else if(keydata){ InsertBST(T->lChild,key); } else if(key>T->data){ InsertBST(T->rChild,key); } else return 0; } BiTreeCreateBST(int a[],int n){//创建二叉树函数 BiTreebst=NULL; inti=0; while(i

《建筑结构试验》实验报告

《建筑结构试验》实验报告 班级: 学号: 姓名: 南昌航空大学土木工程试验中心 二○一○年四月

目录 试验一电阻应变片的粘贴及防潮技术试验二静态电阻应变仪的使用及接桥试验三电阻应变片灵敏系数的测定 试验四简支钢筋混凝土梁的破坏试验

试验一电阻应变片的粘贴及防潮技术 姓名:学号:星期第讲第组 实验日期:年月日同组者: 一、实验目的: 1.掌握电阻应变片的选用原则和方法; 2.学习常温用电阻应变片的粘贴方法及过程; 3.学会防潮层的制作; 4.认识并理解粘贴过程中涉及到的各种技术及要求对应变测试工作的影响。 二、实验仪表和器材: 1.模拟试件(小钢板); 2.常温用电阻应变片; 3.数字万用表; 4.兆欧表; 5.粘合剂:T-1型502胶,CH31双管胶(环氧树脂)或硅橡胶; 6.丙酮浸泡的棉球; 7.镊子、划针、砂纸、锉刀、刮刀、塑料薄膜、胶带纸、电烙铁、焊锡、焊锡膏等小工具; 8.接线柱、短引线 三、简述整个操作过程及注意事项: 1.分选应变片。在应变片灵敏数K相同的一批应变片中,剔除电阻丝栅有形状缺陷,片内有气泡、霉斑、锈点等缺陷的应变片,将电阻值在120±2Ω范围内的应变片选出待用。 2.试件表面处理。去除贴片位置的油污、漆层、锈迹、电镀层,用丙酮棉球将贴片处擦洗干净,至棉球洁白为止,以保证应变片能够牢固的粘贴在试件表面。 3.测点定位。应变片必须准确地粘贴在结构或试件的应变测点上,而且粘贴方向必须是要测量的应变方向。 4.应变片粘贴。注意分清应变片的正、反面,保证电阻栅的中心与十字交叉点对准。应变片贴好后,先检查有无气泡、翘曲、脱胶等现象,再用数字万用表的电阻档检查应变片有无短路、断路和阻值发生突变(因应变片粘贴不平整导致)的现象。 5.导线固定。接线柱粘帖不要离应变片太远,接线柱挂锡不可太多,导线挂锡一端的裸露线芯不能过长,以31mm为宜。引出线不要拉得太紧,以免试件受到拉力作用后,接线柱与应变片之间距离增加,使引出线先被拉断,造成断路;也不能过松,以避免两引出线互碰

数据结构实验报告模板

2009级数据结构实验报告 实验名称:约瑟夫问题 学生姓名:李凯 班级:21班 班内序号:06 学号:09210609 日期:2010年11月5日 1.实验要求 1)功能描述:有n个人围城一个圆圈,给任意一个正整数m,从第一个人开始依次报数,数到m时则第m个人出列,重复进行,直到所有人均出列为止。请输出n个人的出列顺序。 2)输入描述:从源文件中读取。 输出描述:依次从显示屏上输出出列顺序。 2. 程序分析 1)存储结构的选择 单循环链表 2)链表的ADT定义 ADT List{ 数据对象:D={a i|a i∈ElemSet,i=1,2,3,…n,n≧0} 数据关系:R={< a i-1, a i>| a i-1 ,a i∈D,i=1,2,3,4….,n} 基本操作: ListInit(&L);//构造一个空的单链表表L ListEmpty(L); //判断单链表L是否是空表,若是,则返回1,否则返回0. ListLength(L); //求单链表L的长度 GetElem(L,i);//返回链表L中第i个数据元素的值; ListSort(LinkList&List) //单链表排序 ListClear(&L); //将单链表L中的所有元素删除,使单链表变为空表 ListDestroy(&L);//将单链表销毁 }ADT List 其他函数: 主函数; 结点类; 约瑟夫函数 2.1 存储结构

[内容要求] 1、存储结构:顺序表、单链表或其他存储结构,需要画示意图,可参考书上P59 页图2-9 2.2 关键算法分析 结点类: template class CirList;//声明单链表类 template class ListNode{//结点类定义; friend class CirList;//声明链表类LinkList为友元类; Type data;//结点的数据域; ListNode*next;//结点的指针域; public: ListNode():next(NULL){}//默认构造函数; ListNode(const Type &e):data(e),next(NULL){}//构造函数 Type & GetNodeData(){return data;}//返回结点的数据值; ListNode*GetNodePtr(){return next;}//返回结点的指针域的值; void SetNodeData(Type&e){data=e;}//设置结点的数据值; void SetNodePtr(ListNode*ptr){next=ptr;} //设置结点的指针值; }; 单循环链表类: templateclass CirList { ListNode*head;//循环链表头指针 public: CirList(){head=new ListNode();head->next=head;}//构造函数,建立带头节点的空循环链表 ~CirList(){CirListClear();delete head;}//析构函数,删除循环链表 void Clear();//将线性链表置为空表 void AddElem(Type &e);//添加元素 ListNode *GetElem(int i)const;//返回单链表第i个结点的地址 void CirListClear();//将循环链表置为空表 int Length()const;//求线性链表的长度 ListNode*ListNextElem(ListNode*p=NULL);//返回循环链表p指针指向节点的直接后继,若不输入参数,则返回头指针 ListNode*CirListRemove(ListNode*p);//在循环链表中删除p指针指向节点的直接后继,且将其地址通过函数值返回 CirList&operator=(CirList&List);//重载赋

《数据结构》实验报告

《数据结构》实验报告 实验序号:4 实验项目名称:栈的操作

附源程序清单: 1. #include #define MaxSize 100 using namespace std; typedef int ElemType; typedef struct { ElemType data[MaxSize]; int top; }SqStack; void InitStack(SqStack *st) //初始化栈 { st->top=-1; } int StackEmpty(SqStack *st) //判断栈为空{ return (st->top==-1); } bool Push(SqStack *st,ElemType x) //元素进栈{ if(st->top==MaxSize-1)

{ return false; } else { st->top++; //移动栈顶位置 st->data[st->top]=x; //元素进栈 } return true; } bool Pop(SqStack *st,ElemType &e) //出栈 { if(st->top==-1) { return false; } else { e=st->data[st->top]; //元素出栈 st->top--; //移动栈顶位置} return true; } //函数名:Pushs //功能:数组入栈 //参数:st栈名,a->数组名,i->数组个数 bool Pushs(SqStack *st,ElemType *a,int i) { int n=0; for(;n数组名,i->数组个数 bool Pops(SqStack *st,ElemType *a,int i) { int n=0; for(;n

数据结构实验报告图实验

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

数据结构实验报告

《用哈夫曼编码实现文件压缩》 实验报告 课程名称数据结构 实验学期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树采用的是基于数组的带左右儿子结点及父结点下标作为

数据结构课程实验报告(15)

课程实验报告课程名称:数据结构 专业班级:信安1302 学号: 姓名: 指导教师: 报告日期:2015. 5. 12 计算机科学与技术学院

目录 1 课程实验概述............ 错误!未定义书签。 2 实验一基于顺序结构的线性表实现 2.1 问题描述 ...................................................... 错误!未定义书签。 2.2 系统设计 ...................................................... 错误!未定义书签。 2.3 系统实现 ...................................................... 错误!未定义书签。 2.4 效率分析 ...................................................... 错误!未定义书签。 3 实验二基于链式结构的线性表实现 3.1 问题描述 ...................................................... 错误!未定义书签。 3.2 系统设计 ...................................................... 错误!未定义书签。 3.3 系统实现 ...................................................... 错误!未定义书签。 3.4 效率分析 ...................................................... 错误!未定义书签。 4 实验三基于二叉链表的二叉树实现 4.1 问题描述 ...................................................... 错误!未定义书签。 4.2 系统设计 ...................................................... 错误!未定义书签。 4.3 系统实现 ...................................................... 错误!未定义书签。 4.4 效率分析 ...................................................... 错误!未定义书签。 5 实验总结与评价 ........... 错误!未定义书签。 1 课程实验概述 这门课是为了让学生了解和熟练应用C语言进行编程和对数据结构进一步深入了解的延续。

工程结构试验与检测实验报告

实验一静态应变测量原理 在电阻应测量中,如在电桥中仅接入一个电阻应变片,则实际测量值中含有由于温度变化时构件产生的应变,这是实验中所不希望的,通过适当的接线方式,可消除温度的影响,在课本中有许多不同的接线方式,主要分为两大类,一是设置专门温度补偿片,这种方式又可分为公共补偿与单片补偿两种,二是通过工作片间互相补偿,称为互相补偿或自补偿,接线要有一定的技巧。掌握电阻应变测量中的温度补偿方式及不同接线方式的测量结果的区别是很重要的。 一、实验目的 1、熟悉电阻应变仪的操作规程; 2、掌握电阻应变仪测量的基本原理; 3、学会用电阻应变片作半桥测量的方法; 4、掌握温度补偿的基本原理。 二、实验设备及仪表 1、DH3819型静态电阻应变仪; 2、等强度梁; 3、电阻应变片,导线。 三、实验内容 进行两种电阻应变测量接线方法的实验,掌握电阻应变测量的不同接线基本原理,以及消除温度影响的方法,根据实验结果分析两种接线不同测量数值理论依据。 四、试验方法 1、1/4桥接线+公共补偿:

单片补偿接线方法:将应变片R1接于应变仪1组,Eg、接线柱,温度补偿片R2接于、0接线柱,则构成外半桥,另内半桥由应变仪内部两个标准电阻构成。输入应变片灵敏度系数,导线电阻,应变片电阻。 公共补偿接线方法:断开补偿组的连线,将公共补偿接线连接于该组,将等强度梁的上侧应变片R1接于1组的Eg、接线柱,将等强度梁下侧应变片R3接、0接线柱。 2、半桥接线 按应变仪的设计原理更换公共补偿端的接线方式,然后在每个测量桥路中接入两个电阻应变片。本试验中,在一个测量桥路中按半桥方式接入等强度梁的上下测应变片。 五、实验步骤 1、接上述接桥方法分别接通桥路; 2、将电阻应变仪调平衡; 3、作预加载1公斤,检查仪表和装置; 4、正式试验,每级加载1公斤,加三级,记取读数,重复三次。 六、试验报告 1、实验方案; 2、实验过程; 3、整理出实验数据,试验数据填入应变记录表。(表格见下表) 4、比较两种接线方法,分析原因,给出结论。 5、写出试验操作方法和体会。 6、回答后面的思考题。

数据结构实验报告及心得体会

2011~2012第一学期数据结构实验报告 班级:信管一班 学号:201051018 姓名:史孟晨

实验报告题目及要求 一、实验题目 设某班级有M(6)名学生,本学期共开设N(3)门课程,要求实现并修改如下程序(算法)。 1. 输入学生的学号、姓名和 N 门课程的成绩(输入提示和输出显示使用汉字系统), 输出实验结果。(15分) 2. 计算每个学生本学期 N 门课程的总分,输出总分和N门课程成绩排在前 3 名学 生的学号、姓名和成绩。 3. 按学生总分和 N 门课程成绩关键字升序排列名次,总分相同者同名次。 二、实验要求 1.修改算法。将奇偶排序算法升序改为降序。(15分) 2.用选择排序、冒泡排序、插入排序分别替换奇偶排序算法,并将升序算法修改为降序算法;。(45分)) 3.编译、链接以上算法,按要求写出实验报告(25)。 4. 修改后算法的所有语句必须加下划线,没做修改语句保持按原样不动。 5.用A4纸打印输出实验报告。 三、实验报告说明 实验数据可自定义,每种排序算法数据要求均不重复。 (1) 实验题目:《N门课程学生成绩名次排序算法实现》; (2) 实验目的:掌握各种排序算法的基本思想、实验方法和验证算法的准确性; (3) 实验要求:对算法进行上机编译、链接、运行; (4) 实验环境(Windows XP-sp3,Visual c++); (5) 实验算法(给出四种排序算法修改后的全部清单); (6) 实验结果(四种排序算法模拟运行后的实验结果); (7) 实验体会(文字说明本实验成功或不足之处)。

三、实验源程序(算法) Score.c #include "stdio.h" #include "string.h" #define M 6 #define N 3 struct student { char name[10]; int number; int score[N+1]; /*score[N]为总分,score[0]-score[2]为学科成绩*/ }stu[M]; void changesort(struct student a[],int n,int j) {int flag=1,i; struct student temp; while(flag) { flag=0; for(i=1;ia[i+1].score[j]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; flag=1; } for(i=0;ia[i+1].score[j]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; flag=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;

数据结构实验报告(图)

附录A 实验报告 课程:数据结构(c语言)实验名称:图的建立、基本操作以及遍历系别:数字媒体技术实验日期: 12月13号 12月20号 专业班级:媒体161 组别:无 姓名:学号: 实验报告内容 验证性实验 一、预习准备: 实验目的: 1、熟练掌握图的结构特性,熟悉图的各种存储结构的特点及适用范围; 2、熟练掌握几种常见图的遍历方法及遍历算法; 实验环境:Widows操作系统、VC6.0 实验原理: 1.定义: 基本定义和术语 图(Graph)——图G是由两个集合V(G)和E(G)组成的,记为G=(V,E),其中:V(G)是顶点(V ertex)的非空有限集E(G)是边(Edge)的有限集合,边是顶点的无序对(即:无方向的,(v0,v2))或有序对(即:有方向的,)。 邻接矩阵——表示顶点间相联关系的矩阵 设G=(V,E) 是有n 1 个顶点的图,G 的邻接矩阵A 是具有以下性质的n 阶方阵特点: 无向图的邻接矩阵对称,可压缩存储;有n个顶点的无向图需存储空间为n(n+1)/2 有向图邻接矩阵不一定对称;有n个顶点的有向图需存储空间为n2 9

无向图中顶点V i的度TD(V i)是邻接矩阵A中第i行元素之和有向图中, 顶点V i的出度是A中第i行元素之和 顶点V i的入度是A中第i列元素之和 邻接表 实现:为图中每个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点Vi的边(有向图中指以Vi为尾的弧) 特点: 无向图中顶点Vi的度为第i个单链表中的结点数有向图中 顶点Vi的出度为第i个单链表中的结点个数 顶点Vi的入度为整个单链表中邻接点域值是i的结点个数 逆邻接表:有向图中对每个结点建立以Vi为头的弧的单链表。 图的遍历 从图中某个顶点出发访遍图中其余顶点,并且使图中的每个顶点仅被访问一次过程.。遍历图的过程实质上是通过边或弧对每个顶点查找其邻接点的过程,其耗费的时间取决于所采用的存储结构。图的遍历有两条路径:深度优先搜索和广度优先搜索。当用邻接矩阵作图的存储结构时,查找每个顶点的邻接点所需要时间为O(n2),n为图中顶点数;而当以邻接表作图的存储结构时,找邻接点所需时间为O(e),e 为无向图中边的数或有向图中弧的数。 实验内容和要求: 选用任一种图的存储结构,建立如下图所示的带权有向图: 要求:1、建立边的条数为零的图;

软件设计与体系结构实验报告

福建农林大学计算机与信息学院 实验报告 课程名称:软件设计与体系结构 姓名:陈宇翔 系:软件工程系 专业:软件工程 年级:2007 学号:070481024 指导教师:王李进 职称:讲师 2009年12月16日

实验项目列表

福建农林大学计算机与信息学院实验报告 学院:计算机与信息学院专业:软件工程系年级:2007 姓名:陈宇翔 学号:070481024 课程名称:软件设计与体系结构实验时间:2009-10-28 实验室田实验室312、313计算机号024 指导教师签字:成绩: 实验1:ACME软件体系结构描述语言应用 一、实验目的 1)掌握软件体系结构描述的概念 2)掌握应用ACMESTUDIO工具描述软件体系结构的基本操作 二、实验学时 2学时。 三、实验方法 由老师提供软件体系结构图形样板供学生参考,学生在样板的指导下修改图形,在老师的指导下进行软件体系结构描述。 四、实验环境 计算机及ACMESTUDIO。 五、实验内容 利用ACME语言定义软件体系结构风格,修改ACME代码,并进行风格测试。 六、实验操作步骤 一、导入Zip文档 建立的一个Acme Project,并且命名为AcmeLab2。如下图:

接着导入ZIP文档,导入完ZIP文档后显示的如下图: 二、修改风格 在AcmeLab2项目中,打开families下的TieredFam.acme.如下图: 修改组件外观 1. 在组件类型中,双击DataNodeT; 在其右边的编辑器中,将产生预览;选择Modify 按钮,将打开外观编辑器对话框。 2. 首先改变图形:找到Basic shape section,在Stock image dropdown menu中选 择Repository类型. 3. 在Color/Line Properties section修改填充颜色为深蓝色。 4. 在颜色对话框中选择深蓝色,并单击 [OK]. 5. 修改图形的边框颜色为绿色 7. 单击Label tab,在Font Settings section, 设置字体颜色为白色,单击[OK] 产生的图形如下图:

华仔数据结构实验报告

本科实验报告 课程名称:数据结构 实验项目:线性结构、树形结构、图结构、查找、排序实验地点: 专业班级:学号: 学生姓名: 指导教师: 2011年12 月24 日

实验项目:线性结构 实验目的和要求 熟练掌握线性结构的基本操作在顺序表和链式表上的实现。 二、实验内容和原理 设顺序表递增有序,编写一个程序,将x插入,使之仍然有序。 三、主要仪器设备 使用的计算机:Nopated++ 四、操作方法与实验步骤 #include #define maxlen 50 typedef int elemtype; typedef elemtype sqlist[maxlen]; int creat(sqlist A) { int i,n; printf("Please input length:\n"); scanf("%d",&n); for(i=0;i=A[n-1]) {

A[n]=x; } else { while(A[i]=i;j--) A[j+1]=A[j]; A[i]=x; } return n+1; } void main() { sqlist A; int x,n; n=creat(A); disp(A,n); printf("Please input you want to insert:\n"); scanf("%d",&x); n=Insert(A,n,x); disp(A,n); } 五、实验数据记录和处理 六、实验结果与分析 这个程序为比较基础的程序 七、讨论、心得 该程序可以帮助我加深对线性表的理解,引发我对数据结构这门课的兴趣

数据结构与算法实验报告册

. . 河南工程学院 理学院学院 实验报告 (数据结构与算法) 学期: 课程: 专业: 班级: 学号: 姓名: 指导教师:

. . 目录 实验一线性表1(顺序表及单链表的合并) (1) 实验二线性表2(循环链表实现约瑟夫环) (1) 实验三栈和队列的应用(表达式求值和杨辉三角) (1) 实验四赫夫曼编码 实验五最小生成树 (1) 实验六排序算法

. . 实验一线性表1 一、实验学时:2学时 二、实验目的 1.了解线性表的逻辑结构特性是数据元素之间存在着线性关系。在计算机中 表示这种关系的两类不同的存储结构是顺序存储结构和链式存储结构。 2.熟练掌握这两类存储结构的描述方法以及线性表的基本操作在这两种存储 结构上的实现。 三、实验内容 1. 编写程序,实现顺序表的合并。 2. 编写程序,实现单链表的合并。 四、主要仪器设备及耗材 硬件:计算机一台 软件:VC++ 6.0,MSDN2003或者以上版本 五、算法设计 1. 顺序表合并的基本思想 程序流程图: 2. 单链表合并的基本思想 程序流程图 六、程序清单

. 七、实现结果 .

. 八、实验体会或对改进实验的建议.

. . 实验二线性表2 一、实验学时:2学时 二、实验目的 1.了解双向循环链表的逻辑结构特性,理解与单链表的区别与联系。 2.熟练掌握双向循环链表的存储结构以及基本操作。 三、实验内容 编写程序,采用循环链表实现约瑟夫环。 设有编号为1,2,……,n的n(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,……,如此下去,直到所有人全部出圈为止。当任意给定n和m后,设计算法求n个人出圈的次序。 四、主要仪器设备及耗材 硬件:计算机一台 软件:VC++ 6.0,MSDN2003或者以上版本 五、算法设计 约瑟夫环实现的基本思想 程序流程图: 六、程序清单

相关文档
最新文档