⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 algo8-3.cpp

📁 数据结构相关代码
💻 CPP
字号:
 // algo8-3.cpp 静态查找表(静态树表)的操作,包括算法9.3和9.4
 #include"c1.h"
 #include"func8-3.cpp" // 包括数据元素类型的定义及对它的操作
 #include"c8-1.h" // 静态查找表的顺序存储结构
 #include"c8-2.h" // 对两个数值型关键字比较的约定
 #include"bo8-1.cpp" // 静态查找表(顺序表和有序表)的基本操作(7个)
 typedef ElemType TElemType; // 定义二叉树的元素类型为数据元素类型
 #include"c6-2.h" // 二叉链表的存储结构
 #include"bo6-2.cpp" // 包括InitBiTree(),DestroyBiTree()和InOrderTraverse()函数
 #define N 100 // 静态查找表的最大表长,设置sw[]数组用到
 Status SecondOptimal(BiTree &T,ElemType R[],int sw[],int low,int high)
 { // 由有序表R[low..high]及其累计权值表sw(其中sw[0]==0)递归构造次优查找树T。算法9.3
   int j,i=low; // 有最小△Pi值的序号,初值设为当low==high(有序表仅1个元素)时的值
   double dw=sw[high]+sw[low-1]; // 教科书式9-13中的固定项
   double min=fabs(sw[high]-sw[low]); // △Pi的最小值,初值设为当low==high时的值
   for(j=low+1;j<=high;++j) // 当low≠high时,选择最小的△Pi值
     if(fabs(dw-sw[j]-sw[j-1])<min) // 找到小于min的值
     { i=j; // 更新有最小△Pi值的序号
       min=fabs(dw-sw[j]-sw[j-1]); // 更新△Pi的最小值
     }
   if(!(T=(BiTree)malloc(sizeof(BiTNode)))) // 生成结点失败
     return ERROR;
   T->data=R[i]; // 将有最小△Pi值的数据元素赋给树结点的数据域
   if(i==low) // 有最小△Pi值的序号是最小序号
     T->lchild=NULL; // 设左子树空
   else // 有最小△Pi值的序号不是最小序号
     SecondOptimal(T->lchild,R,sw,low,i-1); // 递归构造次优查找左子树
   if(i==high) // 有最小△Pi值的序号是最大序号
     T->rchild=NULL; // 设右子树空
   else // 有最小△Pi值的序号不是最大序号
     SecondOptimal(T->rchild,R,sw,i+1,high); // 递归构造次优查找右子树
   return OK;
 }

 void FindSW(int sw[],SSTable ST)
 { // 按照有序表ST中各数据元素的Weight域求累计权值数组sw,CreateSOSTree()调用
   int i;
   sw[0]=0; // 置边界值
   printf("\nsw=0 ");
   for(i=1;i<=ST.length;i++) // 由小到大计算累计权值sw[i]并输出
   { sw[i]=sw[i-1]+ST.elem[i].weight; // 累计权值[i]=累计权值[i-1]+[i]项权值
     printf("%5d",sw[i]);
   }
 }

 typedef BiTree SOSTree; // 次优查找树采用二叉链表的存储结构
 void CreateSOSTree(SOSTree &T,SSTable ST)
 { // 由有序表ST构造一棵次优查找树T。ST的数据元素含有权域weight。算法9.4
   int sw[N+1]; // 累计权值数组
   if(ST.length==0) // ST是空表
     T=NULL; // 次优查找树T为空
   else // ST不空
   { FindSW(sw,ST); // 按照有序表ST中各数据元素的weight域求累计权值表sw
     SecondOptimal(T,ST.elem,sw,1,ST.length);
     // 由有序表ST[1..ST.length]及其累计权值表sw(其中sw[0]==0)递归构造次优查找树T
   }
 }

 Status Search_SOSTree(SOSTree &T,KeyType key)
 { // 在次优查找树T中查找主关键字等于key的元素。找到则返回OK,T指向该元素;否则返回FALSE
   while(T) // T非空
     if(T->data.key==key) // 树T根结点关键字域的值等于key
       return OK; // 找到,返回OK
     else if(T->data.key>key) // 树T根结点关键字域的值大于key
       T=T->lchild; // T指向T的左子树,继续查找
     else // 树T根结点关键字域的值小于key
       T=T->rchild; // T指向T的右子树,继续查找
   return FALSE; // 次优查找树T中不存在待查元素
 }

 void main()
 {
   SSTable st;
   SOSTree t;
   Status i;
   KeyType s;
   Creat_OrdFromFile(st,"f8-3.txt"); // 由数据文件产生非降序静态查找表st
   printf("       ");
   Traverse(st,Visit); // 顺序输出非降序静态查找表st
   CreateSOSTree(t,st); // 由有序表st构造次优查找树t
   printf("\n请输入待查找的字符:");
   InputKey(s); // 由键盘输入关键字s,在func8-3.cpp中
   i=Search_SOSTree(t,s); // 在次优查找树t中查找主关键字等于s的元素
   if(i) // 找到,返回OK,t指向该元素
     printf("%c的权值是%d\n",s,t->data.weight);
   else // 未找到,返回FALSE
     printf("表中不存在此字符\n");
   DestroyBiTree(t); // 查找完毕,销毁次优查找树t
 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -