easyC-API中关于动态数组(Vector)的实现与使用方法简介
Written by 陈炬 on September 3, 2008 – 6:53 pm - 2 views动态数组在C语言中是比较常用的,实现起来也是很简单明了的,这篇文章我简单给出一个动态数组的实现(easyC-API中的实现与此基本一致,稍稍复杂些)。首先,定义动态数组如下:
typedef struct easyc_vector{ int size; int base_size; int actual_size; eType *base; eType (*get)(int, const struct easyc_vector *); void (*set)(int,eType,const struct easyc_vector *); eType (*remove)(int,struct easyc_vector *); void (*sort)(int (*compare)(const void *,const void *),struct easyc_vector *s); void (*add)(eType,struct easyc_vector *); }c_vector;
eType是数据类型,这里我们假设它是整型。
动态数组的初始化由函数make_vector负责,具体函数的实现我就不给出了。可以看出这个结构支持动态数组的创建,插入,查找,删除,添加,取长度,及排序等基本操作。这些操作对于数组而言,已经是相当够用了。
可能有朋友对它的排序如何实现感兴趣,这里排序是通过系统标准库中的qsort实现的。这是一个小技巧。可以看到排序函数的定义如下:
void (*sort)(int (*compare)(const void *,const void *),struct easyc_vector *s);
,需要的参数是一个用户实现的比较大小的函数,及一个指向动态数组的指针。我们来看看它是如何把排序的工作委托给qsort的,以下是这个函数的实现:
void easyc_vector_sort(int(*compare)(const void *a ,const void *b),c_vector *s){ qsort(s->base,s->size,sizeof(eType),compare); return; }
感谢函数指针,使得我们能把功能的委托变的更加容易与自然。
以下的代码是对这个动态数组简单的使用,可以看到,使用起来还是蛮自然的。
#include #include"easyc_ds.h" int cmp(const void*a,const void *b){ return *(eType *)a-*(eType *)b; } int main(){ c_vector s; s=make_vector(1); s.add(1,&s); s.add(5,&s); s.add(3,&s); s.sort(cmp,&s); printf("%d\n",s.get(0,&s)); printf("%d\n",s.get(1,&s)); printf("%d\n",s.get(2,&s)); return 0; }
easyc_ds.h定义了所有数据结构的结构,声明了所有的方法。当然您在编译以上测试代码的时候还需要使用我们的静态库(libeasyc_ds.a)。
如果您对我们的代码有兴趣,可以去easyC-API的主页上获取最新的源代码,二进制库文件,测试代码及makefile文件。如果您使用的是windows系统,我们编译好的二进制文件会不兼容,请您在自己编译器上重新编译,至于源代码,它是跨平台的。 ![]()
| Posted in » 




