一、简述

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

  二、头文件

 /**
author:zhaoyu
date:2016-7-12
*/
#include "6_3_part1_for_chapter9.h"
typedef struct {
int key;
}SElemType;
//静态查找表的顺序储存结构
#define ElemType SElemType
#define KeyType int
typedef struct {
ElemType *elem;//数据元素储存空间基址,0号留空
int length;//表长度
}SSTable;
//这里简化了键值
//实现 EQ
bool EQ(int a, int b)
{
return a==b?true:false;
}
bool LT(int a, int b)
{
return a<b?true:false;
}
//实现创建 SSTbale
void createSSTable(SSTable &T)
{
//先输入长度 length
//再输入 length 个 元素
scanf("%d", &T.length);
T.elem = (ElemType *)malloc((T.length + )*sizeof(int));
for (int i = ; i <= T.length; i++)
{
scanf("%d", &T.elem[i].key);
}
} /**
algorithm 9.1
*/
int Search_Seq(SSTable ST, KeyType key)
{
//在顺序表 ST 中顺序查找关键值等于key的数据元素,
//若找到返回元素在表中位置,否则返回0
ST.elem[].key = key;
int i;
for (i = ST.length; !EQ(ST.elem[i].key, key); --i);
return i; } /**
algorithm 9.2
*/
int Search_Bin(SSTable ST, KeyType key)
{
//在有序表 ST 中折半查找其关键字等于 key 的数据元素
//找到返回其位置,否则返回 0
int low = ;
int high = ST.length;
while (low <= high)
{
int mid = (low + high) / ;
if (EQ(key, ST.elem[mid].key))
{
return mid;
}
else if (LT(key, ST.elem[mid].key))
{
high = mid - ;
}
else
{
low = mid + ;
}
}
return ;
}

9_1_1.h

 //6_3_part1.h
/**
author:zhaoyu
date:2016-6-18
*/
#include "head.h"
#define TElemType char
//----二叉树的二叉链表表示----
typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild, *rchild;
}*BiTree;
Status Visit(TElemType e)
{
printf("%c\t", e);
return OK;
} Status RecursionPreOrderTraverse(BiTree T, Status (* Visit)(TElemType e))
{//采用二叉链表存储结构,Visit是对数据元素操作的应用函数
//先序遍历二叉树 T 的递归算法
if (T)
{
if (Visit(T->data))
{
if (RecursionPreOrderTraverse(T->lchild, Visit))
{
if (RecursionPreOrderTraverse(T->rchild, Visit))
{
return OK;
}
}
}
return ERROR;//这一行由于 Visit 函数只 return OK,貌似没什么用
}
else
{
return OK;
}
}

6_3_part1_for_chapter9.h

 #include "6_3_part1_for_chapter9.h"
typedef struct {
char key;
float weight;
}SElemType; //静态查找表的顺序储存结构
#define ElemType SElemType
#define KeyType char
typedef struct {
ElemType *elem;//数据元素储存空间基址,0号留空
int length;//表长度
}SSTable;
//实现创建 SSTbale
void createSSTable(SSTable &ST)
{
//先输入长度 length
//再输入 length 个 元素
scanf("%d", &ST.length);\
getchar();//输入老师犯错误
ST.elem = (ElemType *)malloc((ST.length + )*sizeof(ElemType));
for (int i = ; i <= ST.length; i++)
{
scanf("%c", &ST.elem[i].key);
getchar();
scanf("%f", &ST.elem[i].weight);
getchar();//很是懵逼
}
}
//my code
void FindSW(float *sw, SSTable ST)
{
float sum = ;
for (int i = ; i <= ST.length; i++)
{
sum += ST.elem[i].weight;
sw[i] = sum;
}
} /**
algorithm 9.3
*/
void SecondOptimal(BiTree &T, ElemType R[], float sw[], int low, int high)
{
//由有序表R[low...high]及其累计权值表sw(其中sw[0]==0)递归构造次优查找树
int i = low;
float min = abs(sw[high] - sw[low]);
float dw = sw[high] + sw[low - ];
for (int j = low + ; j <= high; j++)
{
if (abs(dw-sw[j] - sw[j-]) < min)
{
i = j;
min = abs(dw-sw[j] - sw[j-]);
}
}
T = (BiTree)malloc(sizeof(BiTNode));
T->data = R[i].key; if (i == low)
{
T->lchild = NULL;
}
else
{
SecondOptimal(T->lchild, R, sw, low, i-);
} if (i == high)
{
T->rchild = NULL;
}
else
{
SecondOptimal(T->rchild, R, sw, i+, high);
}
} /**
algorithm 9.4
*/
typedef BiTree SOSTree;//次优查找树采用二叉链表的储存结构
Status CreateSOSTree(SOSTree &T, SSTable ST)
{
float sw[];
//有有序表构造一颗次优查找树T, ST的数据元素含有域weight
if ( == ST.length)
{
T = NULL;
}
else
{
FindSW(sw, ST);//按照由有序表ST中各数据元素的weight域求累计权值表sw
SecondOptimal(T, ST.elem, sw, , ST.length);
}
return OK;
}

9_1_2.h

  三、CPP文件

 #include "9_1_1.h"
