利用AVL高度平衡的二叉树实现登录系统Word文档下载推荐.docx

上传人:b****1 文档编号:4861414 上传时间:2023-05-04 格式:DOCX 页数:51 大小:23.21KB
下载 相关 举报
利用AVL高度平衡的二叉树实现登录系统Word文档下载推荐.docx_第1页
第1页 / 共51页
利用AVL高度平衡的二叉树实现登录系统Word文档下载推荐.docx_第2页
第2页 / 共51页
利用AVL高度平衡的二叉树实现登录系统Word文档下载推荐.docx_第3页
第3页 / 共51页
利用AVL高度平衡的二叉树实现登录系统Word文档下载推荐.docx_第4页
第4页 / 共51页
利用AVL高度平衡的二叉树实现登录系统Word文档下载推荐.docx_第5页
第5页 / 共51页
利用AVL高度平衡的二叉树实现登录系统Word文档下载推荐.docx_第6页
第6页 / 共51页
利用AVL高度平衡的二叉树实现登录系统Word文档下载推荐.docx_第7页
第7页 / 共51页
利用AVL高度平衡的二叉树实现登录系统Word文档下载推荐.docx_第8页
第8页 / 共51页
利用AVL高度平衡的二叉树实现登录系统Word文档下载推荐.docx_第9页
第9页 / 共51页
利用AVL高度平衡的二叉树实现登录系统Word文档下载推荐.docx_第10页
第10页 / 共51页
利用AVL高度平衡的二叉树实现登录系统Word文档下载推荐.docx_第11页
第11页 / 共51页
利用AVL高度平衡的二叉树实现登录系统Word文档下载推荐.docx_第12页
第12页 / 共51页
利用AVL高度平衡的二叉树实现登录系统Word文档下载推荐.docx_第13页
第13页 / 共51页
利用AVL高度平衡的二叉树实现登录系统Word文档下载推荐.docx_第14页
第14页 / 共51页
利用AVL高度平衡的二叉树实现登录系统Word文档下载推荐.docx_第15页
第15页 / 共51页
利用AVL高度平衡的二叉树实现登录系统Word文档下载推荐.docx_第16页
第16页 / 共51页
利用AVL高度平衡的二叉树实现登录系统Word文档下载推荐.docx_第17页
第17页 / 共51页
利用AVL高度平衡的二叉树实现登录系统Word文档下载推荐.docx_第18页
第18页 / 共51页
利用AVL高度平衡的二叉树实现登录系统Word文档下载推荐.docx_第19页
第19页 / 共51页
利用AVL高度平衡的二叉树实现登录系统Word文档下载推荐.docx_第20页
第20页 / 共51页
亲,该文档总共51页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

利用AVL高度平衡的二叉树实现登录系统Word文档下载推荐.docx

《利用AVL高度平衡的二叉树实现登录系统Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《利用AVL高度平衡的二叉树实现登录系统Word文档下载推荐.docx(51页珍藏版)》请在冰点文库上搜索。

利用AVL高度平衡的二叉树实现登录系统Word文档下载推荐.docx

<

endl;

"

*******************************欢迎进入登录系统*********************************"

========================================================"

***********1.用户登录*********"

***********2.用户注册*********"

***********0.结束*********"

***********请选择:

*********"

}

/*==========================================操作界面========================================================*/

Menu_Operator()

************1.修改密码**********"

************2.删除用户**********"

************0.返回上层**********"

************请选择**********"

/*==========================================结束界面=======================================================*/

Menu_Quit()

********************************************************"

****************感使用****************"

用户类.h

#ifndefUSER

#defineUSER

#include"

Stack.h"

#include<

string>

classUser//用户类;

User();

//默认构造函数;

~User();

//析构函数;

boolempty();

//判空函数;

voidEdit();

//密码修改函数;

voidremove();

//用户删除函数;

voidsearch(stringname,stringpaw,bool&

found,bool&

found1);

//查找函数,登录操作的辅助函数;

