Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1045493
  • 博文数量: 573
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 66
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-28 16:21
文章分类

全部博文(573)

文章存档

2018年(3)

2016年(48)

2015年(522)

分类: C/C++

2015-12-02 15:00:14


点击(此处)折叠或打开

  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <math.h>

  5. #define EQ(a,b) (!strcmp((a),(b))) /*字符串a和b相等*/
  6. #define LT(a,b) (strcmp((a),(b)) < 0) /*字符串a小于字符串b*/
  7. #define LQ(a,b) (strcmp((a),(b)) <= 0) /*字符串a小于等于字符串b*/

  8. #define SZ_STRING 16

  9. typedef char STRING[SZ_STRING];

  10. /*顺序表中元素的类型*/
  11. typedef struct elemtype
  12. {
  13.     STRING key;
  14.     STRING value;
  15. }ELEMTYPE;

  16. /*静态查找表之顺序表:顺序存储结构(顺序表中元素的存放是无序的)*/
  17. typedef struct sunxutable
  18. {
  19.     ELEMTYPE * elem; /*数据元素的基址,0号单元留空*/
  20.     int length; /*表长度*/
  21. }SUNXUTABLE;

  22. typedef SUNXUTABLE * SunXuTablePtr;

  23. /*次优二叉树结点结构体*/
  24. typedef struct secondoptinaltreenode
  25. {
  26.     STRING key; /*结点键值*/
  27.     STRING value; /*结点值*/
  28.     int weight; /*结点权值*/
  29.     struct secondoptinaltreenode * leftchild; /*左孩子*/
  30.     struct secondoptinaltreenode * rightchild; /*右孩子*/
  31. }SECONDOPTINALTREENODE;

  32. typedef SECONDOPTINALTREENODE * SecOptTreeNodePtr;

  33. /*由次优二叉树结点元素组成的有序表*/
  34. typedef struct ordertable
  35. {
  36.     SecOptTreeNodePtr node; /*次优二叉树结点元素的基址,0号单元留空*/
  37.     int length; /*有序表的长度*/
  38. }ORDERTABLE;

  39. typedef ORDERTABLE * OrderTablePtr;

  40. int InitSxTable(SunXuTablePtr * sxtableptr);
  41. int DestroySunXuTable(SunXuTablePtr sxtableptr);
  42. int Search_Seq(SunXuTablePtr sxtableptr, STRING key);
  43. int Search_Bin(SunXuTablePtr sxtableptr, STRING key);
  44. int PrintSxTable(SunXuTablePtr sxtableptr);

  45. int InitOrderTable(OrderTablePtr * ordertableptr);
  46. int PrintOrderTable(OrderTablePtr ordertableptr, int * sw);
  47. int FindSW(OrderTablePtr ordertableptr, int sw[], int length);
  48. void CreateSecondOptimalTree(SecOptTreeNodePtr * secopttreenodeptr, OrderTablePtr ordertableptr, int * sw, int low, int high);
  49. void PrintSecondOptimalTreeNode1(SecOptTreeNodePtr secopttreenodeptr, int * sw);
  50. void PrintSecondOptimalTreeNode2(SecOptTreeNodePtr secopttreenodeptr, int * sw);
  51. void PrintSecondOptimalTreeNode3(SecOptTreeNodePtr secopttreenodeptr, int * sw);

  52. int main(int argc, char * * argv)
  53. {
  54.     freopen("chazhao.txt", "w", stdout);
  55.     printf("查找的各种算法!(顺序查找,折半查找,次优查找)\n");
  56.     
  57.     SunXuTablePtr sxtableptr = NULL;
  58.     InitSxTable(&sxtableptr); /*初始化顺序表*/
  59.     
  60.     printf("\n=======================================================\n\n");
  61.     printf("顺序查找:适用于表中数据无序的情况!\n");
  62.     printf("顺序表中所有数据如下:\n");
  63.     
  64.     PrintSxTable(sxtableptr);
  65.     
  66.     int search_index = -1;
  67.     char key[16];
  68.     memset(key, 0, sizeof(key));
  69.     strcpy(key, "C");
  70.     search_index = Search_Seq(sxtableptr, key);
  71.     printf("顺序查找:key=[%s],在顺序表中下标=[%d]\n", key, search_index);
  72.     memset(key, 0, sizeof(key));
  73.     strcpy(key, "I");
  74.     search_index = Search_Seq(sxtableptr, key);
  75.     printf("顺序查找:key=[%s],在顺序表中下标=[%d]\n", key, search_index);
  76.     memset(key, 0, sizeof(key));
  77.     strcpy(key, "M");
  78.     search_index = Search_Seq(sxtableptr, key);
  79.     printf("顺序查找:key=[%s],在顺序表中下标=[%d]\n", key, search_index);
  80.     
  81.     printf("\n=======================================================\n\n");
  82.     printf("折半查找:适用于表中数据有序并且查找概率相等的情况!\n");
  83.     printf("有序表中所有数据如下:\n");
  84.     PrintSxTable(sxtableptr);
  85.     
  86.     memset(key, 0, sizeof(key));
  87.     strcpy(key, "D");
  88.     search_index = Search_Bin(sxtableptr, key);
  89.     printf("折半查找:key=[%s],在顺序表中下标=[%d]\n", key, search_index);
  90.     memset(key, 0, sizeof(key));
  91.     strcpy(key, "I");
  92.     search_index = Search_Bin(sxtableptr, key);
  93.     printf("折半查找:key=[%s],在顺序表中下标=[%d]\n", key, search_index);
  94.     memset(key, 0, sizeof(key));
  95.     strcpy(key, "N");
  96.     search_index = Search_Bin(sxtableptr, key);
  97.     printf("折半查找:key=[%s],在顺序表中下标=[%d]\n", key, search_index);
  98.     
  99.     printf("\n=======================================================\n\n");
  100.     printf("次优查找树折半查找:适用于表中数据有序并且查找概率不相等的情况!\n");
  101.     
  102.     OrderTablePtr ordertableptr = NULL;
  103.     InitOrderTable(&ordertableptr); /*初始化有序表*/
  104.     
  105.     int sw[10]={0}; /*有序表中所有数据的累计权值和(0号留空,初值为0)*/
  106.     printf("求有序表中各个数据元素的累计权值和:\n");
  107.     FindSW(ordertableptr, sw, 10);
  108.     printf("为构造次优查找树,准备的有序表中所有数据如下:\n");
  109.     PrintOrderTable(ordertableptr, sw);
  110.     
  111.     SecOptTreeNodePtr secopttreenodeptr = NULL; /*次优查找树根结点*/
  112.     int low = 1; /*0号下标为空,所以从1开始*/
  113.     int high = ordertableptr->length; /*0号为空,9个元素的话,最高下标就是9*/
  114.     printf("创建次优查找树!\n");
  115.     CreateSecondOptimalTree(&secopttreenodeptr, ordertableptr, sw, 1, high);
  116.     
  117.     printf("\n按先序序列打印次优查找树:\n");
  118.     PrintSecondOptimalTreeNode1(secopttreenodeptr, sw);
  119.     printf("\n按中序序列打印次优查找树:\n");
  120.     PrintSecondOptimalTreeNode2(secopttreenodeptr, sw);
  121.     printf("\n按后序序列打印次优查找树:\n");
  122.     PrintSecondOptimalTreeNode3(secopttreenodeptr, sw);

  123.     DestroySunXuTable(sxtableptr);
  124.     /*监视哨在最高下标处的算法*/
  125. }

  126. /*功能:按照有序表中各个元素的weight域,求累计权值和,保存在sw中*/
  127. int FindSW(OrderTablePtr ordertableptr, int * sw, int length)
  128. {
  129.     int i = -1;
  130.     int j = -1;
  131.     /*求累计权值和!*/
  132.     for(i=0; i<length; i++)
  133.     {
  134.         for(j=0; j<=i; j++)
  135.         {
  136.             sw[i] += ordertableptr->node[j].weight;
  137.         }
  138.     }
  139. }

  140. /*功能:打印出整颗二叉树(按照先序遍历序列)*/
  141. void PrintSecondOptimalTreeNode1(SecOptTreeNodePtr secopttreenodeptr, int * sw)
  142. {
  143.     if(secopttreenodeptr == NULL)
  144.     {
  145.         return;
  146.     }
  147.     printf("元素:key=[%s],value=[%s],weight=[%d]\n", secopttreenodeptr->key,secopttreenodeptr->value, secopttreenodeptr->weight);
  148.     PrintSecondOptimalTreeNode1(secopttreenodeptr->leftchild, sw);
  149.     PrintSecondOptimalTreeNode1(secopttreenodeptr->rightchild, sw);
  150. }

  151. /*功能:打印出整颗二叉树(按照中序遍历序列)*/
  152. void PrintSecondOptimalTreeNode2(SecOptTreeNodePtr secopttreenodeptr, int * sw)
  153. {
  154.     if(secopttreenodeptr == NULL)
  155.     {
  156.         return;
  157.     }
  158.     PrintSecondOptimalTreeNode2(secopttreenodeptr->leftchild, sw);
  159.     printf("元素:key=[%s],value=[%s],weight=[%d]\n", secopttreenodeptr->key,secopttreenodeptr->value, secopttreenodeptr->weight);
  160.     PrintSecondOptimalTreeNode2(secopttreenodeptr->rightchild, sw);
  161. }

  162. /*功能:打印出整颗二叉树(按照后序遍历序列)*/
  163. void PrintSecondOptimalTreeNode3(SecOptTreeNodePtr secopttreenodeptr, int * sw)
  164. {
  165.     if(secopttreenodeptr == NULL)
  166.     {
  167.         return;
  168.     }
  169.     PrintSecondOptimalTreeNode3(secopttreenodeptr->leftchild, sw);
  170.     PrintSecondOptimalTreeNode3(secopttreenodeptr->rightchild, sw);
  171.     printf("元素:key=[%s],value=[%s],weight=[%d]\n", secopttreenodeptr->key,secopttreenodeptr->value, secopttreenodeptr->weight);
  172. }

  173. /***************************************************************
  174.  *函数名:CreateSecondOptimalTree()
  175.  *功能:创建次优查找树(采用二叉链式存储结构)
  176.  *输入参数:
  177.  * ordertableptr : 有序表地址
  178.  * sw :累计权值和表地址
  179.  * low :树区间最低下标(初始时:是有序表中的第1号元素,不是第0号)
  180.  * high : 树区间最高下标
  181.  *输出参数:
  182.  * secopttreenodeptr : 创建的次优查找树
  183.  *返回值:空
  184.  *编程思想:
  185.  * 1,在有序表中找出最小的(detaPi)元素所在的下标,作为树根结点。
  186.  * 2,以树根结点为中心点,在顺序表中左右分开:左边是左子树的结点,右边是右子树的结点。
  187.  * 3,在左右子树中继续1,2步,可以递归实现
  188. ****************************************************************/
  189. void CreateSecondOptimalTree(SecOptTreeNodePtr * secopttreenodeptr, OrderTablePtr ordertableptr, int * sw, int low, int high)
  190. {
  191.     if((ordertableptr == NULL)||(sw == NULL)||(low > high))
  192.         return;
  193.     /*找树根结点元素:先找最小(detaPi)的值(detaPi:是第i个元素左右两边权值和之差的绝对值)*/
  194.     int minPi = abs(sw[high]); /*最小的(detaPi)*/
  195.     int minPi_index = -1; /*最小的(detaPi)元素所在的下标*/
  196.     int i = 0;
  197.     for(i=low; i<=high; i++)
  198.     {
  199.         /*abs((sw[high] - sw[i]) - (sw[i-1] - sw[low-1])) : |右边的权值和 - 左边的权值和|*/
  200.         if(abs((sw[high] - sw[i]) - (sw[i-1] - sw[low-1])) < minPi) /*找最小(detaPi)*/
  201.         {
  202.             minPi = abs(sw[high] + sw[low-1] - sw[i] -sw[i-1]);
  203.             minPi_index = i; /*记录最小(detaPi)元素的下标值*/
  204.         }
  205.     }
  206.     /*minPi_index记录的下标就是树跟结点*/
  207.     *secopttreenodeptr = (SecOptTreeNodePtr)malloc(sizeof(SECONDOPTINALTREENODE));
  208.     if(*secopttreenodeptr == NULL)
  209.     {
  210.         printf("CreateSecondOptimalTree mallo err!\n");
  211.         return;
  212.     }
  213.     memset(*secopttreenodeptr, 0, sizeof(SECONDOPTINALTREENODE));
  214.     memcpy(*secopttreenodeptr, &(ordertableptr->node[minPi_index]), sizeof(SECONDOPTINALTREENODE)); /*生成根结点*/
  215.     
  216.     int newlow; /*孩子树区间最低下标*/
  217.     int newhigh; /*孩子树区间最高下标*/
  218.     if(minPi_index == low) /*左子树为空*/
  219.     {
  220.         (*secopttreenodeptr)->leftchild = NULL;
  221.     }
  222.     else /*创建左子树*/
  223.     {
  224.         newlow = low;
  225.         newhigh = minPi_index - 1;
  226.         CreateSecondOptimalTree(&((*secopttreenodeptr)->leftchild), ordertableptr, sw, newlow, newhigh);
  227.     }
  228.     if(minPi_index == high) /*右子树为空*/
  229.     {
  230.         (*secopttreenodeptr)->rightchild = NULL;
  231.     }
  232.     else /*创建右子树*/
  233.     {
  234.         newlow = minPi_index + 1;
  235.         newhigh = high;
  236.         CreateSecondOptimalTree(&((*secopttreenodeptr)->rightchild), ordertableptr, sw, newlow, newhigh);
  237.     }
  238. }

  239. /*功能:打印有序表中的所有元素*/
  240. int PrintOrderTable(OrderTablePtr ordertableptr, int * sw)
  241. {
  242.     if(ordertableptr == NULL)
  243.          return -1;
  244.     int i = 0;
  245.     for(i=0; i<ordertableptr->length+1; i++)
  246.     {
  247.         printf("元素下标[%d],key=[%s],value=[%s],weight=[%d],sw=[%d]\n", i, ordertableptr->node[i].key, ordertableptr->node[i].value, ordertableptr->node[i].weight, sw[i]);
  248.     }
  249.     return 0;
  250. }

  251. /***************************************************************
  252.  *函数名称:InitOrderTable()
  253.  *功能:初始化次优二叉树的有序表(顺序存储结构)
  254.  *输出参数:
  255.  * ordertableptr : 有序表指针的地址
  256.  *返回值:
  257. ****************************************************************/
  258.  int InitOrderTable(OrderTablePtr * ordertableptr)
  259.  {
  260.      int weightvalue[128]={1, 1, 2, 5, 3, 4, 4, 3, 5};

  261.     *ordertableptr = (ORDERTABLE*)malloc(sizeof(ORDERTABLE));
  262.     if(*ordertableptr == NULL)
  263.         return -1;
  264.     memset((*ordertableptr), 0, sizeof(ORDERTABLE));
  265.     (*ordertableptr)->length = 9;
  266.     (*ordertableptr)->node = (SECONDOPTINALTREENODE *) malloc(((*ordertableptr)->length+1) * sizeof(SECONDOPTINALTREENODE)); /*0号单元留空*/
  267.     if((*ordertableptr)->node == NULL)
  268.         return -1;
  269.     memset((*ordertableptr)->node, 0, (*ordertableptr)->length * sizeof(SECONDOPTINALTREENODE));
  270.     /*初始化顺序表的元素*/
  271.     strcpy((*ordertableptr)->node[0].key, "");
  272.     strcpy((*ordertableptr)->node[0].value, "");
  273.     (*ordertableptr)->node[0].weight = 0;
  274.     (*ordertableptr)->node[0].leftchild = NULL;
  275.     (*ordertableptr)->node[0].rightchild = NULL;
  276.     strcpy((*ordertableptr)->node[1].key, "A");
  277.     strcpy((*ordertableptr)->node[1].value, "AAA");
  278.     (*ordertableptr)->node[1].weight = weightvalue[0];
  279.     (*ordertableptr)->node[1].leftchild = NULL;
  280.     (*ordertableptr)->node[1].rightchild = NULL;
  281.     strcpy((*ordertableptr)->node[2].key, "B");
  282.     strcpy((*ordertableptr)->node[2].value, "BBB");
  283.     (*ordertableptr)->node[2].weight = weightvalue[1];
  284.     (*ordertableptr)->node[2].leftchild = NULL;
  285.     (*ordertableptr)->node[2].rightchild = NULL;
  286.     strcpy((*ordertableptr)->node[3].key, "C");
  287.     strcpy((*ordertableptr)->node[3].value, "CCC");
  288.     (*ordertableptr)->node[3].weight = weightvalue[2];
  289.     (*ordertableptr)->node[3].leftchild = NULL;
  290.     (*ordertableptr)->node[3].rightchild = NULL;
  291.     strcpy((*ordertableptr)->node[4].key, "D");
  292.     strcpy((*ordertableptr)->node[4].value, "DDD");
  293.     (*ordertableptr)->node[4].weight = weightvalue[3];
  294.     (*ordertableptr)->node[4].leftchild = NULL;
  295.     (*ordertableptr)->node[4].rightchild = NULL;
  296.     strcpy((*ordertableptr)->node[5].key, "E");
  297.     strcpy((*ordertableptr)->node[5].value, "EEE");
  298.     (*ordertableptr)->node[5].weight = weightvalue[4];
  299.     (*ordertableptr)->node[5].leftchild = NULL;
  300.     (*ordertableptr)->node[5].rightchild = NULL;
  301.     strcpy((*ordertableptr)->node[6].key, "F");
  302.     strcpy((*ordertableptr)->node[6].value, "FFF");
  303.     (*ordertableptr)->node[6].weight = weightvalue[5];
  304.     (*ordertableptr)->node[6].leftchild = NULL;
  305.     (*ordertableptr)->node[6].rightchild = NULL;
  306.     strcpy((*ordertableptr)->node[7].key, "G");
  307.     strcpy((*ordertableptr)->node[7].value, "GGG");
  308.     (*ordertableptr)->node[7].weight = weightvalue[6];
  309.     (*ordertableptr)->node[7].leftchild = NULL;
  310.     (*ordertableptr)->node[7].rightchild = NULL;
  311.     strcpy((*ordertableptr)->node[8].key, "H");
  312.     strcpy((*ordertableptr)->node[8].value, "HHH");
  313.     (*ordertableptr)->node[8].weight = weightvalue[7];
  314.     (*ordertableptr)->node[8].leftchild = NULL;
  315.     (*ordertableptr)->node[8].rightchild = NULL;
  316.     /*注意:如果长度只分配9的话,node[9]其实已经越界了,在数组的外面了
  317.     再操作mallo()的话,可能会覆盖这个空间*/
  318.     strcpy((*ordertableptr)->node[9].key, "I");
  319.     strcpy((*ordertableptr)->node[9].value, "III");    
  320.     (*ordertableptr)->node[9].weight = weightvalue[8];
  321.     (*ordertableptr)->node[9].leftchild = NULL;
  322.     (*ordertableptr)->node[9].rightchild = NULL;
  323.     
  324.     return 0;
  325.  }
  326.  
  327. /***************************************************************
  328.  *函数名:DestroySunXuTable()
  329.  *函数功能:销毁顺序表
  330.  *函数参数:
  331.  * sxtableptr :顺序表指针
  332. ****************************************************************/
  333. int DestroySunXuTable(SunXuTablePtr sxtableptr)
  334. {
  335.     if(sxtableptr == NULL)
  336.         return -1;
  337.     if(sxtableptr->elem != NULL)
  338.     {
  339.         free(sxtableptr->elem);
  340.         sxtableptr->elem = NULL;
  341.     }
  342.     if(sxtableptr != NULL)
  343.     {
  344.         free(sxtableptr);
  345.         sxtableptr = NULL;
  346.     }
  347.     return 0;
  348. }

  349. /***************************************************************
  350.  *函数名:Search_Bin()
  351.  *功能:折半查找:在有序表中折半查找其指定的关键字的元素
  352.  *输入参数:
  353.  * sxtable :顺序表
  354.  * key :待查找的关键字
  355.  *返回值:
  356.  * 若找到: 则返回该元素在表中的位置
  357.  * 若未找到:则返回0
  358. ****************************************************************/
  359. int Search_Bin(SunXuTablePtr sxtableptr, STRING key)
  360. {
  361.      if((key == NULL)||(sxtableptr == NULL))
  362.          return 0;
  363.      int low = 1; /*设置区间初值*/
  364.      int high = sxtableptr->length;
  365.      int mid = 0;
  366.      
  367.      while(low <= high)
  368.      {
  369.          mid = (low + high)/2;
  370.          if(EQ(key, sxtableptr->elem[mid].key)) /*找到待查找元素,可以直接返回了*/
  371.              return mid;
  372.          else if(LT(key, sxtableptr->elem[mid].key))    /*继续在前半区间查找*/
  373.              high = mid - 1;
  374.          else low = mid + 1; /*继续在后半区间查找*/
  375.      }
  376.      
  377.     return 0; /*找不到时,返回0*/         
  378. }

  379. /*功能:打印顺序表中的所有元素*/
  380. int PrintSxTable(SunXuTablePtr sxtableptr)
  381. {
  382.     if(sxtableptr == NULL)
  383.          return -1;
  384.     int i = 0;
  385.     for(i=0; i<sxtableptr->length+1; i++)
  386.     {
  387.         printf("元素下标[%d],key=[%s],value=[%s]\n", i, sxtableptr->elem[i].key, sxtableptr->elem[i].value);
  388.     }
  389.     return 0;
  390. }

  391. /*功能:初始化顺序表(顺序存储结构)*/
  392. int InitSxTable(SunXuTablePtr * sxtableptr)
  393. {
  394.     /*顺序表中元素的存放是无序的,为了试验有序表的折半查找,
  395.     这里人为的让数据元素是有序的,免去了排序的操作
  396.     所以也可以当有序表使用,并且,并不影响顺序查找的测试*/
  397.     *sxtableptr = (SUNXUTABLE*)malloc(sizeof(SUNXUTABLE));
  398.     if(*sxtableptr == NULL)
  399.         return -1;
  400.     memset((*sxtableptr), 0, sizeof(SUNXUTABLE));
  401.     (*sxtableptr)->length = 9;
  402.     (*sxtableptr)->elem = (ELEMTYPE *) malloc((*sxtableptr)->length * sizeof(ELEMTYPE));
  403.     if((*sxtableptr)->elem == NULL)
  404.         return -1;
  405.     memset((*sxtableptr)->elem, 0, (*sxtableptr)->length * sizeof(ELEMTYPE));
  406.     /*初始化顺序表的元素*/
  407.     strcpy((*sxtableptr)->elem[1].key, "A");
  408.     strcpy((*sxtableptr)->elem[1].value, "AAA");
  409.     strcpy((*sxtableptr)->elem[2].key, "B");
  410.     strcpy((*sxtableptr)->elem[2].value, "BBB");
  411.     strcpy((*sxtableptr)->elem[3].key, "C");
  412.     strcpy((*sxtableptr)->elem[3].value, "CCC");
  413.     strcpy((*sxtableptr)->elem[4].key, "D");
  414.     strcpy((*sxtableptr)->elem[4].value, "DDD");
  415.     strcpy((*sxtableptr)->elem[5].key, "E");
  416.     strcpy((*sxtableptr)->elem[5].value, "EEE");
  417.     strcpy((*sxtableptr)->elem[6].key, "F");
  418.     strcpy((*sxtableptr)->elem[6].value, "FFF");
  419.     strcpy((*sxtableptr)->elem[7].key, "G");
  420.     strcpy((*sxtableptr)->elem[7].value, "GGG");
  421.     strcpy((*sxtableptr)->elem[8].key, "H");
  422.     strcpy((*sxtableptr)->elem[8].value, "HHH");
  423.     strcpy((*sxtableptr)->elem[9].key, "I");
  424.     strcpy((*sxtableptr)->elem[9].value, "III");    
  425.     
  426.     return 0;
  427. }

  428. /***************************************************************
  429.  *函数名:Search_Seq()
  430.  *功能:顺序查找:在顺序表中顺序查找其指定的关键字的元素
  431.  *输入参数:
  432.  * sxtable :顺序表
  433.  * key :待查找的关键字
  434.  *返回值:
  435.  * 若找到: 则返回该元素在表中的位置
  436.  * 若未找到:则返回0
  437. ****************************************************************/
  438. int Search_Seq(SunXuTablePtr sxtableptr, STRING key)
  439. {
  440.      if((key == NULL)||(sxtableptr == NULL))
  441.          return 0;
  442.      strcpy(sxtableptr->elem[0].key, key); /*哨兵*/
  443.      /*对0号元素elem[0]赋值key,目的在于免去查找过程中每一步都要检测整个表是否查找完毕。
  444.      elem[0]起到监视哨的作用,这仅仅是程序设计技巧上的改进*/
  445.      int i = 0;
  446.      for(i=sxtableptr->length; !EQ(sxtableptr->elem[i].key, key); i--); /*从后往前走*/
  447.     
  448.     return i; /*找不到时,会一直找到第一个,肯定相等,此时i=0*/         
  449. }

阅读(561) | 评论(0) | 转发(0) |
0

上一篇:双向循环链表

下一篇:Hash表

给主人留下些什么吧!~~