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 ...
随机推荐
- 一个UILabel不同部分显示不同颜色
我们直接来看效果图吧: 需求:就是表格cell里面的状态Label,前面的"状态:"是黑色,后面的状态值是红色,他们在同一个Label上,怎么做呢? 解答:真的是会者不难,难者不会 ...
- 对URL编码
url支持26个英文字母.数字和少数几个特殊字符,因此,对于url中包含非标准url的字符时,就需要对其进行编码.iOS中提供了函数stringByAddingPercentEscapesUsingE ...
- Android MediaPlayer的生命周期
MediaPlayer的状态转换图也表征了它的生命周期,如下: 这张状态转换图清晰的描述了MediaPlayer的各个状态,也列举了主要的方法的调用时序,每种方法只能在一些特定的状态下使用,如果使用时 ...
- iOS 从Xcode看应用支持横竖屏
要看一个应用是否支持横竖屏,要看Xcode里面的info.plist文件设置才清楚,每一个新建工程都会包含三个支持方式,即Supported interface orientations里面的就是 P ...
- eclipse如何优化构建的速度(Building)
小Alan在平时的开发中很喜欢做一件事,那就是盯着eclipse的状态栏,看着Build Workspace的进度条一点一点慢慢的走,小Alan坐在电脑面前默默不想说话,就是心中总是有十万匹马在奔腾, ...
- AEAI DP按钮权限配置说明
1 背景概述 AEAI DP3.5版本以后支持对按钮权限进行灵活的管理配置,本文对配置过程进行详细说明,为相关使用人员提供指导和参考. 2 预期读者 数通畅联技术人员 AEAI DP开发平台使用人员 ...
- Jetty 发布web服务
Jetty provides a Web server and javax.servlet container, plus support for HTTP/2, WebSocket, OSGi, J ...
- 看美剧英文字幕学英语的利器——“深蓝英文字幕助手”简介
我从初中开始基本上就是一个英语很烂的人,数理化再好有什么用,工作了,结果发现数理化都没啥用,最有用的还是当年学的最烂的英语.于是在2011年年底开始了学习英语的课程,在学习的过程中,外教经常会放英剧美 ...
- 获取session、request、parmeter的方法
package com.hanqi.action; import java.util.Map; import com.opensymphony.xwork2.ActionContext; public ...
- Linux命令整理中...
Linux命令整理中... 最常用命令(我最近最常用的一般放在前面tipsbychsry) clear 清屏 date 显示日期 cal 显示日历 cal 2014 显示2014年的日历 shutdo ...