easyC-API中关于动态数组(Vector)的实现与使用方法简介

Written on September 3, 2008 – 6:53 pm | by 陈炬 | 58 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系统,我们编译好的二进制文件会不兼容,请您在自己编译器上重新编译,至于源代码,它是跨平台的。 :)

Rating: 2.9/5 (16 votes cast)

推荐购买的书籍--都是牛书

相关文章

我来说下

关于

我叫陈炬,正在天津大学计算机学院->知识工程与科学研究所攻读硕士研究生。今年应届。您可以在我的自我介绍获得更多关于我的信息

订阅我的Blog


本站RSS地址| [这是什么?]
订阅到Google Reader | 订阅到 抓虾 阅读器 | 订阅到 鲜果 阅读器

其他blog

我还有一个英文blog,非常的无聊,琐碎,许多的语法错误。请谨慎访问。
Find entries :