voidinsert(stringname,stringpaw);

//插入函数,注册操作的辅助函数;

boolsearch3(stringname);

//查找函数,注册操作的辅助函数;

voidgraph(ostream&

out)const;

//图形输出函数;

用于测试AVL的结构;

voidSave_User();

//保存函数,将用户信息保存到文件里;

private:

classUserNode//用户节点类;

{

public:

stringusername;

//用户名;

stringpassword;

//密码;

intbalanceFactor;

//AVL结构中的平衡因子;

UserNode*left;

//指向左节点的指针;

UserNode*right;

//指向右节点的指针;

UserNode()//默认构造函数;

{

balanceFactor=0;

//平衡因子的值为0;

left=0;

//左指针为0;

right=0;

//右指针为0;

}

UserNode(stringname,stringpaw)//显示构造函数,定义参数name和paw;

password=paw;

//密码的值为paw;

username=name;

//用户名为name;

};

typedefUserNode*UserNodePointer;

Stack<

UserNodePointer>

path;

//定义一个Stack类型的变量,用于存储插入路径上的节点;

p;

//定义一个Stack类型的变量,保存文件需要;

UserNodePointermyRoot;

voidsearch2(stringname,bool&

found,UserNodePointer&

locptr,UserNodePointer&

parent);

//删除操作的辅助函数;

voidgraphAux(ostream&

out,intindent,UserNodePointersubtreeRoot)const;

//图形输出函数的辅助函数;

voidrelease(UserNodePointersubtreeRoot);

//析构函数的辅助函数;

voidSave(UserNodePointersubtreeRoot);

//保存函数的辅助函数;

voidRotation(intnewBF,UserNodePointerroot);

//旋转函数,用于调整二叉树的结构;

/*=============================右旋函数以及其定义========================================================*/

UserNodePointerR_rotation(UserNodePointerroot)

UserNodePointernewRoot=root->

left;

//将newRoot(新的旋转根)设为原旋转根的左孩子;

root->

left=newRoot->

right;

//原旋转根的左指针指向新旋转根的右节点(可以为0);

newRoot->

right=root;

//新的旋转根的右指针指向原旋转根;

if(newRoot->

balanceFactor==1)//如果原旋转根的左孩子的平衡因子为1;

root->

balanceFactor=0;

//旋转后原旋转根的平衡因子为0;

newRoot->

//新的旋转根(即原旋转根的左孩子)的平衡因子也为0;

else//其他情况,即原旋转根的左孩子的平衡因子为0;

{//此种情况只有在删除时才会出现;

balanceFactor=1;

//旋转后原旋转根的平衡因子为1;

balanceFactor=-1;

//新的旋转根的平衡因子为-1;

returnnewRoot;

//返回新的旋转根;

}

/*=============================左旋函数以及其定义========================================================*/

UserNodePointerL_rotation(UserNodePointerroot)

//左旋函数的操作刚好和右旋操作相反;

//将newRoot(新的旋转根)设为原旋转根的右孩子;

right=newRoot->

//原旋转根的右指针指向新旋转根的左节点(可以为0);

left=root;

//新的旋转根的左指针指向原旋转根;

balanceFactor==-1)//如果原旋转根的右孩子的平衡因子为-1

//新的旋转根(即原旋转根的右孩子)的平衡因子也为0;

else//其他情况,即原旋转根的右孩子的平衡因子为0;

//旋转后原旋转根的平衡因子为-1;

//新的旋转根的平衡因子为1;

/*=============================右左旋函数以及其定义=====================================================*/

UserNodePointerRL_rotation(UserNodePointerroot)

UserNodePointerptr=root->

//定义辅助指针,指向原旋转根的右孩子;

UserNodePointernewRoot=ptr->

//将新的旋转根设为旋转根的右孩子的左孩子;

//原旋转根的右指针指向新旋转根的左孩子;

ptr->

//原旋转根的右孩子的的左指针指向新旋转根的右孩子;

right=ptr;

