C实现JAVA类似ArrayList的静态链接库
2024-08-31 13:38:42
文件结构:
- ArrayList.h:头文件
- ArrayList.c:实现头文件中的功能
- ArrayListTest.c:测试
ArrayList.h
头文件的基本框架:
#ifndef _ARRAYLIST_H
#define _ARRAYLIST_H
// 头文件体
#endif
头文件中应包含结构体定义,必要的宏定义,需要直接在其他文件中使用的函数的定义
Java中的ArrayList是实现引用的数组,而不是对象的数组,在连续的存储空间中存放的是引用,而不是对象实体,所以在实现的时候采用void**,那么这样实现的ArrayList将可以含有任意类型的变量,坏处就是需要在使用的时候人为的解析
capacity是当前item_list申请的长度
my_size是当前item_list中存放了多少个元素。之所以不用size是为了和接下来实现的size函数区别
为实现通过结构体通过调用成员的方式调用函数,而不是直接通过函数名调用函数。在结构体中声明函数指针用以调用函数。这样就可以在ArrayList.c中将函数的作用域声明为只有本文件可见,避免和其他库函数函数名冲突。但是因为结构体中包含这个文件中函数的指针,仍然可以调用函数。
typedef struct ArrayList ArrayList;
struct ArrayList{
void** item_list;
int capacity;
int my_size;
// 函数指针
}
为实现函数指针的赋值,需要声明初始化函数,在初始化函数中将函数指针赋值,所以这两个函数就不能放到结构体中:
// create a new ArrayList
int init_ArrayList(ArrayList*);
// create a new ArrayList with specified capacity
int init_ArrayList_capacity(ArrayList*,int capacity);
ArrayList.c
包含头文件,实现函数
因为这些函数无法知道是哪个结构体调用自己的,所以都需要将调用的结构体传进去
ArrayListTest.c
包含头文件
调用的方式类似:
al.retainAll(&al,aap+3,11);
al.trimToSize(&al);
源码地址:
https://github.com/biaoJM/C-Wheel-ArrayList
最新文章
- 原创 C++作用域 (二)
- Android开发学习——android存储
- Power BI for Office 365(一)移动端应用
- hdu 5427 A problem of sorting
- input text 字体的影响
- bzoj 2002: [Hnoi2010]Bounce 弹飞绵羊 動態樹
- js中setTimeout/setInterval定时器用法示例
- osg添加纹理示例
- hdu1573X问题(不互素的中国剩余定理)
- python进阶1--数据库支持
- Linux应用环境实战05:在Ubuntu 14.10中借用Windows的字体 (转)
- Bootstrap Paginator分页插件
- 剑指offer替换空格
- Mac OS10.11更新ruby,gem,安装cocoapods
- jquery deferred done then区别
- [BZOJ4008]亚瑟王
- SQL Server的case when用法
- QT连接postgreSQL
- redis安全问题【原】
- LOJ #10130 点的距离