91 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef list_h__
 | ||
| #define list_h__
 | ||
| 
 | ||
| #include "stdint.h"
 | ||
| #include "stdlib.h"
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| struct _list_def;
 | ||
| typedef struct _list_def list_def;
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| typedef int (*sub_fun_def)(void *a,void *b);
 | ||
| typedef int (*del_fun_def)(void *p);
 | ||
| // 生成打印字符串指针,列表获取后会使用free释放
 | ||
| typedef char *(*str_fun_def)(void *p);
 | ||
| 
 | ||
| #define INT_SUB _list_int_sub
 | ||
| #define INT_DEL 0
 | ||
| #define INT_STR _list_int_str
 | ||
| #define STR_SUB _list_str_sub
 | ||
| #define STR_DEL _list_str_del
 | ||
| #define STR_STR _list_str_str
 | ||
| 
 | ||
| 
 | ||
| /*r{ 基本操作函数 }c*/
 | ||
| list_def *list_creat(int block_size,sub_fun_def sub,del_fun_def del,str_fun_def str);
 | ||
| void *list_get(list_def *l,int index);
 | ||
| void list_remove(list_def *l,int index);
 | ||
| void *list_take(list_def *l,int index);/*temp_ptr*/
 | ||
| void list_clear(list_def *l);
 | ||
| int list_length(list_def *l);
 | ||
| int list_block_size4(list_def *l);
 | ||
| void list_sort(list_def *l);
 | ||
| int list_contains(list_def *l,void *d);
 | ||
| void list_swap(list_def *l,int index_a,int index_b);
 | ||
| char *list_string(list_def *l);
 | ||
| void list_shift(list_def *l);
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| /*r{ 宏函数 }c*/
 | ||
| #define list_creat_int()                list_creat(sizeof(int),INT_SUB,INT_DEL,INT_STR)
 | ||
| #define list_creat_str()                list_creat(sizeof(char *),STR_SUB,STR_DEL,STR_STR)
 | ||
| #define list_delete(l)                  _list_delete(&(l))
 | ||
| #define list_insert(l,data,index)       _list_insert(&(l),data,index)
 | ||
| #define list_append(l,data)             list_insert(l,data,-1)
 | ||
| #define list_insert_int(l,int_,index)   list_insert(l,(uint32_t []){int_},index)
 | ||
| #define list_append_int(l,int_)         list_insert_int(l,int_,-1)
 | ||
| #define list_append_str(l,str)          list_insert_str(l,str,-1)
 | ||
| #define list_get_int(l,index)           (*(int *)list_get(l,index))
 | ||
| #define list_get_str(sl,index)          (*(char **)list_get(sl,index))
 | ||
| #define list_take_str(sl,index)         (*(char **)list_take(sl,index))
 | ||
| #define list_take_int(l,index)          (*(int *)list_take(l,index))
 | ||
| #define list_insert_str(l,str,index)\
 | ||
|   {\
 | ||
|     char *c=malloc(strlen(str)+1);\
 | ||
|     param_check(c);\
 | ||
|     memcpy(c,str,strlen(str)+1);\
 | ||
|     list_insert(l,(uint32_t []){(uint32_t)(c)},index);}
 | ||
| // 要保证a,b的类型相同
 | ||
| #define list_append_from(a,b) \
 | ||
|   for(int i=0;i<list_length(b);i++) {list_append(a,list_get(b,i));}
 | ||
| #define list_appends(a,d,num) \
 | ||
|   for(int i=0;i<num;i++) {list_append(a,&d[i]);}
 | ||
|     
 | ||
| // 转化为列表的临时指针    
 | ||
| #define list_temp(l)       tappend(l,_list_delete_later)
 | ||
|     
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| /*r{ 用户不应直接调用的函数 }c*/
 | ||
| list_def *_list_insert(list_def **l,void *data,int index);
 | ||
| void _list_delete(list_def **l);
 | ||
| void _list_delete_later(list_def *l);
 | ||
| int _list_int_sub(void *a,void *b);
 | ||
| char *_list_int_str(void *a);
 | ||
| int _list_str_sub(void *a,void *b);
 | ||
| int _list_str_del(void *d);
 | ||
| char *_list_str_str(void *a);
 | ||
| void _list_sort(list_def *l,sub_fun_def sub);
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| #endif
 | ||
| 
 | 
