TinySTL-一个简单的c语言数据结构库


TinySTL

github地址


这是一个用于嵌入式平台的c语言数据结构库的简单实现
该库采用了类似高级语言oop的程序设计思想,为方便在嵌入式设备上使用,对常用的数据结构进行了简单的实现.可在嵌入式平台上实现消息队列等常见的应用。方法的命名基本采用了java的格式。可在.exe文件中进行测试,也可使用make工具重新编译代码,所有数据结构基本采用的链表的形式。

  1. 单向链表-List
  2. 队列-Queue
  3. 栈-Stack
  4. Map集合

Tiny_系列:

  • 单向链表–Tiny_List

  • 队列-----Tiny_Queue

  • 栈-------Tiny_Stack

  • Map集合–Tiny_Map

    Tiny_ 系列继承自List,Stack等父类,该类的结构体的前面一些数据保存方式与父类完全相同,在内存中,继承自父类的Tiny系列在前面的内存上与父类一致,因此可以用一个父类型指针指向子类型内存,当做父类型使用Tiny_ 系列增加了一个data_size的属性,在初始化时指定每个节点对象的内存空间,不用每次添加数据时指定需要占用的内存空间大小使用上比他的父类方便了许多,但没有父类那么灵活。相当于在初始化时指定了数据类型,有种泛型的味道。

Warning!!!

  • 当data_size为0时,得到的数据是数据域的指针,但此时没有开辟额外的空间,而是用此指针来保存数据,因此可以直接使用它
  • 由于指针占用四个字节,可以保存任意类型的数据四个字节,只要注意保存和取出的时候采用相同的格式就可以
  • 比如,put(float),取出时把数据放到一个float型变量里就可以了
  • 当data_size不为0时,得到的只是指向数据域的一个指针,该指针指向一块大小为data_size的堆数据空间,使用时要遵循指针使用的相关规则

How to use:

新建数据结构对象有两种方式,一中是在栈中分配内存,第二种是
在堆中分配内存
Tiny_ 系列用法和原来的一样,只是不用往函数里传数据域内存空间的大小。

  • 当data_size=0时,使用每个节点的指向数据域的指针存放数据(四个字节),不开辟新的内存,并且传入的数据直接保存在节点里

  • 当data_size!=0时,开辟相应的内存空间用来存放数据
    每个节点占用12个字节的内存,每个数据结构对象占用几十个字节的数据
    传入的数据为一个指针,指向想要保存的数据的内存,然后把data_size个字节
    的数据复制到数据节点新开辟的内存中

    在stm32上使用时,编译器要求较严格时,数据data必须为(void)类型*

  1. 栈分配内存(Demo):
List list = new_List(1024);     //内存限制为1k
list.addAt(&list, index, data, data_size);
list.removeAt(&list, index);
list.get(&list, index);
list.set(&list, index, data, data_size);
  1. 堆分配内存
Map* map_ptr = (Map*)malloc(sizeof(Map));
(*map_ptr) = new_Map(1024);
map_ptr->push(map_ptr, 1, 0, "hello", 10);
(*map_ptr).push(map_ptr, 0, 0, "world", 10);

为什么采用单链表?

如果采用双链表的话,在链表很长的时候查找可以快很多,但内存占用较大
综合考虑下在嵌入式平台上选择实现占用内存相对较小的单链表

方法概览:

