数据结构大型实验报告.docx

上传人:b****1 文档编号:463893 上传时间:2022-10-10 格式:DOCX 页数:15 大小:243.71KB
下载 相关 举报
数据结构大型实验报告.docx_第1页
第1页 / 共15页
数据结构大型实验报告.docx_第2页
第2页 / 共15页
数据结构大型实验报告.docx_第3页
第3页 / 共15页
数据结构大型实验报告.docx_第4页
第4页 / 共15页
数据结构大型实验报告.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

数据结构大型实验报告.docx

《数据结构大型实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构大型实验报告.docx(15页珍藏版)》请在冰豆网上搜索。

数据结构大型实验报告.docx

数据结构大型实验报告

(此文档为word格式,下载后您可任意编辑修改!

2014年6月13日

目录

一.实验内容3

1.1.实验目的..........................................................3

1.2实验的数据结构及流程..............................................3

二实验验证分析.......................................................................7

2.1LL型调整验证.....................................................7

2.2RR型调整验证.....................................................8

2.3LR型调整验证.....................................................9

2.4RL型调整验证.................................................10

三、调试分析.......................................................................11

3.1技术难点及解决方案......................................................................................11

3.2印象深刻的调试错误及解决方法.................................11

四、测试结果12

4.1用户登录...................................................................................................................12

4.2用户注册...................................................................................................................16

4.3删除用户...................................................................................................................19

4.4极端数据的测试.......................................................................................................21

五、实验总结22

一实验内容

1.1.实验目的

这次实验是让我们模拟用户登录系统。

由于用户信息的验证频率很高,系统必须有效地组织这些用户信息,从而快速查找和验证用户。

另外,系统也会经常添加新用户、删除老用户和更新用户密码等操作,因此,系统必须采用动态结构,在添加、删除或更新后,依然能保证验证过程的快捷。

1.2实验的数据结构及流程

1.2.1数据结构

系统用到了两个类AVLNode和AVLTree,其中AVLTree的唯一一个数据成员就是指向AVLNode结点的指针。

1.2.2流程图

YN

Y

1.2.3函数间的调用关系

main函数调用类的成员函数。

插入新结点时,AVLInsert要根据平衡因子调用4个调整函数LL_Rotate、RR_Rotate、LR_Rotate和RL_Rotate函数。

关键代码:

if(a->bf==2)

{

b=a->lchild;

if(b->bf==1)

{

p=LL_Rotate(a);

}

else

{

p=LR_Rotate(a);

}

}

else此时a->bf的值应为-2

{

b=a->rchild;

if(b->bf==1)

{

p=RL_Rotate(a);

}

else

{

p=RR_Rotate(a);

}

}

二实验验证分析

将用户信息存储在文件中,程序运行时从文件中读取,并建立适的二叉树。

注意:

文件中每行输入三个字符,第一个字符为用户名,第二个字符为空格,第三个字符为密码。

2.1LL型调整验证

在文件user.txt输入如下:

运行程序,并选择4打印AVLTree,结果如下图:

2.2RR型调整

在文件user.txt输入如下:

运行程序,并选择4打印AVLTree,结果如下图:

2.3RL型调整

在文件user.txt输入如下:

运行程序,并选择4打印AVLTree,结果如下图:

2.4LR型调整

在文件user.txt输入如下:

运行程序,并选择4打印AVLTree,结果如下图:

3.调试分析

3.1技术难点及解决方案

3.1.1插入新结点后如果二叉树失去平衡,如何找到最小不

平衡子树?

在寻找新结点的插入位置时,始终令指针a指向离插入结点最近的且平衡因子不为0的结点,同时令指针f指向结点*a的父结点,如这样的结点不存在,则指针a指向根结点。

由此可知,当插入新结点后如果二叉树失去平衡时,指针a所指向的结点就是最小不平衡子树的根。

3.1.2新结点插入时,需修改哪些相关结点的平衡因子?

如何修改?

失去平衡的最小子树的根节点*a在插入新结点*s之前,平衡因子必然不为0,必然是离插入结点最近的且平衡因子不为0的结点。

插入新结点后,需修改从结点*a到新结点路径上个结点的平衡因子。

只需从*a的子结点*b开始,顺序扫描该路径上结点*p,若结点*s插入在*p的左子树上,*p的平衡因子由0变为1;否则新结点插入在*p的右子树上,*p的平衡因子由0变为-1.

3.1.3如何判断以*a为根的子树是否失去平衡?

当结点*a的平衡因子为1(或-1)时,若新结点插入在结点*a的右(或左)子树中,左右子树等高,结点*a的平衡因子为0,则以*a为根的子树没有失去平衡;新结点插入在结点*a的左(或右)子树中,则以*a为根的子树失去平衡,因对以*a为根的最小不平衡子树进行平衡化调整。

3.1.4失去平衡后,如何确定旋转类型并作出相应的调整?

当结点*a的平衡因子为2时,若*a的左孩子*b的平衡因子为1,表示新结点插入到结点*b的左子树中,应采用LL型调整,否则结点*b的平衡因子为-1,表示新结点插入到结点*b的右子树中,应采用LR型调整;当结点*a的平衡因子为-2时,若*a的左孩子*b的平衡因子为1,表示新结点插入到结点*b的左子树中,应采用RL型调整,否则结点*b的平衡因子为-1,表示新结点插入到结点*b的右子树中,应采用RR型调整;

3.2印象深刻的调试错误及解决方法

由于该项目需要建3个文件,类的声明放在AVLTree.h文件中,类的实现放在AVLTree.cpp文件中,main函数单独放在test.cpp文件中,其中在AVLTree.cpp文件中应使用#include"AVLTree.h"导入

类的声明文件,而test.cpp只需使用#include"AVLTree.h"导入类的声明文件即可,而我当时错误的test.cpp使用#include"AVLTree.cpp"导入了类的实现文件,所以一直报错。

我在它报错的位置查了很多次都没发现bug,最后在老师的帮助下才发现了问题所在。

我在插入新结点时,也一直报错,最后才发现在AVLNode的构造方法中并没把成员变量bf初始化为0,而插入新结点是需要根据bf的值做相应调整,所以一直报错。

虽然这些都是小Bug,却花了我大量的时间查找错误。

四测试结果

下面进行的测试,文件user.txt存储的初始数据为:

4.1用户登录

运行程序,并按提示先选择4,打印出AVL树(这样做是方便登录),选择1,进入登录界面,按提示分别输入用户名和密码,输入正确后,截图如下

接着选择是否更新密码(只能输入Y或N),当输入Y并输入重置密码后,截图如下

这时,重新打开文件user.txt,会发现用户信息发生了更新:

错误输入:

当输入的不是Y或N时,会输出“您的选择有错”

4.2用户注册

运行程序,并按提示先选择4,打印出AVL树(这样做是方便登录),选择2进图注册界面,按提示分别输入要注册的用户名和密码,输入正确后,如果输入的用户名不存在,注册成功,并更新文件user.txt,

否则注册失败。

用户名已存在时:

用户名不存在时

这时,文件user.txt中的信息为:

4.3删除用户

运行程序,并按提示先选择4,打印出AVL树(这样做是方便登录),选择2进图删除界面,按提示分别输入要注册的用户名,如果输入的用户名不存在,提示“您要删除的用户不存在!

”;否则,删除成功,并更新文件user.txt,

4.4极端数据的测试

在user.txt中重新输入以下信息:

运行程序,并按4打印AVL树,得到结果为:

5.实验总结

通过两到三周的编写,我们终于用户登录系统。

对于这次实验,心里还是蛮有信心的,前期花了大量的时间在类AVLtree的实现上,中间也遇到了各种各样的bug,但经过自己的努力和老师的帮助还是完成了。

最后再具体完成各功能时就显的很容易了。

在解决问题的过程中,充分体会到了数据结构这门课对于软件设计的重要性,也认识到了程序=数据结构+算法这句话的真正含义,以后我们一定会更加努力的学习数据结构和算法!

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1