int main(int argc, char const *argv[])
{
SSTable T;
createSSTable(T);
printf("Search 9:\t%d\n", Search_Seq(T, ));
printf("Search 3:\t%d\n", Search_Bin(T, ));
return ;
}

9_1_1.cpp

 #include "9_1_2.h"
int main(int argc, char const *argv[])
{
SOSTree T;
SSTable ST;
createSSTable(ST);
CreateSOSTree(T, ST);
RecursionPreOrderTraverse(T, Visit);
printf("\n");
return ;
}

9_1_2.cpp

  四、测试

  

  静态树表

  

  反思:

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

数据结构算法C语言实现(三十二)--- 9.1静态查找表的更多相关文章

  1. 数据结构算法C语言实现(十二)--- 3.4循环队列&队列的顺序表示和实现

    一.简述 空队列的处理方法:1.另设一个标志位以区别队列是空还是满:2.少用一个元素空间,约定以队列头指针在队尾指针下一位置上作为队列呈满的状态的标志. 二.头文件 //3_4_part1.h /** ...

  2. 数据结构算法C语言实现(十)--- 3.3栈与递归的实现

    一.简介 汉诺塔问题是递归的一个典型例子,而且书上的讲解很详细,对理解C语言函数及函数传参的工作机制很有帮助,值得一看.而且,递归在我看来和分治.DP.贪心等一样是十分优美的思想,值得学习!!! 二. ...

  3. 数据结构算法C语言实现(十九)--- 5.5&5.6&5.7广义表

    一.简述 传说Lisp的基本数据结构就是广义表,广义表也是具有典型递归属性的数据结构,此外,由于建表要处理字符串,用C语言处理起来也是一脸懵逼.....最后自己还想写一个将广义表还原成字符串的函数,一 ...

  4. 数据结构算法C语言实现(十四)--- 4.1&4.2串的类型定义、表示及实现

    一.简述 [暂无] 二.头文件 //4_2_part1.h /** author:zhaoyu */ //2016-6-10 //----串的定长顺序存储表示---- #include "h ...

  5. COJ968 WZJ的数据结构(负三十二)

    WZJ的数据结构(负三十二) 难度级别:D: 运行时间限制:5000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给你一棵N个点的无根树,边上均有权值,每个点上有 ...

  6. [COJ0968]WZJ的数据结构(负三十二)

    [COJ0968]WZJ的数据结构(负三十二) 试题描述 给你一棵N个点的无根树,边上均有权值,每个点上有一盏灯,初始均亮着.请你设计一个数据结构,回答M次操作. 1 x:将节点x上的灯拉一次,即亮变 ...

  7. Java进阶(三十二) HttpClient使用详解

    Java进阶(三十二) HttpClient使用详解 Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们 ...

  8. “全栈2019”Java多线程第三十二章:显式锁Lock等待唤醒机制详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  9. “全栈2019”Java第三十二章:增强for循环Foreach语法

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

随机推荐

  1. Effective java 第2版 - 笔记(01) 单例(Singleton)的枚举(enum)实现

    直接上代码: public enum Boss { INSTANCE; private String name; public void doSomeThing() { System.out.prin ...

  2. 基于VirtualBox安装Ubuntu图文教程

    基于VirtualBox虚拟机安装Ubuntu图文教程 一. 下载安装VirtualBox 官网下载VirtualBox,目前版本:VirtualBox 5.1.8 for Windows hosts ...

  3. SQL Server Management Studio无法记住密码

    用sa账户登录sql server 2008,勾选了“记住密码”,但重新登录时,SQL Server Management Studio无法记住密码.   后来发现,在重新登录时,登录名显示的并非是s ...

  4. 你真的理解 new 了吗?

    开篇先提几个问吧,如果你对这些问题都清楚了,那说明对于 new  这个关键字已经掌握得很好了,也不再需要花时间来阅读本文了, 1   new  一个class  与 new   一个Struct有什么 ...

  5. 基于DDD的.NET开发框架 - ABP模块设计

    返回ABP系列 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应 ...

  6. Windows下搭建PHP环境:Apache+PHP+MySQL

    本文简单记录一下Windows下搭建PHP环境的过程,一些细节可以参照本文参考资料,此文不再赘述 准备工作: Windows下手工搭建PHP环境需要先下载相应的软件,需要注意的是Apache与PHP的 ...

  7. 用node.js实现简单的web服务器

    node.js实现web服务器还是比较简单的,我了解node.js是从<node入门>开始的,如果你不了解node.js也可以看看! 我根据那书一步一步的练习完了,也的确大概了解了node ...

  8. [BZOJ3696][FJSC2014]化合物(异或规则下的母函数)

    题目:http://hzwer.com/3708.html 分析: 类似树分治思想,设f[x][i]表示以x为根的子树的所有点中,与x的距离为i的点有多少个,这个可以预处理出来 然后我们考虑每颗子树对 ...

  9. jQuery问题集锦

    [1]阻止提交表单 方法1: $(function () { $("input[type=submit]").click(function (event) { //如果不满足表单提 ...

  10. js 基础(一)

    <!--最近需要用到js相关的知识 就把在W3cSchool 下学到的东西做个笔记,方便以后再看 --><!DOCTYPE html> <html> <hea ...