//新的旋转根的右指针指向原旋转根的右孩子;

switch(newRoot->

balanceFactor)//右左旋操作有三种情况;

case0:

//情况1:

新节点插入之前,原旋转根的右孩子没有左孩子,新插入的节点成为其左孩子;

ptr->

//原旋转根的右孩子的平衡因子为0;

break;

case1:

//情况2:

新节点插入之前,原旋转根的右孩子有左孩子C,新节点被插入到C的右子树中;

//原旋转根的右孩子的平衡因子为-1;

case-1:

//情况3:

新节点插入之前,原旋转根的右孩子有左孩子C,新节点被插入到C的左子树中;

//新旋转根的平衡因子为0;

/*=============================左右旋函数以及其定义=====================================================*/

UserNodePointerLR_rotation(UserNodePointerroot)//左右旋操作与右左旋操作刚好相反;

//定义辅助指针,指向原旋转根的左孩子;

//将新的旋转根设为旋转根的左孩子的右孩子;

//原旋转根的左指针指向新旋转根的右孩子;

//原旋转根的左孩子的的右指针指向新旋转根的左孩子;

left=ptr;

//新的旋转根的左指针指向原旋转根的左孩子;

balanceFactor)//左右旋操作有三种情况;

新节点插入之前,原旋转根的左孩子没有右孩子,新插入的节点成为其右孩子;

//原旋转根的左孩子的平衡因子为0;

case1:

新节点插入之前,原旋转根的左孩子有右孩子C,新节点被插入到C的左子树中;

新节点插入之前,原旋转根的左孩子有右孩子C,新节点被插入到C的右子树中;

//原旋转根的左孩子的平衡因子为1;

 

//用户类cpp

User.h"

fstream>

iomanip>

/*=======================================构造函数的定义============================================================================*/

User:

User()

myRoot=0;

/*======================================析构函数的定义=============================================================================*/

~User()

release(myRoot);

//调用析构的辅助函数release;

/*=====================================判空函数的定义==============================================================================*/

boolUser:

empty()

returnmyRoot==0;

//返回myRoot等于0;

/*=====================================析构函数的辅助函数的定义====================================================================*/

voidUser:

release(UserNodePointersubtreeRoot)

if(subtreeRoot!

=0)

release(subtreeRoot->

left);

//采用后序遍历实现析构;

right);

deletesubtreeRoot;

/*=====================================查找函数(注册操作的辅助函数)的定义========================================================*/

search3(stringname)

UserNodePointerlocptr=myRoot;

//定义辅助指针指向根节点;

boolfound=true;

//定义bool类型的变量found为true;

while(found==true&

&

locptr!

=0)//当found为true且辅助指针不等于0时;

if(name<

locptr->

username)//如果name小于当前节点的用户名;

locptr=locptr->

//下降到左子树;

elseif(name>

username)//如果name大于当前节点的用户名;

//下降到右子树;

else

found=false;

//若相等,则found为false,循环结束;

returnfound;

//返回found;

/*=====================================BST图形输出函数的定义=======================================================================*/

graph(ostream&

out)const

graphAux(out,0,myRoot);

/*=====================================保存操作的辅助函数的定义===================================================================*/

Save(UserNodePointersubtreeRoot)

=0)//用递归的方法;

p.push(subtreeRoot);

//将二叉树中的所有元素压入栈中;

Save(subtreeRoot->

/*=====================================保存函数的定义============================================================================*/

Save_User()

ofstreamoutfile("

user.txt"

ios:

out);

if(!

outfile)

cerr<

openerror!

exit

(1);

Save(myRoot);

while(!

p.empty())

UserNodePointerlocptr=p.top();

//一边出栈,一边将出来的元素读到文件中;

outfile<

username<

"

password<

p.pop();

outfile.close();

/*=====================================graph的辅助函数的定义=======================================================================*/

graphAux(ostream&

out,intindent,UserNodePointersubtreeRoot)const

graphAux(out,indent

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

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2