非红黑树,排序+二分搜索,查找修改O(logN),插入删除O(N)

#ifndef  MAP_H
#define MAP_H
#include "main.h" /*----------Custom----------*/
typedef struct{
short* Addr;
short MaxValue;
short MinValue;
uchar ReadOnly;
} MODBUS_DataType; #define MAP_TypeKey ushort
#define MAP_TypeValue MODBUS_DataType /*----------End----------*/
typedef struct{
MAP_TypeKey Key;
MAP_TypeValue Value;
} MAP_Element; #define MAP_MaxSize 20 typedef struct{
MAP_Element Element[MAP_MaxSize];
int Size;
} MAP_TypeDef; #ifdef MAP_C
#include "stdlib.h" void MAP_Swap(MAP_Element* a, MAP_Element* b); /*----------Custom----------*/
int MAP_Compare(const void* a, const void* b)
{
return (*(MAP_Element*)a).Key - (*(MAP_Element*)b).Key;
} /*----------End----------*/ #endif int MAP_Find (MAP_TypeDef* mp, MAP_TypeKey key );
void MAP_Insert(MAP_TypeDef* mp, MAP_TypeKey key, MAP_TypeValue value);
void MAP_Erase (MAP_TypeDef* mp, MAP_TypeKey key );
char MAP_Get (MAP_TypeDef* mp, MAP_TypeKey key, MAP_TypeValue* out );
char MAP_Set (MAP_TypeDef* mp, MAP_TypeKey key, MAP_TypeValue value); #endif
#define  MAP_C
#include "map.h" int MAP_Find(MAP_TypeDef* mp, MAP_TypeKey key)
{
int l = 0;
int r = mp->Size; MAP_Element tmp;
tmp.Key = key; while(l <= r)
{
ushort mid = (l + r) >> 1;
int ans = MAP_Compare(&mp->Element[mid], &tmp);
if(ans > 0)
{
r = mid - 1;
}
else if(ans < 0)
{
l = mid + 1;
}
else
{
return mid;
}
}
return -1;
} void MAP_Swap(MAP_Element* a, MAP_Element* b)
{
MAP_Element tp;
tp = *a;
*a = *b;
*b = tp;
} void MAP_Insert(MAP_TypeDef* mp, MAP_TypeKey key, MAP_TypeValue value)
{
MAP_Element tmp;
tmp.Key = key;
tmp.Value = value; if(mp->Size == 0)
{
mp->Element[0] = tmp;
mp->Size ++;
return;
} int pos;
for(pos = 0; pos < mp->Size; pos ++)
{
int ans = MAP_Compare(&mp->Element[pos], &tmp);
if(ans == 0)
{
mp->Element[pos] = tmp;
return;
}
else if(ans > 0)
{
break;
}
} for(int i = mp->Size; i > pos; i --)
{
mp->Element[i] = mp->Element[i - 1];
}
mp->Element[pos] = tmp;
mp->Size ++;
} void MAP_Erase(MAP_TypeDef* mp, MAP_TypeKey key)
{
MAP_Element tmp;
tmp.Key = key; int pos;
for(pos = 0; pos < mp->Size; pos ++)
{
int ans = MAP_Compare(&mp->Element[pos], &tmp);
if(ans == 0)
{
break;
}
else if(ans > 0)
{
return;
}
} mp->Size --;
for(int i = pos; i < mp->Size; i ++)
{
mp->Element[i] = mp->Element[i + 1];
}
} char MAP_Get(MAP_TypeDef* mp, MAP_TypeKey key, MAP_TypeValue* out)
{
MAP_Element tmp;
tmp.Key = key; int pos = MAP_Find(mp, tmp.Key);
if(pos == -1)
{
return 1;
} *out = mp->Element[pos].Value;
return 0;
} char MAP_Set(MAP_TypeDef* mp, MAP_TypeKey key, MAP_TypeValue value)
{
MAP_Element tmp;
tmp.Key = key;
tmp.Value = value; int pos = MAP_Find(mp, tmp.Key);
if(pos == -1)
{
return 1;
} mp->Element[pos] = tmp;
return 0;
}

