华中科技大学数据结构实验报告
数据结构课程试验报告
数据结构课程实验报告题目:哈夫曼编/译码器班级:电信0608姓名:彭飞学号:012006013517指导老师:刘玉数据结构实验报告华中科技大学电信系2007年12月目录1.需求分析 (1)2.概要设计 (2)2.1抽象数据类型定义 (2)2.2主程序 (2)2.3模块 (2)3.详细设计 (3)3.1哈夫曼编码类型 (3)3.2相关基本操作 (3)3.3主程序伪码算法 (9)3.4函数调用关系图 (11)4.调试分析 (12)5.用户手册 (13)6.测试结果 (14)7.附录 (16)一、需求分析1.哈夫曼编码对象为任意字符,包括数字及各种符号,通过统计用户输入字符串中个关键对象出现次数,建立相应的哈夫曼树。
2.演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”,用户由键盘输入数字命令,执行相应命令后显示操作结果。
3.程序执行的命令:1)建立哈夫曼树;2)求哈夫曼编码;3)打印哈夫曼树;4)对哈夫曼编码进行译码,提示用户输入合法编码;4.输入过程中能自动滤去合法字符以外的其他字符,并能在输入不当时输出相应的提示信息。
5.测试数据:1)输入:Hello!world!2)输出:见测试结果。
二、概要设计1.抽象数据类型的定义如下:ADT HuffmanTree{数据对象D:D={ai|ai∈Htnode型结点,i=1,2,…,n,n≥0}数据关系:R={<ai,ai.lchild>,<ai,ai.rchild>|ai∈D,i=2,3,…,n}基本操作:select(HuffmanTree HT,int n,int &s1,int &s2)初始条件:HT已存在。
操作结果:在树HT中的前n个结点中找出权值最小的两个结点分别记录在s1,s2上。
HuffmanCoding(HuffmanTree &HT,Weight *w,int m)初始条件:HT已存在。
华科数据结构二叉树实验报告
华科数据结构二叉树实验报告华中科技大学(以下简称华科)是一所位于中国湖北省武汉市的顶尖高校。
作为计算机科学与技术专业的学生,我们在课程中学习了数据结构这门重要的课程。
在这学期的实验中,我们深入研究了二叉树这一数据结构,并进行了相关实验。
二叉树是一种常见的数据结构,它由节点构成,每个节点最多有两个子节点。
这种树的结构使得我们能够高效地操作和存储数据。
在本次实验中,我们主要关注二叉树的构建和遍历。
在实验的第一部分,我们需要实现一个二叉树的构建算法。
我们使用了C++语言来实现这个算法。
首先,我们定义了一个节点类,它包含了节点的值以及指向左右子节点的指针。
然后,我们编写了一个递归函数来构建二叉树。
这个函数接受一个数组作为输入,并根据数组中的元素构建二叉树。
我们通过递归地调用这个函数来构建每个节点的子树,直到所有的节点都被构建完毕。
在实验的第二部分,我们学习了二叉树的遍历算法。
二叉树的遍历可以分为三种方式:前序遍历、中序遍历和后序遍历。
前序遍历是指先访问根节点,然后按照先左后右的顺序遍历左右子树。
中序遍历是指先遍历左子树,然后访问根节点,最后遍历右子树。
后序遍历是指先遍历左右子树,最后访问根节点。
我们编写了相应的递归函数来实现这些遍历算法,并将遍历结果输出。
在实验的第三部分,我们进行了性能测试。
我们首先生成了一个包含一百万个随机整数的数组,并使用这个数组构建了一个二叉树。
然后,我们分别计算了使用前序、中序和后序遍历算法遍历这个二叉树所需的时间。
结果显示,中序遍历算法是最快的,而后序遍历算法是最慢的。
这是因为中序遍历算法的顺序与二叉树的结构最为吻合,而后序遍历算法需要先遍历左右子树才能访问根节点。
通过这次实验,我们深入了解了二叉树这一数据结构,并学会了如何构建和遍历二叉树。
我们还通过性能测试了解到不同遍历算法的效率差异。
这次实验让我们更加熟悉了数据结构的应用,并提高了我们的编程能力。
总之,通过这次实验,我们对二叉树有了更深入的了解。
华科数据结构二叉树实验报告
华科数据结构二叉树实验报告一、实验目的本实验旨在通过实践操作,加深对数据结构中二叉树的理解,掌握二叉树的基本操作和应用。
二、实验内容1. 实现二叉树的创建和初始化。
2. 实现二叉树的插入操作。
3. 实现二叉树的删除操作。
4. 实现二叉树的查找操作。
5. 实现二叉树的遍历操作:前序遍历、中序遍历、后序遍历。
6. 实现二叉树的层次遍历。
7. 实现二叉树的销毁操作。
8. 进行实验测试,并分析实验结果。
三、实验步骤1. 创建二叉树的数据结构,包括节点的定义和指针的初始化。
2. 实现二叉树的创建和初始化函数,根据给定的数据构建二叉树。
3. 实现二叉树的插入操作函数,将新节点插入到二叉树的合适位置。
4. 实现二叉树的删除操作函数,删除指定节点,并保持二叉树的结构完整。
5. 实现二叉树的查找操作函数,根据给定的值查找对应的节点。
6. 实现二叉树的遍历操作函数,包括前序遍历、中序遍历、后序遍历。
7. 实现二叉树的层次遍历函数,按照层次顺序遍历二叉树。
8. 实现二叉树的销毁操作函数,释放二叉树的内存空间。
9. 编写测试程序,对上述函数进行测试,并分析实验结果。
四、实验结果与分析经过测试,实验结果如下:1. 创建和初始化函数能够正确构建二叉树,并初始化节点的值和指针。
2. 插入操作函数能够将新节点插入到二叉树的合适位置,并保持二叉树的结构完整。
3. 删除操作函数能够正确删除指定节点,并保持二叉树的结构完整。
4. 查找操作函数能够根据给定的值找到对应的节点。
5. 遍历操作函数能够按照指定的顺序遍历二叉树,并输出节点的值。
6. 层次遍历函数能够按照层次顺序遍历二叉树,并输出节点的值。
7. 销毁操作函数能够释放二叉树的内存空间,防止内存泄漏。
根据实验结果分析,二叉树的基本操作和应用都能够正常实现,达到了预期的效果。
五、实验总结通过本次实验,我进一步加深了对数据结构中二叉树的理解,并掌握了二叉树的基本操作和应用。
通过实践操作,我更加熟悉了二叉树的创建、插入、删除、查找和遍历等操作,同时也学会了如何进行层次遍历和销毁二叉树。
华中科技大学C语言课程设计实验报告
华中科技大学计算机科学与技术学院《C语言程序设计》课程设计基础部分实验报告题目:科技成果信息管理系统专业:计算机科学与技术班级:1204学号:姓名:成绩:指导教师:目录一、系统功能结构设计 (1)二、数据结构设计 (1)三、程序结构 (4)四、函数原型及功能 (9)五、试验结果 (13)六、实验体会 (29)七、附录1:参考文献 (31)八、附录2:程序清单 (31)一、系统功能结构设计航科技成果信息管理系统由五大功能模块组成:文件模块,编辑模块,查询模块,统计模块,帮助模块。
如下图所示:二、数据结构设计1.单位信息链结点结构(DEPT_NODE)及用法typedef struct dept_node{char number[8];/*单位编号*/char name[30];/*单位名称*/char PIC[20];/*负责人*/struct dept_node *next;/*指向下一结点*/struct archs_node *achs;/*指向科技成果信息链结点的指针*/GtkTreeIter iter;/*treeview 中对应treeiter*/}DEPT_NODE;2.科技成果信息链结点结构(ACHS_NODE)及用法typedef struct achs_node {char number[12];/*成果编号*/char name[50];/*成果名称*/char field[20];/*所属技术领域*/char first_dept_name[30];/*第一完成单位*/char first_dept_number[8];/*第一完成单位编号*/char first_member_name[20];/*第一完成人*/char award_name[30];/*获奖名称*/char award_level[10];/*获奖档次*/char award_grade[10];/*获奖等级*/struct arhs_node *next;/*指向下一节点*/struct member_node *members;/*指向完成人员信息结点的指*/GtkTreeIter iter;/*treeview 中对应treeiter*/}ACHS_NODE;中文字段名类型及长度变量名举例成果编号char[12]numbe 200703150001成果名称char[40]name The_method_of_study 所属技术领域char[20]fieldcomputer第一完成单位char[30]first_dept_name Huazhong_university_of _sci&tech 第一完成单位编号first_dept_numberfirst_dept_number 43007401第一完成人char[20]first_member_name Lu_zhengding获奖名称char[30]award_name Natural_science_of_hub ie_province 获奖档次char[10]award_levelprovince/*省级*/中文字段名类型及长度变量名举例单位编号char[8]number 43007401单位名称char[30]name Huazhong_university_of_sci&tech 负责人char[20]PICLi_peigeng获奖等级int award_grade1/*一等奖*/3.完成人员信息链结点结构(MEMBER_NODE)及用法typedef struct member_node{char number[18];/*身份证号*/char name[20];/*姓名*/char dept_name[30];/*工作单位*/char sex[4];/*性别*/int age;/*年龄*/char title[15];/*职称*/int rank;/*成果排名*/char achs_name[40];/*所属成果名称*/struct member_node*next;/*指向下一个结点*/GtkTreeIter iter;/*treeview中对应treeiter*/}MEMBER_NODE;中文字段名类型及长度举例姓名char[20]number Lu_zhengding身份证号char[18]name420111************工作单位char[30]dept_name Huazhong_university_of_sci&tech 性别char sex m年龄int age60职称char[15]title professor成果排名int rank1所属成果名称char[40]achs_name The_method_of_study4.三方向的十字交叉链表结构……5.登陆窗体控件结构体(wgt)及用法struct login_widget{GtkWidget*window;//主窗体GtkWidget*label_tips;//用于信息提示的标签GtkWidget*button_login;//两个按钮,一个点击后登录,一个点击后退出GtkWidget*button_exit;GtkWidget*entry_username;//两个文本框,用于输入用户名和密码GtkWidget*entry_pwd;GtkWidget*label_username;//两个标签用于显示username文本框和password文本框提示GtkWidget*label_pwd;GtkWidget*vbox;//垂直布局盒子,包含以下三个水平布局盒子GtkWidget*hbox_username;//包含用户名提示标签和用户名文本框,下面的HBOX作用类似GtkWidget*hbox_pwd;GtkWidget*hbox_button;}wgt;说明:将登陆窗体相关控件独立成一个结构体6.指向3种节点的指针联合及用法typedef union nodep{struct dept_node*dept;struct achs_node*achs;struct member_node*member;}nodep;说明:用于3种结构都会用到但不会同时用到的情形7.两个传递参数的结构及其用法struct nodecreate{GtkWidget*window;GtkWidget*entry[9];nodep unp;int type;};struct query_judge{GtkWidget*entry;int flag;};说明:GTK信号连接g_signal_connected将函数与信号链接后之内传递一个参数给函数,所以定义这两个结构分别将几个参数结合在一起传递三、程序结构1.主程序运行流程开始登陆框出现输入用户名与密码主界面初始化加载数据或重新添加系统功能模块的选择及运行退出系统前提示保存链表数据清理内存中的缓存信息,关闭系统结束2.数据保存流程YNYNYN开始打开航班,经停机场,经停航班信息文件P1==NULL在文件1写入一条单位信息P2==NULLP1=P1->next在文件2写入一条科技成果信息P2=p2->nextP3==NULL关闭文件退出系统在文件3写入一条完成人员信息P3=p3->next结束3.添加流程4.单位查询流程5.统计50岁以下第一完成人流程Y NY NNNY开始调用统计函数statis_func3创建一个GtkListStore ,P1=gp_headP1==NULLP1=p1->next 获取第二级链表的链头指针p2=p1->achsP2==NULLP2=p2->next P3=MEMBER_search(p2->first_member_name,p2->members)P3->age<50插入liststore结束将ListStore 传递给Statis_info 展示出来四、函数原型及功能(所有GtkWidget*button参数均为与消息链接用)1.登陆模块//功能:登录框初始化函数//输入参数://返回值:无void init_login_widget()//功能:登录验证函数,点击login按钮时调用//输入参数://返回值:无void login(GtkWidget*widget,gpointer data)2.图形界面模块/**初始化部分变量,再依次调用各函数初始化界面各部分*/int main(int argc,char*argv[])/**初始化菜单栏*/void init_menubar(GtkWidget*menubar)/**初始化目录*/void create_view_and_model(void)/**初始化显示栏*/void init_show(GtkWidget*list)/**改变状态栏及显示栏*/void on_changed(GtkWidget*widget,gpointer statusbar)//功能:将选中的节点信息在显示栏中显示出来//输入参数:iter//返回值:无int Show_Node(GtkTreeIter iter)//值传递不影响selectediter/**对应3个节点显示的3个函数,返回对应GtkListStore*/ GtkListStore*Show_Dept(char*name);GtkListStore*Show_Achs(char*name,char*P_name);GtkListStore*Show_Member(char*name,char*P_name,char*PP_name);3.文件模块//功能:读取数据文件//输入参数://返回值:re的二进制前3位记录了三个数据文件是否成功打开,1为成功int LoadData(GtkWidget*button)//功能:读取数据文件中数据到链表中//输入参数:phead单位节点头指针的地址//返回值:re的二进制前3位记录了三个数据文件是否成功打开,1为成功int LoadList(DEPT_NODE**phead)//功能:将链表中节点添加到左侧树状列表中//输入参数://返回值:void rebuildtree()//功能:存储数据文件//输入参数://返回值:flag的二进制前3位记录了三个数据文件是否成功打开,1为成功int SaveData(GtkWidget*button)//功能:将链表中数据存储在数据文件中//输入参数:phead单位节点头指针//返回值:flag的二进制前3位记录了三个数据文件是否成功打开,1为成功int SaveList(DEPT_NODE*phead)//功能:推出前提示保存//输入参数://返回值:void quit_save(GtkWidget*button)4.查询模块//功能:根据type弹出一个查询框,再分别调用对应的Query函数//输入参数:type对应枚举的几种类型//返回值:无void Query_info(GtkWidget*button,int type)//功能:查询学院//输入参数:in包含iter和名称的结构//返回值:无void Query_Dept(GtkWidget*button,struct query_judge*in)//功能:根据type弹出一个查询框,再分别调用对应的Query函数//输入参数:type对应枚举的几种类型//返回值:无void Query_info(GtkWidget*button,int type)//功能:查询完成人员//输入参数:in包含iter和名称的结构//返回值:无void Query_Member(GtkWidget*button,struct query_judge*in)//功能:展开并跳转至指定iter//输入参数:iter treeview中的一个目标iter//返回值:无void expand_select(GtkTreeIter iter)//功能:按名称搜索单位//输入参数:D_name单位名称//返回值:单位节点指针DEPT_NODE*DEPT_search(char*D_name)//功能:按名称搜索科技成果节点//输入参数:A_name科技成果节点名称,ACHS所在学院头科技成果节点指针//返回值:科技成果节点节点指针ACHS_NODE*ACHS_search(char*A_name,ACHS_NODE*ACHS)//功能:按名称搜索完成人员节点//输入参数:M_name完成人员节点名称,ACHS所属科技成果头完成人员节点指针//返回值:完成人员节点节点指针MEMBER_NODE*MEMBER_search(char*M_name,MEMBER_NODE*MEMBER)5.添加模块//功能:弹出一个输入框//输入参数:type对应枚举的几种类型//返回值:无void entry_info(GtkWidget*button,int type)//功能:添加3种节点统一函数,由entry_info确定按钮调用//输入参数://返回值:无void Add_node(GtkWidget*button,struct nodecreate*nodec)//功能:插入科技成果节点函数,由Add_Node中情况3调用//输入参数:pNew指向新节点的指针//返回值:对应单位节点指针DEPT_NODE*insert_ACHS(ACHS_NODE*pNew)//功能:插入完成人员节点函数,由Add_Node中情况4调用//输入参数:pNew指向新节点的指针//返回值:对应科技成果节点指针ACHS_NODE*insert_MEMBER(MEMBER_NODE*pNew)6.删除模块//功能:删除3种节点统一函数,由“删除”按钮调用//输入参数://返回值:无void Del_Node(GtkWidget*button)//功能:删除单位节点,由Del_Node函数case2调用//输入参数:name单位名称//返回值:int1为有错,0为正常int Del_Dept(char*name)//功能:删除科技成果节点,由Del_Node函数case2调用//输入参数:name科技成果名称,P_name对应单位名称//返回值:int1为有错,0为正常int Del_Achs(char*name,char*P_name)//功能:删除完成人员节点,由Del_Node函数case4调用//输入参数:name完成人员名称,P_name对应科技成果名称,PP_name对应单位名称//返回值:int1为有错,0为正常int Del_Member(char*name,char*P_name,char*PP_name)7.编辑模块//功能:弹出一个编辑框//输入参数://返回值:无int Edit_info(GtkWidget*button)//功能:编辑节点//输入参数://返回值:无void Edit_Node(GtkWidget*button,struct nodecreate*nodec)8.统计模块//功能:弹出一个统计框,由传入参数设置具体内容//输入参数:title统计框标题,col1第一列标题,col2第二列标题,in传入的model//返回值:无void Statis_info(char*title,char*col1,char*col2,GtkListStore*in)//功能:统计各单位科技成果数量,调用Statis_info显示统计结果//输入参数://返回值:无void statis_func1(GtkWidget*button)//功能:统计各单位完成人员成果排名,调用Statis_info显示统计结果//输入参数://返回值:无void statis_func2(GtkWidget*button)//功能:统计所有50岁以下第一完成人,调用Statis_info显示统计结果//输入参数://返回值:无void statis_func3(GtkWidget*button)9.帮助模块//功能:弹出软件信息及作者信息//输入参数://返回值:无void help_about(GtkWidget*button)五、试验结果编译环境:Ubuntu linux64位Mingw Gcc(源代码配置好后可跨平台编译)GTK版本:GTK+2.41开发IDE:Codeblocks12.111.系统登陆输对自动进入输错显示错误2.登陆成功进入主界面3.全屏模式4.读取数据5.读取成功6.添加单位(添加成功提示)7.添加科技成果8.添加完成人员9.添加错误返回信息(选中节点后点击左下角编辑按钮)弹出确认框12.查询单位查询成功,左侧已跳转至并展开机械学院查询成功,左侧已跳转至并展开网络磁盘阵列未查询到时弹出提示14.查询完成人员从头查询,跳转至并展开第一个张江点击查询,跳转至并展开第二个张江15.统计各单位科技成果总数及各类成果数16.统计各单位成果排名17.统计50岁以下第一完成人18.软件信息及作者信息19.退出前提示保存六、实验体会首先我看了一下实验书上的编程规范和几个基本模块的实现思想,但当我开始做的时候我发现光用face.c自己看不懂文本菜单操作肯定会有很多问题的,于是我想同样是学,不如直接学图形界面的开发。
华中科技大学-计算机学院-数据结构实验报告
华中科技大学-计算机学院-数据结构实验报告LT目录1基于顺序存储结构实现线性表的基本运算 (1)1.1 实验目的 (1)1.2 线性表演示系统设计 (1)1.2.1 系统总体设计 (1)1.2.2 有关常量和类型定义 (1)1.2.3 算法设计 (1)1.3 线性表演示系统实现与测试 (3)1.3.1 系统实现 (3)1.3.2 系统测试 (11)1.4 实验小结 (12)2 基于链式实现线性表的基本运算 (13)2.1 问题描述 (13)2.2 线性表演示系统设计 (13)2.2.1 系统总体设计 (13)2.2.2 有关常量和类型定义 (13)2.2.3 算法设计 (13)2.3 线性表演示系统实现与测试 (15)2.3.1 系统实现 (15)2.3.2 系统测试 (24)2.4 实验小结 (25)3基于顺序存储结构实现栈的基本运算 (27)3.1实验目的 (27)3.2栈演示系统设计 (27)3.2.1 系统总体设计 (27)3.2.2 算法实现 (27)3.3 栈演示系统实现与测试 (28)3.3.1 程序实现 (28)3.3.2 系统测试 (34)3.4 实验小结 (35)4基于循环队列存储结构实现队列的基本运算 (36)4.1 问题描述 (36)4.2.1 系统总体设计 (36)4.2.2 有关常量和类型定义 (36)4.2.3 算法设计 (36)4.3 队列演示系统实现与测试 (37)4.3.1 系统实现 (37)4.3.2 系统测试 (44)4.4 实验小结 (45)5基于二叉链表实现二叉树的基本运算 (46)5.1 实验目的 (46)5.2.1 系统总体设计 (46)5.2.2 有关常量和类型定义 (46)5.2.3 算法设计 (46)5.3 二叉树演示系统实现与测试 (48)5.3.1 系统实现 (48)5.3.2 系统测试 (79)5.4 实验小结 (81)6基于邻接表实现图的基本和常见运算 (82)6.1 实验目的 (82)6.2.1 系统总体设计 (82)6.2.2 有关常量和类型定义 (82)6.2.3 算法设计 (82)6.3 图演示系统实现与测试 (83)6.3.1 系统实现 (83)6.3.2 系统测试 (101)6.4 实验小结 (103)参考文献 (104)1基于顺序存储结构实现线性表的基本运算1.1 实验目的通过实验达到:(1)加深对线性表的概念、基本运算的理解;(2)熟练掌握线性表的逻辑结构与物理结构的关系;(3)物理结构采用顺序表,熟练掌握线性表的基本运算的实现。
数据结构实验报告总结
数据结构实验报告总结本次数据结构实验主要涉及到线性表、栈和队列的基本操作,通过实验操作和总结,我对数据结构的相关知识有了更深入的理解和掌握。
首先,我们进行了线性表的实验操作。
线性表是一种数据结构,它是由n(n≥0)个数据元素组成的有限序列。
在实验中,我们学习了线性表的顺序存储结构和链式存储结构。
通过代码实现,我深刻理解了顺序表和链表的存储方式和特点。
在实验过程中,我发现顺序表适合查找操作,而链表适合插入和删除操作。
这让我对线性表的应用场景有了更清晰的认识。
其次,我们进行了栈的实验操作。
栈是一种特殊的线性表,它只能在表的一端进行插入和删除操作。
在实验中,我学习了栈的基本操作,包括入栈和出栈。
通过实际操作,我深刻理解了栈的“先进后出”的特性,以及它在计算机程序设计中的应用。
我发现栈在递归算法、表达式求值和括号匹配等方面有着重要的作用,这让我对栈的实际应用有了更深入的认识。
最后,我们进行了队列的实验操作。
队列是一种特殊的线性表,它只能在表的一端进行插入操作,而在另一端进行删除操作。
在实验中,我学习了队列的基本操作,包括入队和出队。
通过实际操作,我深刻理解了队列的“先进先出”的特性,以及它在计算机程序设计中的重要性。
我发现队列在广度优先搜索、模拟系统等方面有着重要的应用,这让我对队列的实际应用有了更深入的了解。
通过本次数据结构实验,我不仅掌握了线性表、栈和队列的基本操作,还深刻理解了它们在实际应用中的重要性。
我相信这些知识和经验对我的学习和工作都将有着重要的帮助。
在未来的学习和实践中,我将继续加强对数据结构的理解和运用,不断提升自己的编程能力和解决问题的能力。
总之,本次数据结构实验让我受益匪浅,我将继续努力学习和实践,不断提升自己的专业能力。
希望通过不懈的努力,能够在数据结构领域取得更大的成就。
数据结构实训实验报告
一、实验背景数据结构是计算机科学中一个重要的基础学科,它研究如何有效地组织和存储数据,并实现对数据的检索、插入、删除等操作。
为了更好地理解数据结构的概念和原理,我们进行了一次数据结构实训实验,通过实际操作来加深对数据结构的认识。
二、实验目的1. 掌握常见数据结构(如线性表、栈、队列、树、图等)的定义、特点及操作方法。
2. 熟练运用数据结构解决实际问题,提高算法设计能力。
3. 培养团队合作精神,提高实验报告撰写能力。
三、实验内容本次实验主要包括以下内容:1. 线性表(1)实现线性表的顺序存储和链式存储。
(2)实现线性表的插入、删除、查找等操作。
2. 栈与队列(1)实现栈的顺序存储和链式存储。
(2)实现栈的入栈、出栈、判断栈空等操作。
(3)实现队列的顺序存储和链式存储。
(4)实现队列的入队、出队、判断队空等操作。
3. 树与图(1)实现二叉树的顺序存储和链式存储。
(2)实现二叉树的遍历、查找、插入、删除等操作。
(3)实现图的邻接矩阵和邻接表存储。
(4)实现图的深度优先遍历和广度优先遍历。
4. 算法设计与应用(1)实现冒泡排序、选择排序、插入排序等基本排序算法。
(2)实现二分查找算法。
(3)设计并实现一个简单的学生成绩管理系统。
四、实验步骤1. 熟悉实验要求,明确实验目的和内容。
2. 编写代码实现实验内容,对每个数据结构进行测试。
3. 对实验结果进行分析,总结实验过程中的问题和经验。
4. 撰写实验报告,包括实验目的、内容、步骤、结果分析等。
五、实验结果与分析1. 线性表(1)顺序存储的线性表实现简单,但插入和删除操作效率较低。
(2)链式存储的线性表插入和删除操作效率较高,但存储空间占用较大。
2. 栈与队列(1)栈和队列的顺序存储和链式存储实现简单,但顺序存储空间利用率较低。
(2)栈和队列的入栈、出队、判断空等操作实现简单,但需要考虑数据结构的边界条件。
3. 树与图(1)二叉树和图的存储结构实现复杂,但能够有效地表示和处理数据。
数据结构实验报告
数据结构实验报告一、实验目的数据结构是计算机科学中重要的基础课程,通过本次实验,旨在深入理解和掌握常见数据结构的基本概念、操作方法以及在实际问题中的应用。
具体目的包括:1、熟练掌握线性表(如顺序表、链表)的基本操作,如插入、删除、查找等。
2、理解栈和队列的特性,并能够实现其基本操作。
3、掌握树(二叉树、二叉搜索树)的遍历算法和基本操作。
4、学会使用图的数据结构,并实现图的遍历和相关算法。
二、实验环境本次实验使用的编程环境为具体编程环境名称,编程语言为具体编程语言名称。
三、实验内容及步骤(一)线性表的实现与操作1、顺序表的实现定义顺序表的数据结构,包括数组和表的长度等。
实现顺序表的初始化、插入、删除和查找操作。
2、链表的实现定义链表的节点结构,包含数据域和指针域。
实现链表的创建、插入、删除和查找操作。
(二)栈和队列的实现1、栈的实现使用数组或链表实现栈的数据结构。
实现栈的入栈、出栈和栈顶元素获取操作。
2、队列的实现采用循环队列的方式实现队列的数据结构。
完成队列的入队、出队和队头队尾元素获取操作。
(三)树的实现与遍历1、二叉树的创建以递归或迭代的方式创建二叉树。
2、二叉树的遍历实现前序遍历、中序遍历和后序遍历算法。
3、二叉搜索树的操作实现二叉搜索树的插入、删除和查找操作。
(四)图的实现与遍历1、图的表示使用邻接矩阵或邻接表来表示图的数据结构。
2、图的遍历实现深度优先遍历和广度优先遍历算法。
四、实验结果与分析(一)线性表1、顺序表插入操作在表尾进行时效率较高,在表头或中间位置插入时需要移动大量元素,时间复杂度较高。
删除操作同理,在表尾删除效率高,在表头或中间删除需要移动元素。
2、链表插入和删除操作只需修改指针,时间复杂度较低,但查找操作需要遍历链表,效率相对较低。
(二)栈和队列1、栈栈的特点是先进后出,适用于函数调用、表达式求值等场景。
入栈和出栈操作的时间复杂度均为 O(1)。
2、队列队列的特点是先进先出,常用于排队、任务调度等场景。
华中科技大学数据结构实验报告
华中科技大学数据结构实验报告课程实验报告课程名称:数据结构实验专业班级:信息安全201502学号:姓名:指导教师:报告日期:2016年10月28 日计算机科学与技术学院目录1基于顺序存储结构的线性表实现 (1)1.1问题描述 (1)1.2系统设计 (3)1.3系统实现 (7)1.4实验小结 (16)2 基于二叉链表的二叉树实现 (17)2.1问题描述 (17)2.2系统设计 (20)2.3系统实现 (23)2.4实验小结 (41)指导教师评定意见 (42)附录A 基于顺序存储结构线性表实现的源程序 (45)附录B 基于二叉链表二叉树实现的源程序 (53)1 基于顺序存储结构的线性表实现1.1 问题描述采用顺序表的物理结构,构造一个具有菜单的功能演示系统。
其中,在主程序中完成函数调用所需实参值的准备和函数执行结果的显示。
定义了线性表的初始化表、销毁表、清空表、判定空表、求表长和获得元素等基本运算对应的函数,并给出适当的操作提示显示,可选择以文件的形式进行存储和加载,即将生成的线性表存入到相应的文件中,也可以从文件中获取线性表进行操作。
1.1.1 线性表的基本概念线性表是最常用且最简单的一种数据结构,即n个数据元素的有限序列。
线性表中元素的个数n定义为线性表的长度,n=0时成为空表。
在非空表中的每个数据元素都有一个确定的位置,如a1是第一个数据元素,an是最后一个数据元素,ai是第i个数据元素。
线性表的存储结构分为线性存储和链式存储。
1.1.2 逻辑结构与基本运算线性表的数据逻辑结构定义如下:ADT List{数据对象:D={ai|ai∈ElemSet,i=1,2,……,n,n≥0}数据关系:R1={ <ai-1,ai> | ai-1,ai∈D,i=2,……,n}}依据最小完备性和常用性相结合的原则,以函数形式定义了包括线性表的初始化表、加载表、保存表、销毁表、清空表、判定空表、求表长、获得元素、查找元素、获得前驱、获得后继、插入元素、删除元素、遍历表 14 个基本运算,要求分别定义函数来实现上述功能,具体功能运算如下:⑴初始化表:函数名称是InitaList(L);初始条件是线性表L不存在已存在;操作结果是构造一个空的线性表。
数据结构实习报告(共8篇)
数据结构实习报告(共8篇)数据结构实习报告(共8篇)第1篇:数据结构实_报告附件:实_报告格式,如下:数据结构实_报告班级:姓名:xxx(1514)xxx(1514)xxx(1514)指导教师:日期:题目一、问题描述(把你所选的题目及要求说一下)二、概要设计(抽象数据类型定义)三、详细设计(主要算法和函数间的调用关系)四、调试分析(调式过程中出现的问题及如何改正)五、心得体会(组内成员的分工及实_期间的体会)六、用户手册(系统的使用方法介绍)可参照_题集上的实_报告格式。
第2篇:数据结构实_报告数据结构实_报告班级:13软件二班姓名:殷健学号:1345536225子集和数问题1:问题描述子集和数问题1:子集和问题的为W,c。
其中,W=w1,w2,.,wn是一个正整数的集合,子集和数问题判定是否存在W的一个子集W1,使得W1=cW(02:问题分析程序中设计了函数voidputeSumofSub(ints,intk,intr),其意义是从第k项开始,如果s(已经决策的和数)和wk(当前元素)之和为和数,就把结果输出来,否则如果s与,wk,wk+1之和小于和数,则调用puteSumofsub(s+wk,k+1,r-wk),意为选择此结点的左分支,再判断s和后面所有元素之和是否不小于M(所有的加起来都小,必定无解),并且s+wk+1M,也是无解),若条件符合即调用puteSumofSub(s,k+1,r-wk),即选择当前结点的右分支。
算法展示:#includeusingnamespacestd;#include#include#defineM50claSu mOfSubprivate:intwM;intm;intxM;public:SumOfSub(inta,intb, intn)for(inti=0;i=mvoidmain()intsum=0;intwM;srand(unsigne d)time(NULL);for(inti=0;icoutcoutcoutm;sum=m*sum;cout复杂性分析:对于不同的输入结果,算法的执行次数有所不同,最好情况是n,最坏情况是n*2n。
华中科技大学数据结构上机报告
《数据结构》上机报告实验名称Huffman编码专业:电子信息工程班级:xxxxxx学号:xxxxxxx姓名:xxxxxx指导教师:xxxxxx完成日期:2013-12-5一、需求分析根据字母的出现次数对每个字母进行编码,编码形式为二进制。
字母的出现次数作为权值建立Huffman树对26个字母进行Huffman编码并输出编码结果。
二、设计概要由于Huffman树的节点数是已知的,所有Huffman树可以采用顺序存储结构。
每个字母的Huffman编码使用数组存储,数组的首地址存储在一个指针数组内,类似于一个不等长的二维数组。
相关函数:void HuffmanTreeing(HuffmanTree &HT, int *w, int n); //建立Huffman树void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int n); //Huffman 编码void DestroyTree(HuffmanTree &HT, HuffmanCode &HC, int n); //销毁Huffman 树三、详细设计(代码):/*---------------头文件huffmantree.h---------------*/typedef struct{int weight;int parent, left, right;}HTNode, *HuffmanTree;typedef char **HuffmanCode;void HuffmanTreeing(HuffmanTree &HT, int *w, int n);//构造huffman树,有n个元素,w是权重void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int n);//对huffman树进行编码,结果输出到HC数组内void DestroyTree(HuffmanTree &HT, HuffmanCode &HC, int n);//销毁堆分配的树空间以及编码空间/*---------------函数定义huffmantree.cpp---------------*/#include "huffmantree.h"#include <stdio.h>#include <malloc.h>#include <string.h>static int selectmin(HuffmanTree HT, int n);//挑选权重最小且parent为0的节点void HuffmanTreeing(HuffmanTree &HT, int *w, int n){//huffman树无度为1的节点,有n个叶子节点,n-1个度为2的节点int m = 2 * n - 1;int i;//分配树空间,用数组存储HT = (HuffmanTree)(malloc(sizeof(HTNode) * m));//初始化每个节点的信息for(i = 0; i < n; i++){HT[i].weight = w[i];HT[i].left = HT[i].parent = HT[i].right = 0;}for(; i < m; i++){HT[i].weight = 0;HT[i].left = HT[i].parent = HT[i].right = 0;}//建树for(i = n; i < m; i++){int j;j = selectmin(HT, i);HT[j].parent = i;HT[i].left = j;HT[i].weight = HT[j].weight;j = selectmin(HT, i);HT[j].parent = i;HT[i].right = j;HT[i].weight += HT[j].weight;}}void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int n){//临时数组,编码最长为n-1char *cd = (char *)malloc(sizeof(char) * n);//HC是一个指针数组,也可以看作是一个不等长的二维数组HC = (HuffmanCode)malloc(sizeof(char *) * n);cd[n - 1] = 0;//对每个元素进行编码for(int i = 0; i < n; i++){int par = HT[i].parent;int start = n - 1;int son = i;//由下至上编码,编码由后往前临时存储在cd数组内while(par != 0){if(HT[par].left == son)cd[--start] = '0';elsecd[--start] = '1';son = par;par = HT[par].parent;}//将编码转存到HC数组中HC[i] = (char *)malloc(sizeof(char) * (n - start));strcpy(HC[i], cd + start);}free(cd);}static int selectmin(HuffmanTree HT, int n){//挑选权重最小且没有父亲(即parent == 0)的节点int min;int i = 0;while(HT[i].parent != 0)i++;min = i;for(i = i + 1; i < n; i++){if(HT[i].parent != 0)continue;if(HT[i].weight < HT[min].weight)min = i;}return min;}void DestroyTree(HuffmanTree &HT, HuffmanCode &HC, int n) {free(HT);for(int i = 0; i < n; i++){free(HC[i]);}free(HC);}/*---------------主函数test.cpp---------------*/#include "huffmantree.h"#include <stdio.h>#include <ctype.h>#include <stdlib.h>#define N 26struct elem{char word[N];int weight[N];};int main(){int w[N] = {0};int n = 0;char ch;struct elem zimu;FILE *fp;HuffmanTree HT;HuffmanCode HC;if((fp = fopen("in.txt", "r")) == NULL)exit(0);//统计各字母出现的频次while((ch = fgetc(fp)) != EOF){if(islower(ch))w[ch - 'a']++;if(isupper(ch))w[ch -'A']++;}fclose(fp);//将信息存入一个结构体中,主要是为了排除权重为0的字母for(int i = 0; i < N; i++){if(w[i] != 0){zimu.word[n] = 'A' + i;zimu.weight[n] = w[i];n++; //n为权重不为零的字母个数}}HuffmanTreeing(HT, zimu.weight, n);HuffmanCoding(HT, HC, n);//将编码输出到文件if((fp = fopen("out.txt", "w")) == NULL)exit(0);for(int i= 0; i < n; i++)fprintf(fp, "%c\t%d\t%s\n", zimu.word[i], zimu.weight[i], HC[i]);fclose(fp);DestroyTree(HT, HC, n);return 0;}四、实验结果:/*---------------输入in.txt---------------*/PRESIDENT OBAMA: I want to welcome Vice President Xi to the Oval Office and welcome him to the United States. This is obviously a great opportunity for us to build on the U.S.-China relationship, but also an opportunity to return the extraordinary hospitality that Vice President Xi showed Vice President Biden during his recent visit to China.As I indicated during my recent visit to APEC and the East Asia Summit, the United States is a Pacific nation. And we are very interested and very focused on continuing to strengthen our relationships, to enhance our trade and our commerce, and make sure that we are a strong and effective partner with the Asia Pacific region. And obviously, in order to do that, it is absolutely vital that we have a strong relationship with China./*---------------输出out.txt---------------*/A 54 1110B 7 1011011C 23 10111D 27 11110E 70 010F 8 000110G 8 000111H 27 11111I 64 001K 1 10110100L 14 00001M 10 101001N 49 1101O 46 1100P 16 00010R 39 1001S 38 1000T 73 011U 21 10101V 13 00000W 9 101000X 3 10110101Y 10 101100。
华科数据结构二叉树实验报告
华科数据结构二叉树实验报告实验报告:华科数据结构二叉树实验报告一、引言数据结构是计算机科学中非常重要的一门课程,它研究如何组织和存储数据以及如何有效地访问和操作数据。
二叉树是一种常用的数据结构,它具有良好的扩展性和灵活性,被广泛应用于各种领域。
本实验旨在通过实践,加深对二叉树的理解和应用。
二、实验目的1. 掌握二叉树的基本概念和特性;2. 熟悉二叉树的遍历算法;3. 实现二叉树的基本操作,包括创建、插入、删除和查找等;4. 分析和比较不同的二叉树操作的时间复杂度。
三、实验环境本实验使用C++编程语言在Windows操作系统下进行。
四、实验内容和步骤1. 实验内容本次实验主要包括以下内容:(1) 实现二叉树的创建:根据给定的数据,构建一棵二叉树;(2) 实现二叉树的插入:向已有的二叉树中插入新的节点;(3) 实现二叉树的删除:从已有的二叉树中删除指定节点;(4) 实现二叉树的查找:在已有的二叉树中查找指定节点;(5) 实现二叉树的遍历:包括前序遍历、中序遍历和后序遍历。
2. 实验步骤(1) 创建二叉树:根据给定的数据,构建一棵二叉树。
可以通过手动输入数据或者读取文件的方式获取数据。
首先,创建一个二叉树的节点类,包含数据和左右子节点的指针。
然后,根据输入的数据,逐个创建节点并建立节点之间的关系,最终构建出一棵完整的二叉树。
(2) 插入节点:实现向已有的二叉树中插入新的节点的操作。
插入节点时,需要找到插入位置,并建立节点之间的关系。
(3) 删除节点:实现从已有的二叉树中删除指定节点的操作。
删除节点时,需要考虑节点的位置和节点的子树情况,并相应地调整节点之间的关系。
(4) 查找节点:实现在已有的二叉树中查找指定节点的操作。
可以通过递归或者迭代的方式进行查找,找到节点后返回节点的指针。
(5) 遍历二叉树:实现二叉树的前序遍历、中序遍历和后序遍历操作。
遍历过程中,可以使用递归或者栈来实现。
五、实验结果与分析1. 实验结果经过实验,我们成功地实现了二叉树的创建、插入、删除、查找和遍历操作。
数据结构实验报告
数据结构实验报告一、实验目的数据结构是计算机科学中的重要基础课程,通过实验可以更深入地理解和掌握数据结构的概念、原理和应用。
本次实验的主要目的包括:1、熟悉常见的数据结构,如链表、栈、队列、树和图等。
2、掌握数据结构的基本操作,如创建、插入、删除、遍历等。
3、提高编程能力和解决实际问题的能力,能够运用合适的数据结构解决具体的问题。
二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。
三、实验内容1、链表的实现与操作单向链表的创建、插入和删除节点。
双向链表的实现和基本操作。
循环链表的特点和应用。
2、栈和队列的实现栈的后进先出特性,实现入栈和出栈操作。
队列的先进先出原则,完成入队和出队功能。
3、树的操作二叉树的创建、遍历(前序、中序、后序)。
二叉搜索树的插入、查找和删除操作。
4、图的表示与遍历邻接矩阵和邻接表表示图。
深度优先搜索和广度优先搜索算法的实现。
四、实验步骤及结果1、链表的实现与操作单向链表:首先,定义了链表节点的结构体,包含数据域和指向下一个节点的指针域。
通过创建链表头节点,并使用循环依次插入新节点,实现了链表的创建。
插入节点时,根据指定位置找到插入点的前一个节点,然后修改指针完成插入操作。
删除节点时,同样找到要删除节点的前一个节点,修改指针完成删除。
实验结果:成功创建、插入和删除了单向链表的节点,并正确输出了链表的内容。
双向链表:双向链表节点结构体增加了指向前一个节点的指针。
创建、插入和删除操作需要同时维护前后两个方向的指针。
实验结果:双向链表的各项操作均正常,能够双向遍历链表。
循环链表:使链表的尾节点指向头节点,形成循环。
在操作时需要特别注意循环的边界条件。
实验结果:成功实现了循环链表的创建和遍历。
2、栈和队列的实现栈:使用数组或链表来实现栈。
入栈操作将元素添加到栈顶,出栈操作取出栈顶元素。
实验结果:能够正确进行入栈和出栈操作,验证了栈的后进先出特性。
华科数据库实验报告
华科数据库实验报告华科数据库实验报告引言:数据库是计算机科学领域中非常重要的一部分,它是用来存储和管理大量数据的工具。
在现代社会中,各种各样的应用都需要使用数据库来支持其数据存储和处理的需求。
本实验旨在通过实际操作,深入了解华科数据库的特点和使用方法,并对其进行评估和分析。
1. 实验背景华科数据库是华中科技大学开发的一套数据库系统,用于支持学校内部的各项业务。
它采用了先进的分布式架构,具有高可用性和高性能的特点。
本次实验将使用华科数据库进行一系列的操作,包括数据的插入、查询和删除等,以及性能测试和优化。
2. 实验过程2.1 数据插入首先,我们需要准备一些测试数据,并将其插入到华科数据库中。
通过编写SQL语句,我们可以轻松地将数据插入到指定的表中。
在插入数据之前,我们需要先创建相应的表结构,并定义字段的数据类型和约束。
2.2 数据查询一旦数据插入完成,我们就可以进行各种查询操作了。
华科数据库提供了丰富的查询功能,包括基本的SELECT语句、条件查询、排序、分组等。
我们可以根据实际需求,灵活运用这些查询功能,从数据库中获取所需的数据。
2.3 数据删除当我们不再需要某些数据时,可以使用DELETE语句将其从数据库中删除。
华科数据库支持根据条件删除数据,这样我们可以方便地删除满足特定条件的数据。
3. 实验结果与分析通过实验,我们对华科数据库的性能和稳定性进行了评估。
在数据插入方面,华科数据库表现出色,插入速度快,且支持大规模数据的插入。
在数据查询方面,华科数据库提供了强大的查询功能,可以满足各种复杂的查询需求。
在数据删除方面,华科数据库的删除操作也非常高效。
然而,我们在实验过程中也发现了一些问题。
首先,华科数据库在处理大规模数据时,会出现一定的性能瓶颈。
虽然它能够支持大规模数据的插入和查询,但在某些情况下,查询速度会变慢。
其次,华科数据库对于复杂的数据关系处理能力还有待提高。
在处理多表关联查询时,会出现一些性能问题。
华科数据结构二叉树实验报告
华科数据结构二叉树实验报告一、实验目的本次实验旨在通过实践操作,深入理解二叉树的基本概念、性质和操作,并掌握二叉树的遍历算法。
二、实验内容1. 实现二叉树的建立和遍历算法;2. 进行性能测试,比较不同遍历算法的效率。
三、实验原理1. 二叉树的定义二叉树是一种特殊的树结构,它的每个节点最多只有两个子节点,分别称为左子节点和右子节点。
二叉树的每个节点都可以看作是一个小的二叉树。
2. 二叉树的遍历算法二叉树的遍历是指按照某种规则依次访问二叉树中的每个节点。
常用的遍历算法有前序遍历、中序遍历和后序遍历。
- 前序遍历(Preorder Traversal):先访问根节点,然后递归地前序遍历左子树,最后递归地前序遍历右子树。
- 中序遍历(Inorder Traversal):先递归地中序遍历左子树,然后访问根节点,最后递归地中序遍历右子树。
- 后序遍历(Postorder Traversal):先递归地后序遍历左子树,然后递归地后序遍历右子树,最后访问根节点。
四、实验步骤1. 实现二叉树的建立算法根据给定的数据,使用递归的方式构建二叉树。
具体步骤如下:- 如果当前节点为空,将数据作为当前节点的值创建新节点;- 如果当前节点不为空,比较数据与当前节点的值的大小,如果小于当前节点的值,则递归地将数据插入到当前节点的左子树中;如果大于当前节点的值,则递归地将数据插入到当前节点的右子树中。
2. 实现二叉树的遍历算法根据前述的遍历算法原理,实现前序遍历、中序遍历和后序遍历算法。
具体步骤如下:- 前序遍历算法:先访问当前节点,然后递归地前序遍历左子树,最后递归地前序遍历右子树。
- 中序遍历算法:先递归地中序遍历左子树,然后访问当前节点,最后递归地中序遍历右子树。
- 后序遍历算法:先递归地后序遍历左子树,然后递归地后序遍历右子树,最后访问当前节点。
3. 进行性能测试使用不同的遍历算法对同一二叉树进行遍历,并记录遍历所需的时间。
华中科技大学 大数据结构 实验报告材料
课程实验报告课程名称:数据结构专业班级:华中科技大学材控1402班学号:U201411219姓名:煌指导教师:袁凌报告日期:2016年5月20日计算机科学与技术学院目录实验报告要求说明 (1)1基于顺序存储结构实现线性表的基本运算 (1)1.1 问题描述 (1)1.2 顺序表演示系统设计 (1)1.2.1 系统总体设计 (1)1.2.2 有关常量和类型定义 (1)1.2.3 算法设计 (1)1.3 顺序表演示系统实现与测试 (1)1.3.1 系统实现 (1)1.3.2 系统测试 (1)1.4 实验小结 (2)2基于链式存储结构实现线性表的基本运算 (3)2.1 问题描述 (3)2.2 单链表演示系统设计 (3)2.2.1 系统总体设计 (3)2.2.2 有关常量和类型定义 (3)2.2.3 算法设计 (3)2.3 单链表演示系统实现与测试 (3)2.3.1 系统实现 (3)2.3.2 系统测试 (3)2.4 实验小结 (3)参考文献 (5)1课程实验概述本次课程实验旨在加强学生课堂理论学习之后增强上机能力,熟练掌握并应用数据结构中的两种逻辑结构的典型代表——线性表和树。
线性表的顺序存储具有随机存取的功能,而链式存储能有效的利用动态存储空间,学会合理的选择这两种存储方式,看似简单,但在实际应用具有很大的用处。
而树(二叉树)是非线性逻辑结构的代表,树模型的建立可以说完全建立在递归思想之上,树的几乎所有操作都涉及到递归调用,当然我们也可以用栈来实现非递归调用,但是其思想也是相近的。
因此树的实验旨在帮助我们递归思想的建立和成熟。
2实验一基于顺序结构的线性表实现2.1实验容与要求实验容:基于顺序存储结构,实现线性表ADT,具有10种基本运算。
具体要求:1.提供一个实现功能的演示系统。
2.具体物理结构和数据元素类型自定。
3.线性表数据可以使用磁盘文件永久保存。
2.2程序概要设计1.明确基本功能程序需要实现的12个基本功能分别是:IntiaList(初始化),DestroyList(摧毁线性表),ClearList(清空线性表),ListEmpty(判断表空),ListLength(求表长),GetElem(取表中元素),LocatElem(获得元素地址),PriorElem(取前继),NextElem(取后继)。
华中科技大学大学计算机学院--数据库实验报告
※查询结果:(图 2-3 所示)
图 2-3 查询结果
______________________ 第 6 页/共 25 页
华中科技大学
计算机学院数据库系统概论实验报告
create table p ( pno varchar(20) primary key, pname varchar(20), color varchar(20), weight varchar(20));
create table j ( jno varchar(20) primary key, jname varchar(20), city varchar(20));
图 3-3 查询结果
______________________ 第 8 页/共 25 页
华中科技大学
计算机学院数据库系统概论实验报告
U201014281
(4)找出工程项目 J2 使用的各种零件的名称及其数量; ※查询语句为:
select p.pname,spj.qty from spj,p where spj.pno=p.pno and jno='J2'; ※查询结果:(图 3-4 所示)
select pname,color,weight from p; ※查询结果:(图 3-2 所示)
图 3-2 查询结果
(3)找出使用供应商 S1 所提供零件的工程号码; ※查询语句为:
select distinct pno from spj where sno='S1'; ※查询结果:(图 3-3 所示)
大学数据结构实验报告模板
大学数据结构实验报告模板一、实验目的数据结构实验是计算机相关专业课程中的重要实践环节,通过实验可以加深对数据结构理论知识的理解,提高编程能力和解决实际问题的能力。
本次实验的主要目的包括:1、掌握常见数据结构(如数组、链表、栈、队列、树、图等)的基本操作和实现方法。
2、学会运用数据结构解决实际问题,培养算法设计和分析能力。
3、提高程序设计的规范性和代码质量,培养良好的编程习惯。
4、熟悉编程语言(如C、C++、Java 等)的开发环境和调试技巧。
二、实验环境1、操作系统:_____2、编程语言:_____3、开发工具:_____三、实验内容(一)线性表的实现与操作1、顺序表的实现定义顺序表的数据结构。
实现顺序表的初始化、插入、删除、查找等基本操作。
2、链表的实现定义链表的数据结构(单链表、双向链表或循环链表)。
实现链表的创建、遍历、插入、删除等操作。
(二)栈和队列的实现与应用1、栈的实现定义栈的数据结构。
实现栈的入栈、出栈、栈顶元素获取等操作。
利用栈解决括号匹配、表达式求值等问题。
2、队列的实现定义队列的数据结构。
实现队列的入队、出队、队头元素获取等操作。
利用队列实现广度优先搜索、任务调度等应用。
(三)树的实现与遍历1、二叉树的实现定义二叉树的数据结构(二叉链表或顺序存储)。
实现二叉树的创建、前序遍历、中序遍历、后序遍历。
2、二叉搜索树的实现实现二叉搜索树的插入、删除、查找操作。
3、平衡二叉树(如 AVL 树)的实现(选做)理解平衡二叉树的平衡调整算法。
实现平衡二叉树的插入和删除操作,并保持树的平衡。
(四)图的表示与遍历1、图的邻接矩阵和邻接表表示定义图的数据结构(邻接矩阵或邻接表)。
实现图的创建和初始化。
2、图的深度优先遍历和广度优先遍历实现图的深度优先遍历和广度优先遍历算法。
应用图的遍历解决最短路径、连通性等问题。
(五)排序算法的实现与性能比较1、常见排序算法的实现实现冒泡排序、插入排序、选择排序、快速排序、归并排序等算法。
华中科技大学数据结构实验报告
课程实验报告课程名称:数据结构实验专业班级:信息安全201502学号:姓名:指导教师:报告日期:2016年10月28 日计算机科学与技术学院目录1基于顺序存储结构的线性表实现 (1)1.1问题描述 (1)1.2系统设计 (3)1.3系统实现 (7)1.4实验小结 (16)2 基于二叉链表的二叉树实现 (17)2.1问题描述 (17)2.2系统设计 (20)2.3系统实现 (23)2.4实验小结 (40)指导教师评定意见 (42)附录A 基于顺序存储结构线性表实现的源程序 (44)附录B 基于二叉链表二叉树实现的源程序 (52)1 基于顺序存储结构的线性表实现1.1 问题描述采用顺序表的物理结构,构造一个具有菜单的功能演示系统。
其中,在主程序中完成函数调用所需实参值的准备和函数执行结果的显示。
定义了线性表的初始化表、销毁表、清空表、判定空表、求表长和获得元素等基本运算对应的函数,并给出适当的操作提示显示,可选择以文件的形式进行存储和加载,即将生成的线性表存入到相应的文件中,也可以从文件中获取线性表进行操作。
1.1.1 线性表的基本概念线性表是最常用且最简单的一种数据结构,即n个数据元素的有限序列。
线性表中元素的个数n定义为线性表的长度,n=0时成为空表。
在非空表中的每个数据元素都有一个确定的位置,如a1是第一个数据元素,an是最后一个数据元素,ai是第i个数据元素。
线性表的存储结构分为线性存储和链式存储。
1.1.2 逻辑结构与基本运算线性表的数据逻辑结构定义如下:ADT List{数据对象:D={ai|ai∈ElemSet,i=1,2,……,n,n≥0}数据关系:R1={ <ai-1,ai> | ai-1,ai∈D,i=2,……,n}}依据最小完备性和常用性相结合的原则,以函数形式定义了包括线性表的初始化表、加载表、保存表、销毁表、清空表、判定空表、求表长、获得元素、查找元素、获得前驱、获得后继、插入元素、删除元素、遍历表 14 个基本运算,要求分别定义函数来实现上述功能,具体功能运算如下:⑴初始化表:函数名称是InitaList(L);初始条件是线性表L不存在已存在;操作结果是构造一个空的线性表。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程实验报告课程名称:数据结构专业班级:华中科技大学材控1402班学号:U201411219姓名:张煌指导教师:袁凌报告日期:2016年5月20日计算机科学与技术学院目录实验报告要求说明................................................. 错误!未定义书签。
1基于顺序存储结构实现线性表的基本运算 ................... 错误!未定义书签。
1.1 问题描述 ...................................................... 错误!未定义书签。
1.2 顺序表演示系统设计......................................... 错误!未定义书签。
1.2.1 系统总体设计 .............................................. 错误!未定义书签。
1.2.2 有关常量和类型定义 ...................................... 错误!未定义书签。
1.2.3 算法设计.................................................... 错误!未定义书签。
1.3 顺序表演示系统实现与测试................................. 错误!未定义书签。
1.3.1 系统实现.................................................... 错误!未定义书签。
1.3.2 系统测试.................................................... 错误!未定义书签。
1.4 实验小结 ...................................................... 错误!未定义书签。
2基于链式存储结构实现线性表的基本运算 ................... 错误!未定义书签。
2.1 问题描述 ...................................................... 错误!未定义书签。
2.2 单链表演示系统设计......................................... 错误!未定义书签。
2.2.1 系统总体设计 .............................................. 错误!未定义书签。
2.2.2 有关常量和类型定义 ...................................... 错误!未定义书签。
2.2.3 算法设计.................................................... 错误!未定义书签。
2.3 单链表演示系统实现与测试................................. 错误!未定义书签。
2.3.1 系统实现.................................................... 错误!未定义书签。
2.3.2 系统测试.................................................... 错误!未定义书签。
2.4 实验小结 ...................................................... 错误!未定义书签。
参考文献 ........................................................... 错误!未定义书签。
1课程实验概述本次课程实验旨在加强学生课堂理论学习之后增强上机能力,熟练掌握并应用数据结构中的两种逻辑结构的典型代表——线性表和树。
线性表的顺序存储具有随机存取的功能,而链式存储能有效的利用动态存储空间,学会合理的选择这两种存储方式,看似简单,但在实际应用具有很大的用处。
而树(二叉树)是非线性逻辑结构的代表,树模型的建立可以说完全建立在递归思想之上,树的几乎所有操作都涉及到递归调用,当然我们也可以用栈来实现非递归调用,但是其思想也是相近的。
因此树的实验旨在帮助我们递归思想的建立和成熟。
2实验一基于顺序结构的线性表实现2.1实验内容与要求实验内容:基于顺序存储结构,实现线性表ADT,具有10种基本运算。
具体要求:1.提供一个实现功能的演示系统。
2.具体物理结构和数据元素类型自定。
3.线性表数据可以使用磁盘文件永久保存。
2.2程序概要设计1.明确基本功能程序需要实现的12个基本功能分别是:IntiaList(初始化),DestroyList (摧毁线性表),ClearList(清空线性表),ListEmpty(判断表空),ListLength (求表长),GetElem(取表中元素),LocatElem(获得元素地址),PriorElem (取前继),NextElem(取后继)。
ListInsert(插入),ListDelete(删除),ListTrabverse(遍历显示),此外还有辅助功能:Load(载入),Save(保存)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);int LocatElem(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, Elemtype e,int i);status ListDelete(SqList * L,Elemtype * e,int i);status ListTrabverse(SqList L,void (* visit)(Elemtype e));void Save(SqList L);status Load(SqList*L);2.3数据结构与算法设计为了满足概述中的功能,结合线性表结构,给出以下结构的定义:typedef int status;typedef struct{int item1;}Elemtype;typedef struct{Elemtype * elem;int length;int listsize;}SqList,*L;算法设计:1.IntiaList:初始化线性表,传入的是头结点地址。
申请一个大小为LIST_INT_SIZE、类型为Elemtype的线性存储空间,并用头结点中的首结点指针指向该空间首地址。
2.DestroyList:销毁头结点中首结点址针指向的线性存储空间,传入的是头结点地址。
3.ClearList:与Destroy类似但是又有不同,ClearList并不销毁物理空间,而是修改逻辑关系值。
4.ListEmpty:判空功能,判断表是否为空表。
传入的是头结点值,而非地址,因为不需要对头结点进行修改。
若长度为0,表空,否则不空。
5.ListLength:求表长功能,由于创建过程中已经把表长信息包含在头结点中,所以直接调用并显示即可。
6.GetElem:获取第i号元素,传入的是头结点值、元素编号i、以及出口表结点地址。
7.LocatElem:取指定元素编号,传入头结点值、存储了所需元素信息的一个临时表结点值、equal函数地址。
采用顺序比较法从表头遍历并比较,一旦找到,返回编号i。
8.PriorElem:求指定元素的前一个元素的内容,传入头结点值、包含指定元素信息的一个临时表结点值、存储前一个元素的表结点地址。
主要思路是先调用LocatElem 确定指定元素的位置,如果不是首结点则可直接取到PriorElem的地址。
9.NextElem:与PriorElem功能类似,不再赘述。
10.ListInset:插入一个数据元素,传入头结点地址、插入位置i、临时表结点值。
在调用插入函数前构造一个临时表结点,用于存储数据元素信息。
进入插入子函数,插入前先判断插入位置是否合理,再判断是否“满载”。
如果满载则重新申请更大的存储空间。
接下来正式插入数据元素,“先空位置再插入”。
11.ListDelete:删除一个数据元素,传入头结点地址、删除位置i。
删除前先判断位置是否合理,先删除元素,然后将所有删除元素之后的元素前移一个位置。
12.ListTrabverse:传入头结点,循环访问各个元素,直至到表尾停止。
2.4输入输出设计1.输入:在输入方面,我采用了用户自定义输入的方式,既可以采用用户自行输入,又可以载入之前保存的数据。
在每次操作之后,会提示是否保存刚才的数据,以便下次再次使用,以下是用户自行输入的功能实现:void creat(SqList *L){int a=0;printf("Input the number of your datas?\n");scanf("%d",&a);L->elem=(Elemtype*)malloc(a*sizeof(Elemtype));L->length=a;int i;printf("Please input your data\n");for (i=1;i<=a;i++){scanf("%d",&(L->elem[i].item1));}L->listsize=LIST_INIT_SIZE;printf("You have to save your data");getchar();Save(*L);}2.输出:采用遍历输出,即功能10的输出。
2.5源程序及注释/* Linear T able On Sequence Structure */#include <stdio.h>#include <malloc.h>#include <stdlib.h>#include <string.h>#define LIST_INIT_SIZE 10#define OK 1#define FALSE 0#define TRUE 1#define ERROR -1#define OVERFLOW -2#define LISTINCREMENT 1/*------------------------------------------------------*/typedef int status;typedef struct{int item1;}Elemtype;typedef struct{Elemtype * elem;int length;int listsize;}SqList,*L;int changed=0;/*------------------------------------------------------*/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);int LocatElem(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, Elemtype e,int i);status ListDelete(SqList * L,Elemtype * e,int i);status ListTrabverse(SqList L,void (* visit)(Elemtype e));/*------------------------------------------------------*/status compare(Elemtype e1,Elemtype e2);status equal(Elemtype x, Elemtype y);void display(Elemtype e);void Save(SqList L);status Load(SqList*L);void creat(SqList *L);/*------------------------------------------------------*/void menu(void);/*------------------------------------------------------*/char file0[20];int main(void){SqList L;L.listsize=LIST_INIT_SIZE;int op=0;char req;do{system("cls");menu();printf("Do you want to input new liear table?Y/N");req=getchar();getchar();if (req=='Y' ||req=='y') creat(&L);else {printf("Do you want to load saved data?Y/N");req=getchar();if (req=='Y' ||req=='y'){while (!Load(&L)) {L.elem=(Elemtype*)malloc((L.listsize++)*sizeof(Elemtype));}}else {printf("You still use the data use before!\n");getchar();getchar();}}system("cls");menu();printf(" Then please input your option[0-12]:");scanf("%d",&op);switch(op){case 0: break;case 1: {printf("\n here is IntiaList(),which being realized\n");getchar();getchar();if (IntiaList(&L)){printf("Successfullyrealized!\n");getchar();getchar();//printf("Dou you want to save?Y/N")}else {printf("Not realised!!\n");getchar();getchar();}break;}case 2: {printf("\n here is DestroyList(),which being realized\n");getchar();getchar();if (DestroyList(&L)){printf("Successfully realized!\n");getchar();getchar();}else {printf("Not realised!!\n");getchar();getchar();}break;}case 3: {printf("\n here is ClearList(),which beingrealized\n");getchar();getchar();if (ClearList(L)){printf("Successfully realized!\n");getchar();getchar();}else {printf("Not realised!!\n");getchar();getchar();}break;}case 4: {printf("\n here is ListEmpty(),which being realized\n");getchar();getchar();if (ListEmpty(L)){printf("It is an empty list\n");getchar();getchar();}else {printf("It is not an empty list\n");getchar();getchar();}break;}case 5: {printf("\n here is ListLength() ,which being realized\n");if (&L!=NULL){printf("%d",L.elem[1].item1);printf("Successfully realized!The length of L is %d\n",ListLength(L));getchar();getchar();}else {printf("Not realised!!\n");getchar();getchar();}break;}case 6: {printf("\n here is GetElem(),which being realized\n");getchar();getchar();int i;Elemtype e;printf("which elem do you want to pick?i=?");scanf("%d",&i);if (GetElem(L,i,&e)){printf("Successfully realized!\n");printf("And the %dth elem data is %d",i,e.item1);getchar();getchar();}else {printf("Not realised!!\n");getchar();getchar();}break;}case 7: {printf("\n here is LocatElem(),which being realized\n");getchar();getchar();int t,i,a;Elemtype e;printf("What do you want to locate?item=");scanf("%d",&t);for (i=1;i<=L.length;i++){if (L.elem[i].item1==t) break;}if (i==L.length+1) printf("There is no such item in this list!\n");e=L.elem[i];if (a=LocatElem(L,&e)){printf("Successfully realized!\n");printf("e is in the %dth location\n",a);getchar();getchar();}else {printf("Not realised!!\n");getchar();getchar();}break;}case 8: {printf("\n here is PriorElem(),which beingrealized\n");getchar();getchar();Elemtype e,cur;int i;printf("T o find the prio of who?i=");scanf("%d",&i);cur=L.elem[i];if (PriorElem(&L,cur,&e)){printf("Successfully realized!\n");printf("And the prio of elem[%d] is %d\n",i,e.item1);getchar();getchar();}else {printf("Not realised!!\n");getchar();getchar();}break;}case 9: {printf("\n here is NextElem(),which being realized\n");getchar();getchar();Elemtype e,cur;int i;printf("T o find the next of who?i=");scanf("%d",&i);cur=L.elem[i];if (NextElem(L,cur,&e)){printf("Successfully realized!\n");printf("And the nextelem of elem[%d] is %d\n",i,e.item1);getchar();getchar();}else {printf("Not realised!!\n");getchar();getchar();}break;}case 10: {printf("\n here is ListInsert(),which being realized\n");getchar();getchar();int i,j;Elemtype e;printf("choose where to insert?i=");scanf("%d",&i);printf("\nInsert new data=");scanf("%d",&(e.item1));if (ListInsert(&L,e,i)){printf("Successfully realized!\n");printf("the list data is now:\n");for (j=1;j<=L.length;j++)printf("%d ",L.elem[j].item1);getchar();getchar();}else {printf("Not realised!!\n");getchar();getchar();}break;}case 11: {printf("\n here is ListDelete(),which being realized\n");getchar();getchar();int i,j;Elemtype *e;printf("choose where to delete?i=");scanf("%d",&i);if (ListDelete(&L,e,i)){printf("Successfully realized!\n");printf("The deleted data is %d\n",(*e).item1);getchar();getchar();printf("the list data is now:\n");for (j=1;j<=L.length;j++)printf("%d ",L.elem[j].item1);getchar();getchar();}else {printf("Not realised!!\n");getchar();getchar();}break;}case 12: {printf("\n here is ListTrabverse(),which being realized\n");getchar();getchar();if(!L.elem)printf("\n liear table L does not exist!\n");else {if(ListTrabverse(L,display))printf("\nSuccessfully realised!\n");else printf("\n this liear table is empty!\n");}getchar();getchar();break;}default: ;}}while(op);printf("\n--------------------Welcome again!--------------------\n");getchar();getchar();return 1;}status IntiaList(SqList *L){L->elem=(Elemtype*)malloc(LIST_INIT_SIZE*sizeof(Elemtype));if (!L) exit(OVERFLOW);L->length=0;L->listsize=LIST_INIT_SIZE;return OK;}status DestroyList(SqList * L){free(L);L=NULL;char req;printf("Are you sure to destroy the file?Y/N");req=getchar();if (req=='y'||req=='Y'){remove(file0);printf("The file has been destroyed!\n");}return OK;}status ClearList(SqList L){L.length=0;return OK;}status ListEmpty(SqList L){if (L.length==0) return TRUE;else return FALSE;}int ListLength(SqList L){return L.length;}status GetElem(SqList L,int i, Elemtype * e){ if (!(L.length==0||i<1||i>L.length)) {*e=L.elem[i];return OK;}else return ERROR;}int LocatElem(SqList L,Elemtype *e){int i;for(i=1;i<=L.length;i++){if (compare(*e,L.elem[i]))return i;}return FALSE;}status PriorElem(SqList *L,Elemtype cur,Elemtype * pre_e){ int i;if(!L->elem) return ERROR;else{for(i=1;i<L->length;i++){if ((compare(L->elem[i],cur))) break;}if(i==1) return FALSE;else{*pre_e=(L->elem[i-1]);return OK;}}}status NextElem(SqList L,Elemtype cur,Elemtype * next_e){ int i;if(!L.elem) return ERROR;else{for(i=1;i<L.length;i++){if ((compare(L.elem[i],cur))) break;}if(i==L.length) return FALSE;else{(*next_e)=L.elem[i+1];return OK;}}}status ListInsert(SqList * L,Elemtype e,int i){Elemtype *q,*p,*newbase;if(L->length==0){L->length++;L->elem[1]=e;return OK;}if(i<1||i>L->length) return FALSE;if(L->length>=L->listsize){newbase=(Elemtype*)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(Ele mtype));if(!newbase) return(OVERFLOW);L->elem=newbase;L->listsize+=LISTINCREMENT;}q=&(L->elem[i]);for(p=&(L->elem[L->length]);p>=q;p--) {*(p+1)= *p;}*q=e;++L->length;return OK;}status ListDelete(SqList * L,Elemtype * e, int i){Elemtype *q,*p;if(!L->elem) return ERROR;if(i<1||i>L->length) return FALSE;q=&(L->elem[i]);for(p=&(L->elem[L->length-1]);p>=q;p--) {*p= *(p+1);}(*e)=L->elem[i];--L->length;return OK;}status ListTrabverse(SqList L, void (* visit)(Elemtype e)){ int i;if(!L.length) return(0);printf("\n-------------all elements of liear table----------------\n");for(i=1;i<=L.length;i++) visit(L.elem[i]);return(1);}status compare(Elemtype e1 ,Elemtype e2 ){if (e1.item1==e2.item1) return OK;else return FALSE;}/*------------------------------------------------------*/void menu(void){printf("\n\n");printf(" Menu for Linear T able On Sequence Structure \n");printf("------------------------------------------------------\n");printf(" 1. IntiaList 7. LocatElem\n");printf(" 2. DestroyList 8. PriorElem\n");printf(" 3. ClearList 9. NextElem \n");printf(" 4. ListEmpty 10. ListInsert\n");printf(" 5. ListLength 11. ListDelete\n");printf(" 6. GetElem 12. ListTrabverse\n");printf(" 0. Exit\n");printf("------------------------------------------------------\n");}/*------------------------------------------------------*/status equal(Elemtype x, Elemtype y){return (x.item1==y.item1);}void display(Elemtype e){printf("%d ",e.item1);}void Save(SqList L){FILE* fp=NULL;int i;char file1[20];do {puts("\n\t creating data file...");puts("\n please input the file name:");gets(file1);if ((fp=fopen(file1, "wb"))==NULL) {puts("\nfile cannot open!");printf("press ENTER to continue...");getchar();}} while (fp==NULL);for (i=1;i<=L.length;i++) {printf("%d",i);fwrite(&(L.elem[i]), sizeof(Elemtype), 1, fp);}puts("\nSuccessfully Saved!");printf("press ENTER to continue...");getchar();changed=0;fclose(fp);}status Load(SqList *L){FILE *fp;char file1[20];L->elem=(Elemtype*)malloc(LIST_INIT_SIZE*sizeof(Elemtype)); if (changed) {char req;puts("\nYou have not saved,save nowY/N?");req=getchar();getchar();if (req=='Y' || req=='y') Save(*L);}do {puts("\nLoading data now...");puts("\nPlease input the file name:");getchar();gets(file1);if ((fp=fopen(file1,"rb"))==NULL){puts("\nThe file cannot open!");printf("press ENTER to continue...");getchar();}} while (fp==NULL);int i=1;L->length=0;while (!feof(fp)) {if (i<=L->listsize)fread(&L->elem[i], sizeof(Elemtype), 1, fp);else {printf("Loading overflow\n");getchar();fclose(fp);return ERROR;}L->length=i++;L->length--;}printf("Loading a %d lenth List",L->length);getchar();puts("\nSuccessfully loaded");printf("press ENTER to continue...");getchar();changed=0;strcpy(file0,file1);fclose(fp);return OK;}void creat(SqList *L){int a=0;printf("Input the number of your datas?\n");scanf("%d",&a);L->elem=(Elemtype*)malloc(a*sizeof(Elemtype));L->length=a;int i;printf("Please input your data\n");for (i=1;i<=a;i++){scanf("%d",&(L->elem[i].item1));}L->listsize=LIST_INIT_SIZE;printf("You have to save your data");getchar();Save(*L);}2.6程序测试与结果采用简易界面,实验测试数据之前保存在hf0文件中,内容为:1 2 3 4 5图 2.1 下面选取几个重要功能展示:1.求表长:图 2.2 2.插入:在3号位置插入值为10的元素。