//***********************************************List概览
 //属性:
 length--------链表长度
 memory_size---该链表占用内存空间的大小,单位-字节
 memory_limit--限制该链表占用多少内存空间,单位-字节
 
 //方法集合:                                           data_size = 0的时候将数据域指针用来存储数据
 List new_List(unsigned int memory_limit);                                                 //双向链表初始化
 void* get(List *list, unsigned int index);                                                //获取索引处的元素
 unsigned int getSize(List *list, unsigned int index);                                     //获取索引处的元素的大小
 
 int add(List *list, void* data, unsigned int data_size);                                  //往链表尾部添加数据
 int addAt(List *list, unsigned int index, void* data,unsigned int data_size);            //往链表指定位置添加数据
 int set(List *list, unsigned int index, void* data,unsigned int data_size);              //更新链表指定位置的值
 int remove(List *list);                                                                   //删除链表尾部的数据
 int removeAt(List *list, unsigned int index);                                             //删除链表指定位置的数据
 int index(List *list, void* data, unsigned int data_size);                                //取得指定元素索引
 int indexFrom(List *list, unsigned int index, void* data, unsigned int data_size);        //从index处开始取得元素索引
 int delete_List(List* list);                                                              //删除整条链表并释放内存空间
 
 unsigned int max(List *list,int (*compare)(void* first, void* second, unsigned int data_size));                         //获取最大元素的索引
 unsigned int maxOf(List *list, unsigned int index,int (*compare)(void* first, void* second, unsigned int data_size));   //获取第index大元素的
 unsigned int min(List *list,int (*compare)(void* first, void* second, unsigned int data_size));                         //获取最小元素的索引
 unsigned int minOf(List *list, unsigned int index,int (*compare)(void* first, void* second, unsigned int data_size));   //获取第index小元素的

//********************************************Queue概览
 属性:
 length--------队列长度
 memory_size---该链表占用内存空间的大小,单位-字节
 memory_limit--限制该链表占用多少内存空间,单位-字节

 //方法集合:                                           data_size = 0的时候将数据域指针用来存储数据(四个字节)
 Queue new_Queue(unsigned int memory_limit);                                                             //队列初始化
 int push(Queue *queue, void* data, unsigned int data_size);                                             //往队列中添加数据
 int pop(Queue *queue);                                                                                  //从队列中弹出数据
 void* get(Queue *queue);                                                                                //获得队列中元素的值
 unsigned int getSize(Queue *queue);                                                                     //获得队列中元素所占内存空间的大小
 int delete(Queue *queue);                                                                               //删除队列

//***********************************************Stack概览
 //属性:
 length--------栈长度
 memory_size---该链表占用内存空间的大小,单位-字节
 memory_limit--限制该链表占用多少内存空间,单位-字节

 //方法集合:               data_size = 0的时候将数据域指针用来存储数据(四个字节),不为0时自动开辟data_size字节大小的空间用来存放数据
 Stack new_Stack(unsigned int memory_limit);                                                             //栈初始化
 int push(Stack *stack, void* data, unsigned int data_size);                                             //往栈中添加数据
 int pop(Stack *stack);                                                                                  //从栈中弹出数据
 void* get(Stack *stack);                                                                                //获得栈中元素的值
 unsigned int getSize(Stack *stack);                                                                     //获得栈中元素所占内存空间的大小
 int delete(Stack *stack);                                                                               //删除栈

