一、简述

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

  二、头文件

 /**
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. Java多线程总结(二)锁、线程池

    掌握Java中的多线程,必须掌握Java中的各种锁,以及了解Java中线程池的运用.关于Java多线程基础总结可以参考我的这篇博文Java多线程总结(一)多线程基础 转载请注明出处——http://w ...

  2. 《深入理解Bootstrap》勘误

    感谢大家 感谢大家仔细阅读本书,并给本书指出了那么多的错误,下次重印时,一定会修正. 勘误列表 ID 发行人 章节 原文 更新文 备注 1 剑衣清风(微博) 1.5选择器(p7) [att$=valu ...

  3. Git开发备忘

    1.在Git中,上传了中文命名的文件,但是后面想删除的时候,发现中文命名被转义了. 利用Git add是无法添加这类文件的,所以这里我们需要用到 git add -u命令,即可实现成功添加. 2.在G ...

  4. ROS(Robot Operating System)常用环境变量介绍

    本文简单介绍ROS系统中常用的环境变量用途及设置方式.ROS系统环境中除了必须配置的环境变量以外,其他的也是十分有用,通过修改变量路径,可以设置ROS系统中log文件存放路径,单元测试结果存放路径等. ...

  5. lecture13-BP算法的讨论和置信网

    这是HInton课程第13课,这一课有两篇论文可以作为课外读物<Connectionist learning of belief networks>和<The wake-sleep ...

  6. 发布新博客皮肤red_autumnal_leaves

    感谢sevennight为大家精心设计了一款博客皮肤——red_autumnal_leaves! [名称] red_autumnal_leaves[标题] 红叶[设计者] sevennight[简介] ...

  7. 深入理解计算机系统(2.2)---布尔代数以及C语言上的位运算

    布尔代数上的位运算 布尔代数是一个数学知识体系,它在0和1的二进制值上演化而来的. 我们不需要去彻底的了解这个知识体系,但是里面定义了几种二进制的运算,却是我们在平时的编程过程当中也会遇到的.这四种运 ...

  8. C#操作Excel时的格式设定(转)

    Excel报表打印的格式设定 1.     表头的设置 Excel._Worksheet myWorksheet; myWorksheet.PageSetup.Orientation = Excel. ...

  9. Quartz.NET 入门

    概述 Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等. Quartz.NET允许开发人员根据时间间隔(或天)来调度作业.它实现了 ...

  10. 现代软件工程 第七章 【MSF】练习与讨论

    7.7  移山开发方法——比TFS敏捷更精简 几个软件学院的学生来请教阿超,同学们自豪地说,我们要用全套TFS敏捷开发模式开发项目! 真的?阿超不敢相信. 同学: 对!我们要用全5个工作项类型 – 任 ...