简易Map模板
非红黑树,排序+二分搜索,查找修改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模板的更多相关文章
- PHP实现简易的模板引擎
PHP实现简易的模板引擎 1.MVC简介 MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式(详情自己百度): 1. Mode ...
- 简易js模板引擎
前面 js 模板引擎有很多很多,我以前经常用 art-template ,有时候也会拿 vue 来当模板引擎用. 直到...... 年初的时候,我还在上个项目组,那时候代码规范是未经允许不能使用 [外 ...
- Map 模板
#include<stdio.h> #include<iostream> #include<map> using namespace std; typedef pa ...
- 一个极其简易版的vue.js实现
前言 之前项目中一直在用vue,也边做边学摸滚打爬了近一年.对一些基础原理性的东西有过了解,但是不深入,例如面试经常问的vue的响应式原理,可能大多数人都能答出来Object.defineProper ...
- 基于vite2+electron12后台管理模板|Electron后台框架系统
前一溜时间有给大家分享一个 electron+vite跨端短视频 项目.这次分享的是vite2.x和electron实现跨平台后台框架,支持国际化多语言配置.导航菜单+树形菜单两种路由菜单模式.展开/ ...
- JS模板引擎 :ArtTemplate (2)
上一篇初略的介绍了一下javascript中的模板引擎,有兴趣的可以戳 这里 . 这一篇将带着大家一起做一个简易的模板引擎, 上一篇介绍到:模板引擎其实做的就是两件事. 根据一定的规则,解析我们所定义 ...
- Zabbix实战-简易教程系列
一.基础篇(安装和接入) Zabbix实战-简易教程--总流程 Zabbix实战-简易教程--整体架构图 Zabbix实战-简易教程--DB安装和表分区 Zabbix实战-简易教程--Server端 ...
- 一个简单的PHP模板引擎
PHP早期开发中通常是PHP代码和HTML代码混写,这也使代码中充斥着数据库操作,逻辑处理等.当项目不大时,这样的代码还可以接受,但是随着项目不断扩大,我们就会发现同一个文件中同时存在前端逻辑和后端处 ...
- 6、jeecg 笔记之 自定义excel 模板导出(一)
1.前言 jeecg 中已经自带 excel 的导出导出功能,其所使用的是 easypoi,尽管所导出的 excel 能满足大部分需求, 但总是有需要用到自定义 excel 导出模板,下文所用到的皆是 ...
- 三个小时学会wordpress模板制作
最近接了一个项目需要用wordpress建站,版面相对简单,ytkah就琢磨着自己来设计wordpress模板,首页栏目页文章页(很多网站无外乎就这些页面),其中栏目页和首页又很像,都是调用文章列表. ...
随机推荐
- 跳板攻击之:frp代理转发
跳板攻击之:frp代理转发 目录 跳板攻击之:frp代理转发 1 frp 介绍 2 frp 原理 3 实验环境 3.1 实验准备 3.2 实验拓扑 4 frp代理socks 5 frp代理stcp安全 ...
- js根据指定字段数据去重
//根据id去重 function unique(arr1) { const res = new Map(); return arr1.filter((a) => !res.has(a.id) ...
- Python学习方向
Python python学习方向 1.web开发 2.网络爬虫 3.人工智能 4.云计算 5.软件测试
- left join(二)
left join 通俗的解释:以左表为主表,返回左表的所有行,如果右表中没有匹配,则依然会有左表的记录,右表字段用null填充.看起来非常好理解,但实际操作的过程中可能会有一些很容易被忽略的点. 一 ...
- Visual Studio Code C / C++ 语言环境配置的历程
前言 从大一开始学习c++用的dev-c++,后来看到老师用的是vs code,实在是馋它的颜值便去下了vs 2017.至于为什么下载vs 2017呢?是因为下载的时候我以为他们是一样的,便下了v ...
- Android Studio连接SQLlite
1. MainActivity.java package com.example.dbproject;import android.database.sqlite.SQLiteDatabase;imp ...
- input type='number' 去除小箭头 clear arrow
input type='number' 去除小箭头 两种方法 方法一 For chrome, Safari, Edge, Opera : input::-webkit-outer-spin-butto ...
- disabled属性的简介和使用
一.disabled属性的简介和使用 Html中的input元素.button元素.option元素等都具有一个disabled属性. disabled对a标签不起作用当赋予该属性时该元素将变得不可交 ...
- oracle 2个数组列,剔除数组重复的数据。
一.下面这样不规则的,数据如何剔除掉.循环筛选replace替换掉. 序号 正常时间 剔除时间 1 2022-12-19,2022-12-20,2022-12-21,2022-12-22,202 ...
- Bugku-不可破译的密码[wp]
一 题目分析 flag.txt cipher.txt (1)密码表形式和维吉尼亚密码一样 (2)看到504Q0304 很容易想到 504B0304 Zip文件头. 二 解题步骤 2.1 解密密文 根据 ...