# 1实验题目与要求
【问题描述】在登录服务器系统时,都需要验证用户名和密码,如telnet远程登录服务器。用户输入用户名和密码后,服务器程序会首先验证用户信息的合法性。由于用户信息的验证频率很高,系统有必要有效地组织这些用户信息,从而快速查找和验证用户。另外,系统也会经常会添加新用户、删除老用户和更新用户密码等操作,因此,系统必须采用动态结构,在添加、删除或更新后,依然能保证验证过程的快速。请采用相应的数据结构模拟用户登录系统,其功能要求包括用户登录、用户密码更新、用户添加和用户删除等。
【基本要求】
要求自己编程实现二叉树结构及其相关功能,以存储用户信息,不允许使用标准模板类的二叉树结构和函数。同时要求根据二叉树的变化情况,进行相应的平衡操作,即AVL平衡树操作,四种平衡操作都必须考虑。测试时,各种情况都需要测试,并附上测试截图;
要求采用类的设计思路,不允许出现类以外的函数定义,但允许友元函数。主函数中只能出现类的成员函数的调用,不允许出现对其它函数的调用。
要求采用多文件方式:.h文件存储类的声明,.cpp文件存储类的实现,主函数main存储在另外一个单独的cpp文件中。如果采用类模板,则类的声明和实现都放在.h文件中。
不强制要求采用类模板,也不要求采用可视化窗口;要求源程序中有相应注释;
要求测试例子要比较详尽,各种极限情况也要考虑到,测试的输出信息要详细易懂,表明各个功能的执行正确;
【实现提示】
用户信息(即用户名和密码)可以存储在文件中,当程序启动时,从文件中读取所有的用户信息,并建立合适的查找二叉树;
验证过程时,需要根据登录的用户名,检索整个二叉树,找到匹配的用户名,进行验证;更新用户密码时,也需要检索二叉树,找到匹配项后进行更新,同时更新文件中存储的用户密码。
添加用户时,不仅需要在文件中添加,也需要在二叉树中添加相应的节点;删除用户时,也是如此;
【运行结果要求】要求能够实现用户登录验证、添加用户、删除用户和更新用户密码功能,实验报告要求有详细的功能测试截图。
验收要求:1、通过管理员权限,正向打印用户信息的平衡二叉查找树;
2、管理员在删除、插入用户信息后,需重新旋转调整AVL树,并正向打印;
3、用户只能看到自己的信息,只能更改密码。
【考核要求】要求程序能正常运行,全面完成题目要求。
【题目难度】难,成绩等级高
# 2设计思路
## 2.1系统总体设计
系统需要实现“用户登陆系统”的功能,由于线性表的时间复杂度为O(n),效率较低,不足以满足大容量高并发的需求,所以使用二叉搜索树的结构进行数据存储。由于二叉存储树可能存在不平衡的问题,影响数据结构的效率,所以我们使用Avl树进行存储。
## 2.2系统功能设计
![](https://www.writebug.com/myres/static/uploads/2021/10/31/355dd45e358be610d2eed680362d60d2.writebug)
### 2.2.1用户登陆验证功能
用户输入用户名和密码,系统会在数据库中查找该用户。如果用户不存在或者密码错误,发出相应的提示,否则根据用户所属的类型(管理员/普通用户),完成登陆
### 2.2.2添加用户功能
管理员用户有权限添加用户,输入要添加的用户名和密码,如果在数据库中存在同名用户,提示添加失败,否则将用户信息存放到数据库里
### 2.2.3显示用户功能
管理员用户有权限显示用户,使用打印命令,可以正向打印出Avl树中存储的用户信息。
### 2.2.4删除用户功能
管理员用户有权限删除用户,输入要删除的用户名称,如果数据库中存在该用户,就将其删除,否则提示错误。
### 2.2.5修改密码功能
普通用户可以更改自己的密码
## 2.3类的设计
![](https://www.writebug.com/myres/static/uploads/2021/10/31/e5c3a2d3704752f2bf181f40ce332c08.writebug)
### 2.3.1AvlTree类
AvlTree类定义了一棵Avl树,包含了Node节点和ShadowTreeNode节点,包含了用影子树正向打印树,旋转节点,添加节点等功能。
#### 2.3.1.1Save函数
![](https://www.writebug.com/myres/static/uploads/2021/10/31/9d10ebc6840fa5b5cac2bcd9d7280a2f.writebug)
在 save 函数中,我们使用了 fstream 对象来进行文件的输出,使用了中序遍历的方法,先保存中间节点的内容,然后递归保存左右子树。使用中序遍历而非其他遍历的好处是,在读取文件重新构建树的时候,前序遍历保存的文件可以避免树的旋转。
#### 2.3.1.2AddNode函数
![](https://www.writebug.com/myres/static/uploads/2021/10/31/47bbd72b4e05cd580b736ffb04a2419f.writebug)
在插入新的节点时,我们需要一层一层向下寻找插入点,进行插入。完成插入后,如果树失衡了,要使用 [Spin ](#_Spin函数)函数进行调整。
#### 2.3.1.3Remove函数
![](https://www.writebug.com/myres/static/uploads/2021/10/31/3eb4ab3a64ea316ce2157dd983659a8b.writebug)![](https://www.writebug.com/myres/static/uploads/2021/10/31/116a5864b12c66082e631211f099d9f6.writebug)![](https://www.writebug.com/myres/static/uploads/2021/10/31/4a54bf7ef52e15cf05defa9c5f256c61.writebug)
在执行删除操作的时候,我们也一层一层向下找,找到那个要被删除的节点。然后,视情况, 在左子树或右子树找到最大或最小的节点,将其移到根节点的位置,再将原来的节点删除, 即实现了删除特定节点的功能。完成删除后,如果树发生了失衡,要调用 [Spin ](#_Spin函数)函数进行调整
#### 2.3.1.4Print函数
![](https://www.writebug.com/myres/static/uploads/2021/10/31/d75364aefd0e375391c4fec35b8d6284.writebug)![](https://www.writebug.com/myres/static/uploads/2021/10/31/00a4dd199ad75f8dde9f599a48aad048.writebug)
Print 函数使用了影子树实现 Avl 树的正向打印。影子树是通过保存树中每一个节点的横纵坐标信息,来正向打印二叉树的一种数据结构。通过影子树打印,可以获取更好的打印效果。
#### 2.3.1.5Spin函数
LeftSpin 函数和 RightSpin 函数互成镜像,所以我只介绍右旋。
![](https://www.writebug.com/myres/static/uploads/2021/10/31/31c3ff43ac6bfbe74fcce29740104c91.writebug)
看这棵树,它原本是平衡的。由于节点 25 插入,这棵树变的不平衡。25 被插在 35 节点左子树的左子树上,所以我们只需要进行一次右旋操作。
![](https://www.writebug.com/myres/static/uploads/2021/10/31/c66e37f14a0bfece6a69a300f0cc1f6f.writebug)
首先,使用 left 指针指向左节点,即 30
![](https://www.writebug.com/myres/static/uploads/2021/10/31/11e393de85e4a62d6da074c6b53d394e.writebug)
将根节点的左指针指向 30 节点的 right。可以看到,尽管 30 节点对应的右指针是 nullptr, 我在这里将其画出,所得结构显得清晰。
![](https://www.writebug.com/myres/static/uploads/2021/10/31/87be5b47607f940aa3bd7341a8061798.writebug)
将 left 节点的右指针指向 root
![](https://www.writebug.com/myres/static/uploads/2021/10/31/7f2cedeccef438cf9c47ef16fef919a4.writebug)
返回左节点的指针,让上层节点对应的指针指向前面提到的 left 节点
![](https://www.writebug.com/myres/static/uploads/2021/10/31/92e5a57328f75dbd665b16c45c3be30b.writebug)
整理树的结构,删除已经消失的指针的之前加上的nullptr
![](https://www.writebug.com/myres/static/uploads/2021/10/31/9c1b38e5dcf638c1a0713e0118e60c99.wri
没有合适的资源?快使用搜索试试~ 我知道了~
基于C语言实现的登陆验证【100013034】
共63个文件
jpg:32个
png:12个
vsdx:4个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 166 浏览量
2023-07-24
15:07:39
上传
评论
收藏 5.77MB ZIP 举报
温馨提示
在登录服务器系统时,都需要验证用户名和密码,如telnet远程登录服务器。用户输入用户名和密码后,服务器程序会首先验证用户信息的合法性。由于用户信息的验证频率很高,系统有必要有效地组织这些用户信息,从而快速查找和验证用户。另外,系统也会经常会添加新用户、删除老用户和更新用户密码等操作,因此,系统必须采用动态结构,在添加、删除或更新后,依然能保证验证过程的快速。
资源推荐
资源详情
资源评论
收起资源包目录
100013034-基于C语言实现的登陆验证.zip (63个子文件)
cyanzhengmaster
数据结构课程设计报告.pdf 1.57MB
CMakeLists.txt 242B
AvlTree.cpp 10KB
cmake-build-debug
database.dat 33B
LICENSE 1KB
ShadowTreeNodeQueue.h 577B
Node.h 1KB
数据结构课程设计报告.docx 2.02MB
main.cpp 5KB
ShadowTreeNode.h 391B
AvlTree.h 2KB
ShadowTreeNodeQueue.cpp 229B
visio
主程序.vsdx 34KB
类的结构.vsdx 25KB
二叉树.vsdx 34KB
系统功能设计.vsdx 27KB
README.assets
wps65B3.tmp.jpg 24KB
wps6567.tmp.png 683KB
wps65B8.tmp.jpg 88KB
wps65B5.tmp.jpg 29KB
wps65B6.tmp.jpg 22KB
wps65B9.tmp.jpg 108KB
wps6566.tmp.png 425KB
wps6579.tmp.jpg 70KB
wps657E.tmp.jpg 50KB
wps6565.tmp.png 842KB
wps6581.tmp.png 763KB
wps65B4.tmp.jpg 18KB
wps6580.tmp.png 763KB
wps65BE.tmp.jpg 93KB
wps65A1.tmp.jpg 8KB
wps6599.tmp.jpg 16KB
wps657F.tmp.png 763KB
wps6582.tmp.png 763KB
wps6583.tmp.png 763KB
wps65BA.tmp.jpg 35KB
wps65B1.tmp.jpg 43KB
wps6595.tmp.png 763KB
wps659A.tmp.jpg 21KB
wps65B7.tmp.jpg 93KB
wps657C.tmp.jpg 58KB
wps6594.tmp.png 918KB
wps659E.tmp.jpg 14KB
wps65BD.tmp.jpg 105KB
wps657B.tmp.jpg 137KB
wps659B.tmp.jpg 29KB
wps65BB.tmp.jpg 88KB
wps6598.tmp.jpg 30KB
wps659D.tmp.jpg 30KB
wps65BC.tmp.jpg 108KB
wps657A.tmp.jpg 156KB
wps6597.tmp.jpg 72KB
wps65B2.tmp.jpg 21KB
wps657D.tmp.png 763KB
wps6596.tmp.png 2.13MB
wps659C.tmp.jpg 33KB
wps65A0.tmp.jpg 45KB
wps659F.tmp.jpg 27KB
wps6568.tmp.jpg 168KB
wps6578.tmp.jpg 87KB
Node.cpp 231B
.gitignore 270B
README.md 17KB
共 63 条
- 1
资源评论
神仙别闹
- 粉丝: 2704
- 资源: 7645
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功