• 数据结构算法C语言实现(三十二)--- 9.1静态查找表


      一、简述

      静态查找表又分为顺序表、有序表、静态树表和索引表。以下只是算法的简单实现及测试,不涉及性能分析。

      二、头文件

     1 /**
     2 author:zhaoyu
     3 date:2016-7-12
     4 */
     5 #include "6_3_part1_for_chapter9.h"
     6 typedef struct {
     7     int key;
     8 }SElemType;
     9 //静态查找表的顺序储存结构
    10 #define ElemType SElemType
    11 #define KeyType int
    12 typedef struct {
    13     ElemType *elem;//数据元素储存空间基址,0号留空
    14     int length;//表长度
    15 }SSTable;
    16 //这里简化了键值
    17 //实现 EQ
    18 bool EQ(int a, int b)
    19 {
    20     return a==b?true:false;
    21 }
    22 bool LT(int a, int b)
    23 {
    24     return a<b?true:false;
    25 }
    26 //实现创建 SSTbale
    27 void createSSTable(SSTable &T)
    28 {
    29     //先输入长度 length
    30     //再输入 length 个 元素
    31     scanf("%d", &T.length);
    32     T.elem = (ElemType *)malloc((T.length + 10)*sizeof(int));
    33     for (int i = 1; i <= T.length; i++)
    34     {
    35         scanf("%d", &T.elem[i].key);
    36     }
    37 }
    38 
    39 /**
    40 algorithm 9.1
    41 */
    42 int Search_Seq(SSTable ST, KeyType key)
    43 {
    44     //在顺序表 ST 中顺序查找关键值等于key的数据元素,
    45     //若找到返回元素在表中位置,否则返回0
    46     ST.elem[0].key = key;
    47     int i;
    48     for (i = ST.length; !EQ(ST.elem[i].key, key); --i);
    49     return i;
    50 
    51 }
    52 
    53 /**
    54 algorithm 9.2
    55 */
    56 int Search_Bin(SSTable ST, KeyType key)
    57 {
    58     //在有序表 ST 中折半查找其关键字等于 key 的数据元素
    59     //找到返回其位置,否则返回 0
    60     int low = 1;
    61     int high = ST.length;
    62     while (low <= high)
    63     {
    64         int mid = (low + high) / 2;
    65         if (EQ(key, ST.elem[mid].key))
    66         {
    67             return mid;
    68         }
    69         else if (LT(key, ST.elem[mid].key))
    70         {
    71             high = mid - 1;
    72         }
    73         else
    74         {
    75             low = mid + 1;
    76         }
    77     }
    78     return 0;
    79 }
    9_1_1.h
     1 //6_3_part1.h
     2 /**
     3 author:zhaoyu
     4 date:2016-6-18
     5 */
     6 #include "head.h"
     7 #define TElemType char
     8 //----二叉树的二叉链表表示----
     9 typedef struct BiTNode{
    10     TElemType data;
    11     struct BiTNode *lchild, *rchild;
    12 }*BiTree;
    13 Status Visit(TElemType e)
    14 {
    15     printf("%c	", e);
    16     return OK;
    17 }
    18 
    19 Status RecursionPreOrderTraverse(BiTree T, Status (* Visit)(TElemType e))
    20 {//采用二叉链表存储结构,Visit是对数据元素操作的应用函数
    21 //先序遍历二叉树 T 的递归算法
    22     if (T)
    23     {
    24         if (Visit(T->data))
    25         {
    26             if (RecursionPreOrderTraverse(T->lchild, Visit))
    27             {
    28                 if (RecursionPreOrderTraverse(T->rchild, Visit))
    29                 {
    30                     return OK;
    31                 }
    32             }
    33         }
    34         return ERROR;//这一行由于 Visit 函数只 return OK,貌似没什么用
    35     }
    36     else
    37     {
    38         return OK;
    39     }
    40 }
    6_3_part1_for_chapter9.h
     1 #include "6_3_part1_for_chapter9.h"
     2 typedef struct {
     3     char key;
     4     float weight;
     5 }SElemType;
     6 
     7 //静态查找表的顺序储存结构
     8 #define ElemType SElemType
     9 #define KeyType char
    10 typedef struct {
    11     ElemType *elem;//数据元素储存空间基址,0号留空
    12     int length;//表长度
    13 }SSTable;
    14 //实现创建 SSTbale
    15 void createSSTable(SSTable &ST)
    16 {
    17     //先输入长度 length
    18     //再输入 length 个 元素
    19     scanf("%d", &ST.length);
    20     getchar();//输入老师犯错误
    21     ST.elem = (ElemType *)malloc((ST.length + 10)*sizeof(ElemType));
    22     for (int i = 1; i <= ST.length; i++)
    23     {
    24         scanf("%c", &ST.elem[i].key);
    25         getchar();
    26         scanf("%f", &ST.elem[i].weight);
    27         getchar();//很是懵逼
    28     }
    29 }
    30 //my code
    31 void FindSW(float *sw, SSTable ST)
    32 {
    33     float sum = 0; 
    34     for (int i = 1; i <= ST.length; i++)
    35     {
    36         sum += ST.elem[i].weight;
    37         sw[i] = sum;
    38     }
    39 }
    40 
    41 
    42 /**
    43 algorithm 9.3
    44 */
    45 void SecondOptimal(BiTree &T, ElemType R[], float sw[], int low, int high)
    46 {
    47     //由有序表R[low...high]及其累计权值表sw(其中sw[0]==0)递归构造次优查找树
    48     int i = low;
    49     float min = abs(sw[high] - sw[low]);
    50     float dw = sw[high] + sw[low - 1];
    51     for (int j = low + 1; j <= high; j++)
    52     {
    53         if (abs(dw-sw[j] - sw[j-1]) < min)
    54         {
    55             i = j;
    56             min = abs(dw-sw[j] - sw[j-1]);
    57         }
    58     }
    59     T = (BiTree)malloc(sizeof(BiTNode));
    60     T->data = R[i].key;
    61 
    62     if (i == low)
    63     {
    64         T->lchild = NULL;
    65     }
    66     else 
    67     {
    68         SecondOptimal(T->lchild, R, sw, low, i-1);
    69     }
    70 
    71     if (i == high)
    72     {
    73         T->rchild = NULL;
    74     }
    75     else
    76     {
    77         SecondOptimal(T->rchild, R, sw, i+1, high);
    78     }    
    79 }
    80 
    81 /**
    82 algorithm 9.4
    83 */
    84 typedef BiTree SOSTree;//次优查找树采用二叉链表的储存结构
    85 Status CreateSOSTree(SOSTree &T, SSTable ST)
    86 {
    87     float sw[100];
    88     //有有序表构造一颗次优查找树T, ST的数据元素含有域weight
    89     if (0 == ST.length)
    90     {
    91         T = NULL;
    92     }
    93     else
    94     {
    95         FindSW(sw, ST);//按照由有序表ST中各数据元素的weight域求累计权值表sw
    96         SecondOptimal(T, ST.elem, sw, 1, ST.length);
    97     }
    98     return OK;
    99 }
    9_1_2.h

      三、CPP文件

    1 #include "9_1_1.h"
    2 int main(int argc, char const *argv[])
    3 {
    4     SSTable T;
    5     createSSTable(T);
    6     printf("Search 9:	%d
    ", Search_Seq(T, 9));
    7     printf("Search 3:	%d
    ", Search_Bin(T, 3));
    8     return 0;
    9 }
    9_1_1.cpp
     1 #include "9_1_2.h"
     2 int main(int argc, char const *argv[])
     3 {
     4     SOSTree T;
     5     SSTable ST;
     6     createSSTable(ST);
     7     CreateSOSTree(T, ST);
     8     RecursionPreOrderTraverse(T, Visit);
     9     printf("
    ");
    10     return 0;
    11 }
    9_1_2.cpp

      四、测试

      

      静态树表

      

      反思:

      考完试,动力明显不足了,怎能半途而废,一定要把这个工程在回家之前完成。此外,对于一些不常用,或较难或书上说的比较的含糊的算法明显静不下心来好好研究。效率奇低。

  • 相关阅读:
    48. Rotate Image
    47. Permutations II
    46. Permutations
    45. Jump Game II
    44. Wildcard Matching
    43. Multiply Strings
    42. Trapping Rain Water
    41. First Missing Positive
    40. Combination Sum II
    39. Combination Sum
  • 原文地址:https://www.cnblogs.com/zhaoyu1995/p/5661116.html
Copyright © 2020-2023  润新知