基于二叉排序树的商品信息查询算法的设计与实现.docx
- 文档编号:7258530
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:23
- 大小:111.91KB
基于二叉排序树的商品信息查询算法的设计与实现.docx
《基于二叉排序树的商品信息查询算法的设计与实现.docx》由会员分享,可在线阅读,更多相关《基于二叉排序树的商品信息查询算法的设计与实现.docx(23页珍藏版)》请在冰豆网上搜索。
基于二叉排序树的商品信息查询算法的设计与实现
河北工业大学
《数据结构》课程实验
实验报告
题目:
基于二叉排序树的商品信息查询算法的设计与实现
专业:
计算机科学与技术
班级:
姓名:
学号:
完成日期:
一、试验内容
查找是数据处理的重要操作。
请设计并实现基于二叉排序树的商品信息查询算法。
完成信息的查询、插入、删除、查询频度的统计等功能。
二、试验目的
熟练掌握顺序查找、折半查找及二叉排序树、平衡二叉树上的查找、插入和删除的方法。
三、流程图
四、源程序代码
#include
#include
#include
#include
usingnamespacestd;
structshangpin
{
intcishu,pingheng,jiage;
charmingcheng[40];
shangpin*l,*r,*p;
intshendu,quan;
};
intmax(inta,intb)
{
if(a>b)return(a);
elsereturn(b);
};
shangpin*charu(shangpin*p)
{
shangpin*p1,*l,*r;
chara[40];
intb=0;
cout<<"请输入商品名称:
"< cin>>a; err: b=strcmp(a,p->mingcheng); if(b==0){ cout<<"此商品已有。 "< return(NULL); } elseif(b==-1){ if(p->l==NULL){ p->l=newshangpin; p1=p->l; strcpy(p1->mingcheng,a); p1->cishu=0; p1->l=NULL; p1->r=NULL; p1->p=p; p1->pingheng=0; cout<<"请输入此商品的价格: "< cin>>p1->jiage; return(p->l); } else{l=p->l;p=l;gotoerr;}; } else{ if(p->r==NULL){ p->r=newshangpin; p1=p->r; strcpy(p1->mingcheng,a); p1->cishu=0; p1->r=NULL; p1->l=NULL; p1->p=p; p1->pingheng=0; cout<<"请输入此商品的价格: "< cin>>p1->jiage; return(p->r); } else{r=p->r;p=r;gotoerr;}; }; }; voidchushi(shangpin*p) { cout<<"建立初始节点: "< "< cin>>p->mingcheng; cout<<"请输入此商品价格: "< cin>>p->jiage; cout<<"请输入访问次数: "< cin>>p->cishu; p->l=NULL; p->r=NULL; p->p=NULL; p->pingheng=0; }; intchaxun(shangpin*p,chara[]) { intb; err3: b=strcmp(a,p->mingcheng); if(b==0){ cout<<"查找成功,输出有关信息: "< p->cishu=p->cishu+1; cout<<"此商品价格为: "< return (1); } elseif(b==-1){ p=p->l; if(p==NULL){ cout<<"没有此商品,查找失败! ! "< return(0); } elsegotoerr3; } else{ p=p->r; if(p==NULL){ cout<<"没有此商品,查找失败! ! "< return(0); } elsegotoerr3; } }; intshanchu(shangpin*p) { shangpin*p1; chara[40]; intb; cout<<"请输入要删除的商品的名称: "< cin>>a; err2: b=strcmp(a,p->mingcheng); if(b==0){ p1=p->p; if(p1->l==p){ if(p->l==NULL&&p->r==NULL){ p1->l=NULL; } elseif(p->l==NULL){ p1->l=p->r; } elseif(p->r==NULL){ p1->l=p->l; } else{ p1->l=p->l; p1=p->r; while(p1->r! =NULL){ p1=p1->r; }; p1->r=p->r; }; } else{ if(p->l==NULL&&p->r==NULL){ p1->r=NULL; } elseif(p->l==NULL){ p1->r=p->r; } else{ p1->r=p->l; p1=p->r; while(p1->r! =NULL){ p1=p1->r; }; p1->r=p->r; }; }; cout<<"删除成功。 "< return (1); } elseif(b==-1){ p=p->l; if(p==NULL){ cout<<"没有此商品,删除失败! ! "< return(0); } elsegotoerr2; } else{ p=p->r; if(p==NULL){ cout<<"没有此商品,删除失败! ! "< return(0); } elsegotoerr2; }; }; intbianlishendu(shangpin*p3) { inta=0; shangpin*p1,*l,*r,*p;p=p3; if(p->l==NULL&&p->r==NULL){ cout<<"只有一头节点"< return(0); }; err7: if(a==0){ if(p->l==NULL){a=1;} else{p1=p;p=p->l;a=0;gotoerr7;}; }; if(a==1){ if(p->r==NULL){a=2;} else{p1=p;p=p->r;a=0;gotoerr7;}; }; if(a==2){ p1=p;p=p->p; if(p->l==p1)a=1; if(p->r==p1)a=2; if(p1->l==NULL&&p1->r==NULL){p1->shendu=0;} elseif(p1->l==NULL){r=p1->r;p1->shendu=r->shendu+1;} elseif(p1->r==NULL){l=p1->l;p1->shendu=l->shendu+1;} else{r=p1->r;l=p1->l;p1->shendu=max(l->shendu,r->shendu)+1;} }; if(p3->r==p1&&a==2){ l=p3->l; r=p3->r; if(l! =NULL)p3->shendu=max(l->shendu,r->shendu)+1; elsep3->shendu=r->shendu+1; } elseif(p3->r==NULL&&p3->l==p1){ if(p3==p){p3->shendu=p1->shendu+1;} elsegotoerr7; } elsegotoerr7; return(0); }; shangpin*pinghenghua(shangpin*p0) { shangpin*p2,*p3,*p4,*p5,*p6,*p7,*p8; inti,j,a,yong; a=0; shangpin*pq[40],*p1,*l,*r,*p; err10: p=p0; if(p->l==NULL&&p->r==NULL){ cout<<"这里只有一个节点"< return(p0); }; for(i=0;i<40;i++){ pq[i]=NULL; }; a=0; yong=bianlishendu(p0); for(i=0;i<40;i++){ for(j=0;j if(pq[j]==p)break; }; if(j==i){pq[i]=p;} elsei=i-1; if(a==0){ if(p->l==NULL){a=1;} else{p1=p;p=p->l;a=0;continue;}; }; if(a==1){ if(p->r==NULL){a=2;} else{p1=p;p=p->r;a=0;continue;}; }; if(a==2){ p1=p;p=p1->p; if(p->l==p1){a=1;}; if(p->r==p1){a=2;}; if(p1->l==NULL&&p1->r==NULL){p1->quan=0;} elseif(p1->l==NULL){r=p1->r;p1->quan=-r->shendu-1;} elseif(p1->r==NULL){l=p1->l;p1->quan=l->shendu+1;} else{r=p1->r;l=p1->l;p1->quan=l->shendu-r->shendu;} }; if(p0->r==p1&&a==2){ l=p0->l; r=p0->r; if(l! =NULL)p0->quan=l->shendu-r->shendu; elsep0->quan=-r->shendu; gotoerr8; } elseif(p0->l==p1&&p0->r==NULL){ if(p0==p){p0->quan=p1->shendu+1;gotoerr8;} else{;}; } else{;}; }; err8: a=i; for(i=0;i<=a;i++){ if(pq[i]->quan==2){ p2=pq[i]->l; if(p2->quan==1){ if(p2! =NULL){p3=p2->l;p4=p2->r;}; p5=pq[i]->r; p6=pq[i]->p; if(p6==NULL){p2->p=NULL;} elseif(p6->l==pq[i]){p6->l=p2;p2->p=p6;} else{p6->r=p2;p2->p=p6;}; pq[i]->l=p4;if(p4! =NULL)p4->p=pq[i]; pq[i]->r=p5;if(p5! =NULL)p5->p=pq[i]; pq[i]->p=p2;if(p2! =NULL)p2->r=pq[i]; if(p2! =NULL)p2->l=p3;if(p3! =NULL)p3->p=p2; pq[i]->quan=0; pq[i]->shendu=pq[i]->shendu-2; if(p2! =NULL)p2->quan=0; p=p0; while(p->p! =NULL){ p=p->p; }; yong=bianlishendu(p); break; }; if(p2->quan==-1){ if(p2! =NULL)p3=p2->r; p4=pq[i]->p; if(p2! =NULL)p5=p2->l; if(p3! =NULL)p6=p3->l; if(p3! =NULL)p7=p3->r; p8=pq[i]->r; if(p4==NULL){p3->p=NULL;} elseif(p4->l==pq[i]){p4->l=p3;p3->p=p4;} else{p4->r=p3;p3->p=p4;}; if(p3! =NULL)p3->l=p2;if(p2! =NULL)p2->p=p3; if(p3! =NULL)p3->r=pq[i];pq[i]->p=p3; if(p2! =NULL)p2->r=p6;if(p6! =NULL)p6->p=p2; pq[i]->l=p7;if(p7! =NULL)p7->p=pq[i]; pq[i]->r=p8;if(p8! =NULL)p8->p=pq[i]; pq[i]->quan=-1; if(p2! =NULL)p2->quan=0; if(p3! =NULL)p3->quan=0; if(p8! =NULL)pq[i]->shendu=p8->shendu+1; if(p2! =NULL)p2->shendu=p2->shendu-1; if(p2! =NULL&&p3! =NULL)p3->shendu=p2->shendu+1; while(p->p! =NULL){ p=p->p; }; yong=bianlishendu(p); break; }; }; if(pq[i]->quan==-2){ p2=pq[i]->r; if(p2->quan==-1){ if(p4! =NULL){p3=p2->l;p4=p2->r;}; p5=pq[i]->l; p6=pq[i]->p; if(p6==NULL){p2->p=NULL;} elseif(p6->l==pq[i]){p6->l=p2;p2->p=p6;} else{p6->r=p2;p2->p=p6;}; pq[i]->l=p5;if(p5! =NULL)p5->p=pq[i]; pq[i]->r=p3;if(p3! =NULL)p3->p=pq[i]; pq[i]->p=p2;if(p2! =NULL)p2->l=pq[i]; pq[i]->quan=0; pq[i]->shendu=pq[i]->shendu-2; if(p2! =NULL)p2->quan=0; while(p->p! =NULL){ p=p->p; }; yong=bianlishendu(p); break; }; if(p2->quan==1){ if(p2! =NULL){p3=p2->l;p5=p2->r;}; p4=pq[i]->p; if(p4! =NULL){p6=p3->r;p7=p3->l;}; p8=pq[i]->r; if(p4==NULL){p3->p=NULL;} elseif(p4->l==pq[i]){p4->l=p3;p3->p=p4;} else{p4->r=p3;p3->p=p4;}; if(p3! =NULL)p3->r=p2;if(p2! =NULL)p2->p=p3; if(p3! =NULL)p3->l=pq[i];pq[i]->p=p3; if(p2! =NULL)p2->l=p6;if(p6! =NULL)p6->p=p2; pq[i]->l=p8;if(p8! =NULL)p8->p=pq[i]; pq[i]->r=p7;if(p7! =NULL)p7->p=pq[i]; pq[i]->quan=0; if(p2! =NULL)p2->quan=-1; if(p3! =NULL)p3->quan=0; if(p8! =NULL)pq[i]->shendu=p8->shendu+1; if(p2! =NULL)p2->shendu=p2->shendu-1; if(p3! =NULL&&p2! =NULL)p3->shendu=p2->shendu+1; while(p->p! =NULL){ p=p->p; }; yong=bianlishendu(p); break; }; }; }; for(i=0;i<=a;i++){ if(pq[i]->quan>=-1&&pq[i]->quan<=1)continue; elsebreak; }; if(i==a+1); else{gotoerr10;}; return(p); }; voidnull(shangpin*p1) { shangpin*p; p=p1; p->p=NULL; p->l=NULL; p->r=NULL; }; voidmain() { chara,b,mingcheng[40],*p1; intc,d=0,i,yong; shangpinhead,meiyou[40]; shangpin*p,*t;p=&head; err7: p1=&mingcheng[0];cout<<"初始化输入A,插入输入B,查询输入C,删除输入D,了解客户需要的新商品输入E,结束输入F."< cin>>a; if(a=='A'){ cout<<"进入初始化程序: "< chushi(p); cout<<"已生成一个头节点,是否继续插入节点Y/N"< cin>>b; if(b=='Y'){ err6: t=charu(p); cout<<"请输入访问次数: "< cin>>t->cishu; }; p=pinghenghua(p); cout<<"是否继续Y/N"< cin>>b; if(b=='Y'){ gotoerr6; } else{ cout<<"初始化结束。 "< }; }; if(a=='C'){ cout<<"进入查询程序: "< "< chara[40]; cin>>a; c=chaxun(p,a); if(c==0){ for(i=0;i yong=strcmp(meiyou[i].mingcheng,a); if(yong==0){ meiyou[i].cishu=meiyou[i].cishu+1; break; }; }; if(i==d){ strcpy(meiyou[i].mingcheng,a); meiyou[i].cishu=1;d=d+1; }; }; cout<<"*************************"< }; if(a=='D'){ cout<<"进入删除程序: "< c=shanchu(p); cout<<"*************************"< p=pinghenghua(p); }; if(a=='E'){ for(i=0;i cout<<"商品名称为: "< }; cout<<"*************************"< }; if(a=='B'){ cout<<"进入插入程序: "< t=charu(p); cout<<"*************************"< p=pinghenghua(p); }; if(a=='F'){;} elsegotoerr7; } 五、调试过程 应该划分模块,对不同的操作应用不同的函数来完成。 在调试过程中,关于平衡二叉树的那部分比较难,没能实现文件的储存和读取功能。 六、结果分析 初始化输入A,插入输入B,查询输入C,删除输入D,了解客户需要的新商品输入E,结束输 入F. ####################################### A 进入初始化程序: ************************* 建立初始节点: 请输入要查询的商品的名称: a 请输入此商品价格: 1 请输入访问次数: 1 已生成一个头节点,是否继续插入节点Y/N Y 请输入要查询的商品的名称: b 请输入此商品的价格: 2 请输入访问次数: 2 是否继续Y/N Y 请输入要查询的商品的名称: c 请输入此商品的价格: 3 请输入访问次数: 3
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 二叉排序树 商品信息 查询 算法 设计 实现