C语言用堆和双向链表实现可变长度数组

来源:互联网 发布:淘宝马甲是什么意思啊 编辑:程序博客网 时间:2024/06/07 08:40

最近,我在研究网络程序,突然发现C语言原生数据的一个很要命的问题——必须提前声明使用内存的长度。

当然,C语言的这种要求是符合情理的,毕竟只有定长的变量才能放在函数的栈中。

可是网络上的数据一般不具有预知性,有时很大上百M,有时很小,可能也就几个字节。

于是,我想怎么样才能像其他语言那样实现对数据的不限长度的存取呢?

首先应该使用malloc函数把数据放在堆中。但是问题又来了。

malloc也是需要可以大小的。

于是,我陷入的困惑。终于,想到了大学期间学到的一门无聊的课程——《数据结构》。

先给这个可变长度的数组起个名字:Unfix Array,简称UFA。

UFA应该包含指向第一个UFA_entity和最后一个UFA_entity的指针,最好还有一个指向当前UFA_entity的指针。

每个UFA_entity应该包含前向和后向的指针,还要有一个指向数据的指针。

这样就成了下面这张图:

用C语言来写就是:

struct UFA_entity{    int size; //size of data in this entity    void *data; //adress to the data in heap    struct UFA_entity *pre;    struct UFA_entity *next;};struct UFA_unfixarray{    int count; //number of entity in the array    struct UFA_entity *head; // first entity    struct UFA_entity *tail; // last entity    struct UFA_entity *now; // recent position in the array};

然后就是一些常用的功能函数,用来实现诸如初始化、添加、定位、插入、输出、删除、完全释放等具体的功能。

完成的C代码,可在 http://code.google.com/p/unfix-length-array-for-c/ 下载。