首页 > 其他分享 >简易Map模板

简易Map模板

时间:2023-02-24 21:26:05浏览次数:35  
标签:tmp Map MAP int pos Element 简易 mp 模板

非红黑树,排序+二分搜索,查找修改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;
}

 

标签:tmp,Map,MAP,int,pos,Element,简易,mp,模板
From: https://www.cnblogs.com/PolarBearINBrown/p/17153188.html

相关文章

  • 视图解析、模板引擎
    视图解析指springboot在处理完请求想要跳转到某一个页面的过程,转发或者重定向,跳转到某个页面springboot默认不支持JSP,需要引入第三方模板引擎技术实现页面渲染、跳转。......
  • svg symbol模板
    svgsymbol<body><!--使用svg--><svgclass="svg-icontext-blue-500"style="font-size:5rem"aria-hidden="true"><usexlink:href="#icon-photo"fill/></......
  • 吃透8图1模板,人人可以做架构
    文章持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+......
  • 分享一个基本的分页模板(类似的分页都有工具,注意思想)
    publicclassBasePage<E>implementsSerializable{privatestaticfinallongserialVersionUID=1L;privateIntegerpageNo;privateIntegerpageSi......
  • 模板合集
    模板算法冒泡排序voidbubble_sort(int*a,intn){ boolf=1; while(f){ boolf=0; for(inti=1;i<n;i++) if(a[i]>a[i+1])swap(a[i],a......
  • (3). Vscode 配置模板输出
    1.点击设置,选择配置用户代码片段2.选择vue.json3.配置快捷模板......
  • python基于word模板批量生成word文件
    1、需要用到docxtpl库,用于操作word模板安装:pipinsatlldocxtpl处理之前的word模板 处理后的word 下面直接上代码揭开它的神秘面纱:第一步,读取excel中的内容imp......
  • 设计模式之(13)--模板方法模式
    今天我们来学习下模板方法设计模式。模板方法(TemplateMethodPattern):抽象的父类中定义一个操作中算法的骨架,而将一些步骤延迟到子类中。使得子类可以不改变一......
  • [Typescript] Identity function - Reverse mapped types with identity function 02
    import{Equal,Expect}from'../helpers/type-utils';exportfunctionmakeEventHandlers<Textends{[KeyinkeyofT]:(key:Key)=>void}>(obj:T){r......
  • Python 简易小项目
    Prerequisite实习的时候有个这样要求,虽然我不太想做,但毕竟是工作(其实还有点意思),于是我花了几个小时出(魔改)了几道,此贴作个记录构建一个简易图书馆#!/usr/bin/envpytho......