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系统,我们编译好的二进制文件会不兼容,请您在自己编译器上重新编译,至于源代码,它是跨平台的。 :)

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

Google浏览器Chrome即将发布

September 2, 2008 – 9:39 am

虽然不是google Fans,不过作为google服务的重度依赖者,对google的产品一直都蛮关注。刚刚在求实上看到有同学介绍google开发的浏览器,很Orz。我一直认为google brower, google OS, google phone都是GFans...

关于C语言的typedef

September 1, 2008 – 9:41 am

注:本文的内容只是对自己学习到知识的一些简单总结,并没有考证过C的规范和手册进行求证。
很多文章,甚至于很多教材,对c语言的typedef的解释是有错误的,以致于许多学习C语言的...

Feedsky的服务有些不稳定

August 31, 2008 – 4:17 pm

今天我的种子feed.feedsky.com/juchen以及绑定的域名feed.kylogs.com都无法访问。访问feedsky的时候也出现了mysql数据库错误。另外,访问feed.feedsky.com/juchen的话如果运气好,耐心足的话还能访问到,而...

easyC-API项目介绍

August 31, 2008 – 10:06 am

/*———————————————————————————————————R...

关于

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

订阅我的Blog

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

其他blog

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