zlog学习笔记(zc_arraylist)
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)的更多相关文章
- zlog学习笔记(level_list)
level_list.h /** * */ #ifndef __zlog_level_list_h #define __zlog_level_list_h zc_arraylist_t *zlog_l ...
- zlog学习笔记(mdc)
mdc.h #ifndef __zlog_mdc_h #define __zlog_mdc_h #include "zc_defs.h" typedef struct zlog_m ...
- zlog学习笔记(level)
level.h /** * */ #ifndef __zlog_level_h #define __zlog_level_h #include "stdio.h" #include ...
- zlog学习笔记(zc_hashtable)
zc_hashtable.h /** * hashtable */ #ifndef __zc_hashtable_h #define __zc_hashtable_h typedef struct z ...
- zlog学习笔记(zc_profile)
zc_profile.h #ifndef __zlog_profile_h #define __zlog_profile_h #define EMPTY() #define zc_assert(exp ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
随机推荐
- asp.net实现动态添加table行
asp.net动态的生成,删除table的行,主要是在后台动态创建单元行,单元表格,效果图: 2.代码: <%@ Page Language="C#" AutoEventWi ...
- Android终止线程的方法
线程对象属于一次性消耗品,一般线程执行完run方法之后,线程就正常结束了,线程结束之后就报废了,不能再次start,只能新建一个线程对象.但有时run方法是永远不会结束的.例如在程序中使用线程进行So ...
- java 网络编程基础 1
关于协议: 应用层网络协议包括:http,ftp,telnet,..... 传送层网络协议:使用socket封装的TCP,或UDP 端口: 用于网络通讯时传输数据时区分当前网络连接是与本机中的哪个应用 ...
- iOS开源项目MobileProject功能点介绍
一:MobileProject简介 MobileProject项目是一个以MVC模式搭建的开源功能集合,基于Objective-C上面进行编写,意在解决新项目对于常见功能模块的重复开发,MobileP ...
- CGAffineTransform方法汇总
CGAffineTransform是二维的仿射变换,可以进行位移,旋转,缩放,CGAffineTransform实际上是一个矩阵. CGAffineTransform { CGFloat a, b, ...
- 【Android】不依赖焦点和选中的TextView跑马灯
前言 继承TextView,并仿照源码修改而来,主要是取消了焦点和选中了判断,也不依赖文本的宽度. 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblogs.com 农民 ...
- mac os下可能是最好的豆瓣电台——diumoo
由于我一直用豆瓣fm听音乐,在网上找了下豆瓣的相关应用,都感觉不是太好, 最后发现一个mac版的app--diumoo! 这个软件看着非常舒服,一点也不占桌面空间,它一直默默在桌面右上角,鼠标划上去会 ...
- DFX 安全测试-- 告诉你什么是XSS、sql注入?POST和GET的区别....
1.用户权限测试 (1) 用户权限控制 1) 用户权限控制主要是对一些有权限控制的功能进行验证 2) 用户A才能进行的操作,B是否能够进行操作(可通过窜session,将在下面介绍) 3)只能有A条件 ...
- Genome2D编译方法
Genome2D是一个高效的2D引擎,现在支持Flash(stage3d)和HTML5,因为只有作者一个人在维护,就没开源代码. 最近和作者沟通了下,已经开源啦. 作者划分了几个模块,编译起来不是特别 ...
- ArrayList vs LinkedList vs Vector
List概览 List,正如它的名字,表明其是有顺序的.当讨论List的时候,最好拿它跟Set作比较,Set中的元素是无序且唯一:下面是一张类层次结构图,从这张图中,我们可以大致了解java集合类的整 ...