收藏 分享(赏)

基于二叉排序树的商品信息查询算法的设计与实现(算法参考书籍).doc

上传人:scg750829 文档编号:9215253 上传时间:2019-07-29 格式:DOC 页数:17 大小:415.22KB
下载 相关 举报
基于二叉排序树的商品信息查询算法的设计与实现(算法参考书籍).doc_第1页
第1页 / 共17页
基于二叉排序树的商品信息查询算法的设计与实现(算法参考书籍).doc_第2页
第2页 / 共17页
基于二叉排序树的商品信息查询算法的设计与实现(算法参考书籍).doc_第3页
第3页 / 共17页
基于二叉排序树的商品信息查询算法的设计与实现(算法参考书籍).doc_第4页
第4页 / 共17页
基于二叉排序树的商品信息查询算法的设计与实现(算法参考书籍).doc_第5页
第5页 / 共17页
点击查看更多>>
资源描述

1、基于二叉排序树的商品信息查询算法的设计与实现问题描述查找是数据处理的重要操作。请设计并实现基于二叉排序树的商品信息查询算法。完成信息的查询、插入、删除、查询频度的统计等功能。4、基本要求(1)以链表作为存储结构,设计并实现基于二叉排序树的商品信息查询算法。(2)根据二叉排序树的动态变化,进行二叉树的平衡化处理。(3)实现信息的查询、插入、删除、查询频度的统计等功能。5、测试数据随机生成。6、实现提示(1)初始化:以商品名称为关键字,建立二叉排序树。(2)用户输入查询商品名称,在二叉排序树上查找,若找到,则显示商品的相关信息,并在相应的表上的相关字段上增加该商品查找次数。若未找到,则显示未找到信

2、息给用户,并在相应的表上的相关字段上增加该商品查找次数。(3)根据商品的查找次数,形成商场的经营决策信息,反馈给决策者。(4)进行二叉树的平衡化处理,提高查找效率。#include#include#include#define LH +1 / 左高 #define EH 0 / 等高 #define RH -1 / 右高 #define LNAME 5 /商品名称长度#define BUYM 3 /用户查询次数超过这个值后会提醒商家多进货#define BUYI 2 /用户查询次数超过这个值后会提醒商家进货typedef struct goodstruct good* lchild;char

