非红黑树,排序+二分搜索,查找修改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. C#/JS 压缩到指定大小的图片 (内存不足问题修改)

    //因为浏览器安全问题,无法获取上传图片地址,需要先存一遍然后再获取地址作参数上传 var des = CompressImage(@"C:\Users\PC\Pictures\测试\165 ...

  2. 解决veture和eslint冲突的问题

    vscoder自带的veture和eslint存在冲突,主要表现在 末尾逗号,分号,单双引号的不一致.解决办法:1.npm install --save-dev prettier2.在根目录新建.pr ...

  3. Kronecker convolution 克罗内克卷积理解

    在了解空洞卷积时候发现了Kronecker convolution是对空洞卷积的改进,于是学习了一下 ,原文连接:1812.04945v1.pdf (arxiv.org) 个人理解如下: 首先,对于一 ...

  4. 如何设置VBA代码的密码?如何取消VBA代码的密码?

    经常有网友问,用Access把软件开发好了,怎么样设置VBA代码的密码?以保护自己的代码不被同事修改.这里简单整理了一下.设置VBA代码的密码及取消VBA代码的密码步骤如下:1.打开任意一个窗体,进入 ...

  5. ucloud 签名算法

    # Python version:3.6.5 import hashlib import urllib from urllib.parse import urlparse params = { &qu ...

  6. vscode自定义工作目录

    vscode作为目前最受欢迎的编辑器,一直用vscode,但是最近清理c盘,发现vscode的目录,插件和数据目录,占据了上G的空间,那么,如何自定义 vscode的工作目录和数据目录呢,这里参考了一 ...

  7. java springboot+rabbitmq+websocket 订阅展示

    记录工作 需要的依赖 <!--fastjson坐标--> <dependency> <groupId>com.alibaba</groupId> < ...

  8. springcloud zuul网关整合swagger2,swagger被拦截问题

    首先感谢一位博主的分享https://www.cnblogs.com/xiaohouzai/p/8886671.html 话不多说直接上图和代码 首先我们要有一个springcloud分布式项目 我就 ...

  9. linux下安装mysql的方式

    总体来说,mysql安装有两种方式,一个是源码安装,另一个是使用官方编译好的二进制文件安装. 1.使用rpm方式安装 原文地址:https://blog.csdn.net/liuxw1/article ...

  10. windows10默认的EDGE浏览器进行切换窗口的操作修改

    Windows 10 修改 Alt+Tab 键 切换 新版 Microsoft Edge 单个标签页/窗口 解决方案:在 Windows 设置 的搜索框中 搜索 alt,选择 选择按下 Alt+Tab ...