简易Map模板的更多相关文章

  1. PHP实现简易的模板引擎

    PHP实现简易的模板引擎 1.MVC简介 MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式(详情自己百度): 1. Mode ...

  2. 简易js模板引擎

    前面 js 模板引擎有很多很多,我以前经常用 art-template ,有时候也会拿 vue 来当模板引擎用. 直到...... 年初的时候,我还在上个项目组,那时候代码规范是未经允许不能使用 [外 ...

  3. Map 模板

    #include<stdio.h> #include<iostream> #include<map> using namespace std; typedef pa ...

  4. 一个极其简易版的vue.js实现

    前言 之前项目中一直在用vue,也边做边学摸滚打爬了近一年.对一些基础原理性的东西有过了解,但是不深入,例如面试经常问的vue的响应式原理,可能大多数人都能答出来Object.defineProper ...

  5. 基于vite2+electron12后台管理模板|Electron后台框架系统

    前一溜时间有给大家分享一个 electron+vite跨端短视频 项目.这次分享的是vite2.x和electron实现跨平台后台框架,支持国际化多语言配置.导航菜单+树形菜单两种路由菜单模式.展开/ ...

  6. JS模板引擎 :ArtTemplate (2)

    上一篇初略的介绍了一下javascript中的模板引擎,有兴趣的可以戳 这里 . 这一篇将带着大家一起做一个简易的模板引擎, 上一篇介绍到:模板引擎其实做的就是两件事. 根据一定的规则,解析我们所定义 ...

  7. Zabbix实战-简易教程系列

    一.基础篇(安装和接入) Zabbix实战-简易教程--总流程  Zabbix实战-简易教程--整体架构图 Zabbix实战-简易教程--DB安装和表分区 Zabbix实战-简易教程--Server端 ...

  8. 一个简单的PHP模板引擎

    PHP早期开发中通常是PHP代码和HTML代码混写,这也使代码中充斥着数据库操作,逻辑处理等.当项目不大时,这样的代码还可以接受,但是随着项目不断扩大,我们就会发现同一个文件中同时存在前端逻辑和后端处 ...

  9. 6、jeecg 笔记之 自定义excel 模板导出(一)

    1.前言 jeecg 中已经自带 excel 的导出导出功能,其所使用的是 easypoi,尽管所导出的 excel 能满足大部分需求, 但总是有需要用到自定义 excel 导出模板,下文所用到的皆是 ...

  10. 三个小时学会wordpress模板制作

    最近接了一个项目需要用wordpress建站,版面相对简单,ytkah就琢磨着自己来设计wordpress模板,首页栏目页文章页(很多网站无外乎就这些页面),其中栏目页和首页又很像,都是调用文章列表. ...

随机推荐

  1. 前端随笔0:URL与状态的双向绑定

    记录一些最近写前端的思考总结,也算是给自己的技术随笔开个篇 在接触以 React,Vue 为代表的工程化前端框架前,我还是一个拿着 jQuery 手撸特效和手写 CSS 的切图仔,捣鼓 Vue 时接触 ...

  2. Canonical为所有支持的Ubuntu LTS系统发布了新的Linux内核更新

    Canonical近日为所有支持的Ubuntu LTS系统发布了新的Linux内核更新,以解决总共19个安全漏洞. 新的Ubuntu内核更新仅适用于长期支持的Ubuntu系统,包括Ubuntu 22. ...

  3. pdf.js 跨域完美解决!

    在网上查看很多方法去解决此类跨域问题,及如何动态加载pdf文件.看来看去 请求的由后台处理加header头的  pdf.js 自带的 获取地址栏param参数值的 都是很麻烦的步骤并且有时不能有效解决 ...

  4. 只会Jquery,后端程序员如何学会前端(webpack,react,babel,es5,es6)

    写在前 希望通过短暂的学习,可以达到一下目标: 1.能看懂现在前端的工程化手段 2.知道当前前端群体中大致的解决问题的思路 3.当前的问题在哪里,技术发展趋势是什么 4.建立起自己的认知模型 文章内容 ...

  5. 对称加密、非对称加密 与 HTTPS

    一.对称加密(Symmetric Cryptography)对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key). ...

  6. WSL2安装nvm并配置npm镜像源

    1.下载安装脚本并执行 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash 2.关闭命令行后 ...

  7. elasticsearch别名

    es创建别名的好处: 1.不暴露索引名 2.可以为多个结构类似的索引(动态索引)创建相同的别名,查询的时候直接查询别名 ,然后自动匹配多个索引. 在不同的索引创建窗口.比如,如果为数据创建了每日索引, ...

  8. windows mongo 开启副本集 6.x版本 mongo : 无法将“mongo”项识别为 cmdlet、函数、脚

    mongo报错 当前使用版本6.0.3,bin目录下并没有mongo.exe,所以没有mongo命令, 需要下载 https://www.mongodb.com/try/download/shell  ...

  9. nvm安装及使用(windon/mac)

    有必要说一下nvm,因为大家做前端对node都很熟悉吧.前端的很多项目中都依赖node,还有可能每个项目依赖的node版本不一样,这样我们就上了nvm. nvm 是node Version Manag ...

  10. word生成产生错误的原因

    技术背景 很多时候我们网站或者系统需要提供一些word文件,例如证明.docx或者订单.docx等文件供用户下载打印等. 用Java操作word文档,毫无疑问,当下最流行apache poi,对于po ...