3、itemLNAME;int count;int bf;struct good* rchild;*BSTree;typedef struct tempgchar itemLNAME;int count;struct tempg *next;struct tempg *headt;BSTree dt;struct tempg *tnow=NULL;struct tempg *tg;int Init();int InitTree(BSTree *DT) ;void DestroyTree(BSTree *DT) ;int InsertAVL(BSTree *T,char *e,int *taller

4、,int x);void LeftBalance(BSTree *T);void RightBalance(BSTree * T);void L_Rotate(BSTree *p);void R_Rotate(BSTree *p);int CharInput(char *a);int Compare(char *a,char *b);void print(char *a);int Input();int SearchTemp(char *e);void TempSearch();int Insertbytemp(char *a);BSTree GoodSearch(BSTree T,char

5、*e);void Travelprint(BSTree DT,void(*Visit)(char *a);void RightProcess(BSTree *p,int *taller);void LeftProcess(BSTree *p,int *taller);int DeleteAVL(BSTree *p,char *e,int *taller);void Delete2(BSTree q,BSTree *r,int *taller);int Insertchar(char *a,char *b);int main()headt=(struct tempg*)malloc(sizeof

6、(struct tempg);headt-next=NULL;Init();Input();DestroyTree(return 1;int InitTree(BSTree *DT) *DT=NULL;return 1;void DestroyTree(BSTree *DT) if(*DT) / 非空树 if(*DT)-lchild) / 有左孩子 DestroyTree( / 销毁左孩子子树 if(*DT)-rchild) / 有右孩子 DestroyTree( / 销毁右孩子子树 free(*DT); / 释放根结点 *DT=NULL; / 空指针赋 0 int Init()int k;i

7、nt state;InitTree(printf(“初始化超市, 开始录入商品,请您输入商品名字,结束请输入 end:n“);while(1)char tempLNAME;CharInput(temp);if(temp0=ereturn 1;state=InsertAVL(if(state=1)printf(“录入成功!n“);Travelprint(dt,print);printf(“n“);else if(state=0)printf(“已有此商品,请重新录入n“);int InsertAVL(BSTree *T,char *e,int *taller,int x)if(!*T)*T=(B

8、STree)malloc(sizeof(struct good);Insertchar(*T)-item,e);/字符串赋值函数(*T)-lchild=(*T)-rchild=NULL;(*T)-bf=EH;(*T)-count=x;*taller=1;elseif(Compare(e,(*T)-item)=0)*taller=0;return 0;else if(Compare(e,(*T)-item)=-1)if(!InsertAVL(if(*taller) switch(*T)-bf)case LH:LeftBalance(T);*taller=0;break;case EH:(*T)-

9、bf=LH;*taller=1;break;case RH:(*T)-bf=EH;*taller=0;elseif(!InsertAVL(if(*taller)switch(*T)-bf)case LH:(*T)-bf=EH;*taller=0;break;case EH:(*T)-bf=RH;*taller=1;break;case RH:RightBalance(T);*taller=0;return 1;void LeftBalance(BSTree *T)BSTree lc,rd;lc=(*T)-lchild; / lc 指向*T 的左子树根结点 switch(lc-bf) / 检查*

10、T 的左子树的平衡度,并作相应平衡处理 case LH: / 新结点插入在*T 的左孩子的左子树上,要作单右旋处理 (*T)-bf=lc-bf=EH;R_Rotate(T);break;case RH: / 新结点插入在*T 的左孩子的右子树上,要作双旋处理 rd=lc-rchild; / rd 指向*T 的左孩子的右子树根 switch(rd-bf) / 修改*T 及其左孩子的平衡因子 case LH:(*T)-bf=RH;lc-bf=EH;break;case EH: (*T)-bf=lc-bf=EH;break;case RH:(*T)-bf=EH;lc-bf=LH;rd-bf=EH;L

11、_Rotate( / 对*T 的左子树作左旋平衡处理 R_Rotate(T); / 对*T 作右旋平衡处理 void RightBalance(BSTree *T)BSTree rc,rd;rc=(*T)-rchild; / rc 指向*T 的右子树根结点 switch(rc-bf) / 检查*T 的右子树的平衡度,并作相应平衡处理 case RH: / 新结点插入在*T 的右孩子的右子树上,要作单左旋处理 (*T)-bf=rc-bf=EH;L_Rotate(T);break;case LH: / 新结点插入在*T 的右孩子的左子树上,要作双旋处理 rd=rc-lchild; / rd 指向*

12、T 的右孩子的左子树根 switch(rd-bf) / 修改*T 及其右孩子的平衡因子 case RH: (*T)-bf=LH;rc-bf=EH;break;case EH: (*T)-bf=rc-bf=EH;break;case LH: (*T)-bf=EH;rc-bf=RH;rd-bf=EH;R_Rotate( / 对*T 的右子树作右旋平衡处理 L_Rotate(T); / 对*T 作左旋平衡处理 void L_Rotate(BSTree *p)BSTree rc;rc=(*p)-rchild; / rc 指向 p 的右子树根结点 (*p)-rchild=rc-lchild; / rc

13、的左子树挂接为 p 的右子树 rc-lchild=*p;*p=rc; / p 指向新的根结点 void R_Rotate(BSTree *p)BSTree lc;lc=(*p)-lchild; / lc 指向 p 的左子树根结点 (*p)-lchild=lc-rchild; / lc 的右子树挂接为 p 的左子树 lc-rchild=*p;*p=lc; / p 指向新的根结点 int Insertchar(char *a,char *b)int i;for(i=0;ibi)return 1;else if(aiitem);printf(“查询次数:%dn“,p-count);break;els

14、e/TempSearch();printf(“对不起,没有您要查询的商品!n“);break;case 2:printf(“请输入你想要增加的商品的名称:n“);CharInput(temp);x=Insertbytemp(temp);state=InsertAVL(if(state=1)printf(“增加成功!库中商品有:n“);Travelprint(dt,print);break;else if(state=0)printf(“库中已有此商品!n“);break;case 3:printf(“请输入你想要删除的商品的名称:n“);CharInput(temp);k=0;state=De

15、leteAVL(if(state=0)printf(“对不起,没有找到您要删除的商品,请核对 n!“);break;elseprintf(“删除成功!库中剩余商品为:“);Travelprint(dt,print);break;case 4:printf(“谢谢使用!“);return 1;default:printf(“错误输入!程序结束!“);return 1;int Insertbytemp(char *a)struct tempg *tx;tx=headt;tg=headt-next;while(tg!=NULL)if(Compare(tg-item,a)=0)tx-next=tg-n

16、ext;if(tnow=tg)tnow=tx;return (tg-count);tx=tg;tg=tg-next;return 0;int SearchTemp(char *e)if(tnow=NULL)tnow=(struct tempg*)malloc(sizeof(struct tempg);headt-next=tnow;elsetg=headt-next;while(tg!=NULL)if(Compare(tg-item,e)=0)tg-count+;if(tg-count=BUYI)printf(“n(to boss:这种商品市场前景好,可采购!)“);return 1;tg=t

17、g-next;tg=(struct tempg*)malloc(sizeof(struct tempg);tnow-next=tg;tnow=tg;tnow-next=NULL;tnow-count=1;Insertchar(tnow-item,e);return 1;BSTree GoodSearch(BSTree T,char *e)if(!T)SearchTemp(e);return T;else if(Compare(e,T-item)=0) T-count+;if(T-count=BUYM)printf(“n(to boss:这种商品销量好,可多采购!)n“);return T;el

18、se if(Compare(e,T-item)=-1)return GoodSearch(T-lchild,e);else return GoodSearch(T-rchild,e);void TempSearch()tg=headt-next;while(tg!=NULL)print(tg-item);printf(“ %d “,tg-count);tg=tg-next;void Travelprint(BSTree DT,void(*Visit)(char *a)if(DT)Travelprint(DT-lchild,Visit); / 先中序遍历左子树 Visit(DT-item); /

19、 再访问根结点 printf(“查询次数:%d “,DT-count);Travelprint(DT-rchild,Visit); / 最后中序遍历右子树 int DeleteAVL(BSTree *p,char *e,int *taller)int k;BSTree q;if (!*p) return 0;else if (Compare(e,(*p)-item)=-1) k=DeleteAVL(if (*taller=1) LeftProcess(return k; else if (Compare(e,(*p)-item)=1) k=DeleteAVL(if (*taller=1) Ri

20、ghtProcess( return k; else /*找到了关键字为 x 的结点, 由 p 指向它*/ q=*p;if (*p)-rchild=NULL) /*被删结点右子树为空*/ *p=(*p)-lchild; free(q);*taller=1; else if (*p)-lchild=NULL) /*被删结点左子树为空*/*p=(*p)-rchild; free(q);*taller=1;else /*被删结点左右子树均不空*/ Delete2(q,if (*taller=1) LeftProcess( *p=q; return 1; void Delete2(BSTree q,B

21、STree *r,int *taller) /*由 DeleteAVL()调用, 用于处理被删结点左右子树均不空的情况*/if (*r)-rchild=NULL)Insertchar(q-item,(*r)-item);q=*r;*r=(*r)-lchild;free(q);*taller=1;elseDelete2(q,if (*taller=1) RightProcess(void LeftProcess(BSTree *p,int *taller) /*在删除结点时进行左处理*/ BSTree p1,p2;if (*p)-bf=1) (*p)-bf=0; *taller=1;else i

22、f (*p)-bf=0) (*p)-bf=-1; *taller=0; else /*p-bf=-1*/p1=(*p)-rchild;if (p1-bf=0) /*需作 RR 调整*/ (*p)-rchild=p1-lchild;p1-lchild=*p;p1-bf=1;(*p)-bf=-1;*p=p1;*taller=0;else if (p1-bf=-1) /*需作 RR 调整*/(*p)-rchild=p1-lchild;p1-lchild=*p;(*p)-bf=p1-bf=0;*p=p1;*taller=1;else /*需作 RL 调整*/p2=p1-lchild;p1-lchild

23、=p2-rchild;p2-rchild=p1;(*p)-rchild=p2-lchild;p2-lchild=*p;if (p2-bf=0)(*p)-bf=0;p1-bf=0;else if (p2-bf=-1)(*p)-bf=1;p1-bf=0;else(*p)-bf=0;p1-bf=-1;p2-bf=0;*p=p2;*taller=1; void RightProcess(BSTree *p,int *taller) /*在删除结点时进行右处理*/BSTree p1,p2;if (*p)-bf=-1)(*p)-bf=0; *taller=-1; else if (*p)-bf=0) (*

24、p)-bf=1; *taller=0; else /*p-bf=1*/p1=(*p)-lchild;if (p1-bf=0) /*需作 LL 调整*/ (*p)-lchild=p1-rchild; p1-rchild=*p;p1-bf=-1;(*p)-bf=1; *p=p1; *taller=0; else if (p1-bf=1) /*需作 LL 调整*/(*p)-lchild=p1-rchild;p1-rchild=*p;(*p)-bf=p1-bf=0; *p=p1; *taller=1;else /*需作 LR 调整*/ p2=p1-rchild; p1-rchild=p2-lchild;p2-lchild=p1; (*p)-lchild=p2-rchild; p2-rchild=*p;if (p2-bf=0) (*p)-bf=0;p1-bf=0; else if (p2-bf=1) (*p)-bf=-1;p1-bf=0; else (*p)-bf=0;p1-bf=1; p2-bf=0; *p=p2; *taller=1;

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报