非红黑树,排序+二分搜索,查找修改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. Openfoam UPstream类探索

    前言 上篇文章我们大体捋顺了Pstream类,但上篇没有讲到的是Pstream类很多东西是从UPstream类继承来的 这次我们大体看一下UPstream类,以避免Pstream类内很多继承来的东西不 ...

  2. TNF诱导的关节破坏由IL-1介导

    TNF诱导的关节破坏由IL-1介导Zwerina J, et al. PNAS.2007;104:11742-7.TNF拮抗剂有效抑制人类类风湿关节炎(RA)的炎症和结构破坏.然而截至目前还不清楚TN ...

  3. K8S Pod Sidecar 应用场景之一-加入 NGINX Sidecar 做反代和 web 服务器

    Kubernetes Pod Sidecar 简介 Sidecar 是一个独立的容器,与 Kubernetes pod 中的应用容器一起运行,是一种辅助性的应用. Sidecar 的常见辅助性功能有这 ...

  4. vue路由中pdfjs插件使用及找不到 viewer.html解决

    官方下载: https://mozilla.github.io/pdf.js/getting_started/#download 同目录下pdfjs-2.12.313-dist.zip为官方下载包 此 ...

  5. PostgreSQL数据库切割和组合字段函数

    Postgresql里面内置了很多的实用函数,下面介绍下组合和切割函数一.组合函数1.concata.语法介绍 concat(str "any" [, str "any& ...

  6. LeetCode-386 字典序排数

    来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/lexicographical-numbers 题目描述 给你一个整数 n ,按字典序返回范围 [ ...

  7. LeetCode-2013 检测正方形

    来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/detect-squares 题目描述 给你一个在 X-Y 平面上的点构成的数据流.设计一个满足下 ...

  8. 如何在 JavaScript 中使用媒体查询

    前言 说起媒体查询想必大家最先想到的都是CSS中@media,没错,这是我们最常用的媒体查询方法,主要用来为我们的网站做适配处理. 比如: h1 { font-size: 2rem; color: g ...

  9. element-ui下表格头部字段hover显示tips信息

    记录一下表格头部加hover之后显示tips信息循环,或单独的el-table-column都可以哦 <el-table-column             prop="name&q ...

  10. SDN实验环境安装