zc_arraylist.h

/**
* 实现类似列表的功能
*
*/ #ifndef __zc_arraylist_h
#define __zc_arraylist_h #define ARRAY_LIST_DEFAULT_SIZE 32 //删除、比较两个函数类型声明
typedef void (*zc_arraylist_del_fn) (void *data);
typedef int (*zc_arraylist_cmp_fn) (void *data1, void *data2); typedef struct{
void **array; //指针的指针
int len;
int size;
zc_arraylist_del_fn del;
} zc_arraylist_t; zc_arraylist_t *zc_arraylist_new(zc_arraylist_del_fn del);
void zc_arraylist_del(zc_arraylist_t *a_list); int zc_arraylist_set(zc_arraylist_t *a_list, int i, void *data);
int zc_arraylist_add(zc_arraylist_t *a_list, void *data);
int zc_arraylist_sortadd(zc_arraylist_t *a_list, zc_arraylist_cmp_fn cmp, void *data); #define zc_arraylist_len(a_list) (a_list->len) //i从0开始
#define zc_arraylist_get(a_list, i) \
((i >= a_list->len) ? NULL : a_list->array[i]) //
#define zc_arraylist_foreach(a_list, i, a_unit) \
for(i = , a_unit = a_list->array[]; (i < a_list->len) && (a_unit = a_list->array[i], ); i++) #endif

zc_arraylist.h

#include <stdlib.h>
#include <string.h>
#include <errno.h> #include "zc_defs.h" zc_arraylist_t *zc_arraylist_new(zc_arraylist_del_fn del){
zc_arraylist_t *a_list; a_list = (zc_arraylist_t *)calloc(, sizeof(zc_arraylist_t));
if(!a_list){
zc_error("calloc fail, errno[%d]", errno);
return NULL;
} a_list->size = ARRAY_LIST_DEFAULT_SIZE;
a_list->len = ;
a_list->del = del; //this could be null
a_list->array = (void **)calloc(a_list->size, sizeof(void *));
if(!a_list->array){
zc_error("calloc fail, errno[%d]", errno);
free(a_list);
return NULL;
} return a_list;
} void zc_arraylist_del(zc_arraylist_t *a_list){
int i;
if(!a_list){
return;
}
if(a_list->del){
for(i=; i<a_list->len; i++){
//notice NULL
if(a_list->array[i]){
a_list->del(a_list->array[i]);
}
}
}
if(a_list->array){
free(a_list->array);
}
free(a_list);
return;
} /**
* static->function, external->internal
*/
static int zc_arraylist_expand_inner(zc_arraylist_t *a_list, int max){
void **tmp;
int new_size;
int diff_size; new_size = zc_max(a_list->size * , max);
tmp = (void **)realloc(a_list->array, new_size * sizeof(void *));
if(!tmp){
zc_error("realloc fail, errno[%d]", errno);
free(a_list->array); //notice no question?
return -;
} a_list->array = tmp;
diff_size = new_size - a_list->size;
if(diff_size){
memset(a_list->array + a_list->size, 0x00, diff_size * sizeof(void *));
}
a_list->size = new_size;
return ;
} int zc_arraylist_set(zc_arraylist_t *a_list, int idx, void *data){
//idx start 0
if(idx > a_list->size - ){
if(zc_arraylist_expand_inner(a_list, idx)){
zc_error("expand_internal fail");
return -;
}
} if(a_list->array[idx] && a_list->del){
a_list->del(a_list->array[idx]);
} a_list->array[idx] = data;
if(a_list->len <= idx){
a_list->len = idx + ;
}
return ;
} int zc_arraylist_add(zc_arraylist_t *a_list, void *data){
return zc_arraylist_set(a_list, a_list->len, data);
} //assume idx < len
static int zc_arraylist_insert_inner(zc_arraylist_t *a_list, int idx, void *data){
if(a_list->array[idx] == NULL){
a_list->array[idx] = data;
return ;
}
if(a_list->len + > a_list->size){
if(zc_arraylist_expand_inner(a_list, )){
zc_error("expand_internal fail");
return -;
}
}
memmove(a_list->array + idx + , a_list->array + idx, (a_list->len - idx) * sizeof(void *)); a_list->array[idx] = data;
a_list->len++;
return ;
} int zc_arraylist_sortadd(zc_arraylist_t *a_list, zc_arraylist_cmp_fn cmp, void *data){
int i;
for(i = ; i < a_list->len; i++){
if((*cmp)(a_list->array[i], data) > ){
break;
}
} if(i == a_list->len){
return zc_arraylist_add(a_list, data);
}else{
//i < a_list->len
return zc_arraylist_insert_inner(a_list, i, data);
}
}