//***********************************************Map概览
 //属性:
 key_head-------键链表
 data_head------数值链表
 length--------Map集合长度
 memory_size---该Map集合占用内存空间的大小,单位-字节
 memory_limit--限制该Map集合占用多少内存空间,单位-字节

 //方法集合:               data_size和key_size = 0的时候将数据域指针用来存储数据(四个字节),不为0时自动开辟data_size字节大小的空间用来存放数据
 Stack new_Map(unsigned int memory_limit);                                                 //栈初始化
 
 int push(Map* map, void* key, unsigned int key_size, void* data, unsigned int data_size);      //往Map集合中添加数据
 int remove(Map* map, void* key, unsigned int key_size);                                        //删除key对应的键值对
 void* get(Map* map, void* key, unsigned int key_size);                                         //获得Map键值对应的数据元素指针
 void* getKey(Map* map, void* key, unsigned int key_size);                                      //获得Map数据值对应的键值指针
 unsigned int getSize(Map* map, void* key, unsigned int key_size);                              //获得Map键值对应的元素所占的内存大小
 unsigned int getKeySize(Map* map, void* key, unsigned int key_size);                           //获得Map键对应的元素所占的内存大小
 List* values(Map* map);                                                                        //返回map的值集合,返回类型是一个链表集合
 List* keySet(Map* map);                                                                        //返回map的键值集合,返回类型是一个链表集合
 int delete(Map* map);                                                                          //删除map集合
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
16进制10进制.txt 32.txt asm.txt Crctable.txt C标志符命名源程序.txt erre.txt erre2.txt ff.txt for循环的.txt list.log N皇后问题回溯算法.txt ping.txt re.txt source.txt winsock2.txt ww.txt 万年历.txt 万年历的算法 .txt 乘方函数桃子猴.txt 乘法矩阵.txt 二分查找1.txt 二分查找2.txt 二叉排序树.txt 二叉树.txt 二叉树实例.txt 二进制数.txt 二进制数2.txt 余弦曲线.txt 余弦直线.txt 傻瓜递归.txt 冒泡排序.txt 冒泡法改进.txt 动态计算网络最长最短路线.txt 十五人排序.txt 单循环链表.txt 单词倒转.txt 单链表.txt 单链表1.txt 单链表2.txt 单链表倒序.txt 单链表的处理全集.txt 双链表正排序.txt 反出字符.txt 叠代整除.txt 各种排序法.txt 哈夫曼算法.txt 哈慢树.txt 四分砝码.txt 四塔1.txt 四塔2.txt 回文.txt 图.txt 圆周率.txt 多位阶乘.txt 多位阶乘2.txt 大加数.txt 大小倍约.txt 大整数.txt 字符串查找.txt 字符编辑.txt 字符编辑技术(插入和删除) .txt 完数.txt 定长串.txt 实例1.txt 实例2.txt 实例3.txt 小写数字转换成大写数字1.txt 小写数字转换成大写数字2.txt 小写数字转换成大写数字3.txt 小字DIY-.txt 小字DIY.txt 小孩分糖果.txt 小明买书.txt 小白鼠钻迷宫.txt 带头结点双链循环线性表.txt 平方根.txt 建树和遍历.txt 建立链表1.txt 扫描码.txt 挽救软盘.txt 换位递归.txt 排序法.txt 推箱子.txt 数字移动.txt 数据结构.txt 数据结构2.txt 数据结构3.txt 数组完全单元.txt 数组操作.txt 数组递归退出.txt 数组递归退出2.txt 文件加密.txt 文件复制.txt 文件连接.txt 无向图.txt 时间陷阱.txt 杨辉三角形.txt 栈单元加.txt 栈操作.txt 桃子猴.txt 桶排序.txt 检出错误.txt 检测鼠标.txt 汉字字模.txt 汉诺塔.txt 汉诺塔2.txt 灯塔问题.txt 猴子和桃.txt 百鸡百钱.txt 矩阵乘法动态规划.txt 矩阵转换.txt 硬币分法.txt 神经元模型.txt 穷举搜索法.txt 符号图形.txt 简单数据.txt 简单计算器.txt 简单逆阵.txt 线性顺序存储结构.txt 线索化二叉树.txt 绘制圆.txt 编随机数.txt 网络最短路径Dijkstra算法.txt 自我复制.txt 节点.txt 苹果分法.txt 螺旋数组1.txt 螺旋数组2.txt 试题.txt 诺汉塔画图版.txt 读写文本文件.txt 货郎担分枝限界图形演示.txt 货郎担限界算法.txt 质因子.txt 输出自已.txt 迷宫.txt 迷宫问题.txt 逆波兰计算器.txt 逆矩阵.txt 逆阵.txt 递堆法.txt 递归桃猴.txt 递归车厢.txt 递推.txt 逻辑移动.txt 链串.txt 链栈.txt 链表十五人排序.txt 链表(递归).txt 链队列.txt 队列.txt 阶乘递归.txt 阿姆斯特朗数.txt 非递归.txt 顺序栈.txt 顺序表.txt 顺序队列.txt 骑士遍历1.txt 骑士遍历2.txt 骑士遍历回逆.txt 黑白.txt

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值