一、简述

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

  二、头文件

 /**
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. 利用Canvas进行绘制XY坐标系

    首先来一发图 绘制XY的坐标主要是利用Canvas setLeft和setBottom功能(Canvas内置坐标的功能) 1.首先WPF中的坐标系都是从左到右,从上到下的 即左上角位置(0,0)点,所 ...

  2. 你应该知道的25道Javascript面试题

    题目来自 25 Essential JavaScript Interview Questions.闲来无事,正好切一下. 一 What is a potential pitfall with usin ...

  3. MySQL for mac使用记录

    一.登录 打开终端,输入/usr/local/mysql/bin/mysql -u root -p 初次进入mysql,密码为空.当出现mysql>提示符时,表示你已经进入mysql中.键入ex ...

  4. Android开发遇到的坑(1):Java中List的安全删除问题

    在项目的开发过程中,一定少不了的是对Java集合中的List接触.项目中对List的删掉也是一种常见的操作,看上这个操作也没什么好说的样子,但是在项目开发中也是最容易出错的地方,特别是对于新手.有时候 ...

  5. 2015/11/9用Python写游戏,pygame入门(8):按钮和游戏结束

    昨天没有更新内容,今天相对多写一些. 因为我们已经基本完成游戏框架,但是游戏结束后,并不知道怎样比较好开始.我本来本着懒的原则,想结束后显示一个黑屏,然后你重新点一下鼠标就重新开始.但是那样实在太不像 ...

  6. jqMobile中pageinit,pagecreate,pageshow等函数的执行顺序

    常见的共有5个page函数,刚开始有点迷糊的是到底谁先谁后执行. 实验告诉我们结果: var temp = ''; $('body').live('pagechange', function () { ...

  7. Thinkphp url 除去index.php

    例如你的原路径是 http://localhost/test/index.php/index/add那么现在的地址是 http://localhost/test/index/add如何去掉index. ...

  8. openwrt的环境搭建、定制和编译

    参考1:编译openwrt全过程 参考2: ARM9的OpenWRT系统的移植以及 无线视觉操控系统的软件开发 参考3:搭建OpenWrt开发环境(包括编译过程) 参考4:各个openwrt版本的sv ...

  9. 利用反射,泛型,静态方法快速获取表单值到Model

    在项目中经常需要处理表单,给model赋值,很烦人的一些重复代码.如下边的代码: News news = new News(); news.Id = int.Parse(Request.Form[&q ...

  10. 多词查询(Multi-word Queries)

    如果我们一次只能搜索一个词,那么全文搜索就会显得相当不灵活.幸运的是,通过match查询来实现多词查询也同样简单: GET /my_index/my_type/_search { "quer ...