Fork me on GitHub

数据结构算法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\t", 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:\t%d\n", Search_Seq(T, 9));
7     printf("Search 3:\t%d\n", 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("\n");
10     return 0;
11 }
9_1_2.cpp

  四、测试

  

  静态树表

  

  反思:

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

posted @ 2016-07-12 10:39  赵裕(vimerzhao)  阅读(1350)  评论(0编辑  收藏  举报