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
							 | 
						|||
| 
								 | 
							
								
							 |