用zc_arraylist实现一个字符串列表功能,测试zc_arraylist

#include <stdio.h>
#include <stdlib.h>
#include <string.h> #include "zc_defs.h" char *char_new(char *p_str){
char *p = (char *)calloc(, strlen(p_str) + );
if(!p){
return NULL;
}
strncpy(p, p_str, strlen(p_str));
return p;
} void char_del(void *p_str){
if(!p_str){
return;
}
free(p_str);
} int main(){
zc_arraylist_t *char_list = zc_arraylist_new(char_del);
zc_arraylist_add(char_list,char_new("www.baidu.com"));
zc_arraylist_add(char_list,char_new("www.qq.com"));
zc_arraylist_add(char_list,char_new("www.ifeng.com")); int i;
char *char_item;
zc_arraylist_foreach(char_list, i, char_item){
printf("%s\n", char_item);
} zc_arraylist_del(char_list);
}

测试结果

zlog学习笔记(zc_arraylist)的更多相关文章

  1. zlog学习笔记(level_list)

    level_list.h /** * */ #ifndef __zlog_level_list_h #define __zlog_level_list_h zc_arraylist_t *zlog_l ...

  2. zlog学习笔记(mdc)

    mdc.h #ifndef __zlog_mdc_h #define __zlog_mdc_h #include "zc_defs.h" typedef struct zlog_m ...

  3. zlog学习笔记(level)

    level.h /** * */ #ifndef __zlog_level_h #define __zlog_level_h #include "stdio.h" #include ...

  4. zlog学习笔记(zc_hashtable)

    zc_hashtable.h /** * hashtable */ #ifndef __zc_hashtable_h #define __zc_hashtable_h typedef struct z ...

  5. zlog学习笔记(zc_profile)

    zc_profile.h #ifndef __zlog_profile_h #define __zlog_profile_h #define EMPTY() #define zc_assert(exp ...

  6. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  7. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  8. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  9. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

随机推荐

  1. android中Post方式发送HTTP请求

    Post方式比Get方式要复杂一点,因为该方式需要将请求的参数放在http请求的正文中,所以需要构造请求体. 步骤: 1.构造URL URL url = new URL(PATH); 2.设置连接 H ...

  2. VSS提示"Could not find the Visual SourceSafe Internet Web Service connection information for the specified database

    转自:http://www.cnblogs.com/qqflying/archive/2007/12/18/1004051.html VSS连接错误提示: ====================== ...

  3. Android读取自定义View属性

    Android读取自定义View属性 attrs.xml : <?xml version="1.0" encoding="utf-8"?> < ...

  4. Android音乐播放器源码(歌词.均衡器.收藏.qq5.0菜单.通知)

    一款Android音乐播放器源码,基本功能都实现了 qq5.0菜单(歌词.均衡器.收藏.qq5.0菜单.通知) 只有向右滑动出现,菜单键和指定按钮都还没有添加. 源码下载:http://code.66 ...

  5. DB2导入导出数据库数据

    导出数据库中数据 在db2cmd命令下生成建库脚本(-z指定模式名) db2look -d BBS -z db2admin -u db2admin -e -o bbs.sql 在db2cmd命令下导出 ...

  6. 文件与目录的rwx权限

    r(Read,读取):对文件而言,具有读取文件内容的权限:对目录来说,具有浏览目录的权限. w(Write,写入):对文件而言,具有新增.修改文件内容的权限:对目录来说,具有删除.移动目录内文件的权限 ...

  7. Oracle BIEE 环境迁移所导致的账号登陆问题的解决

    系统版本 系统版本:11G(11.1.1.9) 问题描述 将系统数据(RPD.catalog等数据)迁移到另一环境(版本同样为11G)后,老系统weblogic控制台中添加的账户在新系统(仪表盘)中无 ...

  8. 双十一来了,别让你的mongodb宕机了

    好久没过来吹牛了,前段时间一直赶项目,没有时间来更新博客,项目也终于赶完了,接下来就要面临双十一这场惊心动魄的处女秀考验, 我们项目中会有一个wcf集群,而集群地址则放在mongodb中,所以mong ...

  9. mvn archetype:create和mvn archetype:generate

    create is deprecated in maven 3.0.5 and beyond,在maven3.0.5以上版本舍弃了create,使用generate生成项目 before:mvn ar ...

  10. Kafka 分布式的,基于发布/订阅的消息系统

    Kafka是一种分布式的,基于发布/订阅的消息系统.主要设计目标如下: 通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能. 高吞吐量:即使是非常 ...