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 ...
随机推荐
- 简单粗暴的对android so文件加壳,防止静态分析
转载自http://bbs.pediy.com/showthread.php?t=191649 以前一直对.so文件加载时解密不懂,不了解其工作原理和实现思路.最近翻看各种资料,有了一些思路.看到论坛 ...
- 【代码笔记】iOS-剧幕拉开形的首页
一,工程图. 二,代码. RootViewController.h #import <UIKit/UIKit.h> #import "UIImage+SplitImageInto ...
- 【代码笔记】iOS-调用系统震动和声音
代码: RootViewController.m #import "RootViewController.h" #import <AudioToolbox/AudioTool ...
- 自定义Cell的方法
Cell属于UITableView中的组件,有多种定义方式,有系统自带的方法,有自定义的方法. 可以使用系统的方法setSeparatorColor(设置分割线颜色) 设置setSeparatorSt ...
- Web端即时通讯技术原理详解
前言 有关IM(InstantMessaging)聊天应用(如:微信,QQ).消息推送技术(如:现今移动端APP标配的消息推送模块)等即时通讯应用场景下,大多数都是桌面应用程序或者native应用较为 ...
- Nodejs之MEAN栈开发(九)---- 用户评论的增加/删除/修改
由于工作中做实时通信的项目,需要用到Nodejs做通讯转接功能,刚开始接触,很多都不懂,于是我和同事就准备去学习nodejs,结合nodejs之MEAN栈实战书籍<Getting.MEAN.wi ...
- XML语言基础1
这学期选修了XML技术这门课,没有发课本,于是参考了W3school教程,整理一下上课的内容. 1.XML简介 XML是一种标记语言,很类似HTML,它不是对HTML的替代,而是对HTML的补充.在大 ...
- Entity Framework在Asp.net MVC中的实现One Context Per Request(附源码)
上篇中"Entity Framework中的Identity map和Unit of Work模式", 由于EF中的Identity map和Unit of Work模式,EF体现 ...
- Linux账号密码过期会导致crontab作业不能执行
今天一同事报告Linux服务器上的crontab作业没有运行,检查/var/log/cron日志后发现下面错误信息 Jan 19 16:30:01 xxxx crond[31399]: Authent ...
- Sql Server之旅——第十二站 sqltext的参数化处理
说到sql的参数化处理,我也是醉了,因为sql引擎真的是一个无比强大的系统,我们平时做系统的时候都会加上缓存,我想如果没有缓存,就不会有什么 大网站能跑的起来,而且大公司一般会在一个东西上做的比较用心 ...