Blame view

Inc/gen_linklist.h 4.06 KB
9d8bbd1c   李外   改升级前备份
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
  #ifndef 	_GEN_LINKLIST_H_
  #define 	_GEN_LINKLIST_H_
  
  #include 	"string.h"
  #include 	"stdlib.h"
  
  //2,node 链表节点信息
  typedef struct gen_linknode_STR{
  	void *pdata;	
  	struct gen_linknode_STR *next;
  }GenLinkNode;
  
  //3,链表总信息
  typedef struct gen_linklist_STR{
  	GenLinkNode*front;
  	GenLinkNode *rear;
  	unsigned short length;
  }GenLinkList;
  
  //遍历器
  typedef struct gen_linkiter_STR
  {
      GenLinkNode * pnode;
      int count;
  }GenLinkIter;
  
  //insert
  unsigned char gen_linklist__insert(GenLinkList* const list,void *pele,unsigned short index);
  //detele
  void* gen_linklist__detele(GenLinkList* const list,unsigned short index);
  //get node
  void* gen_linklist__get_ele(GenLinkList* const list,unsigned short index);
  //get link length
  unsigned short gen_linklist__get_len(GenLinkList* const list);
  ////iter
  // void gen_iter__init(GenLinkIter* iter, GenLinkList* const list);
  // unsigned char gen_iter__is_end(GenLinkIter* const iter);
  // void* gen_iter__get_ele(GenLinkIter* const iter);
  // unsigned char gen_iter__get_index(GenLinkIter* const iter);
  
  
  
  //----------------------------------------------------------------------------
  #define CONCAT_2(p1, p2)     p1##p2
  
  #define CONCAT_3(p1, p2, p3)     p1##p2##p3
  
  #define _ELE_STAT_NULL		0xff
  #define _ELE_STAT_VALID		0x01
  /*
  * name -用户定义的链表名称
  * ele_str 用户定义的ele数据结构体
  * cnt 数据结构体数组元素个数
  */
  #define	GEN_LINKLIST_DEF(name,ele_str,cnt)\
  /*1 定义一个头节点*/\
  		GenLinkNode	CONCAT_2(name,_node_head)={\
  			.pdata =NULL,\
  			.next =NULL,\
  		};\
  /*2 定义应用链表并初始化指向头节点*/\
  			GenLinkList name={					\
  				.front =&CONCAT_2(name,_node_head),		\
  				.rear =&CONCAT_2(name,_node_head),		\
  				.length =0,						\
  			};									\
  			void CONCAT_2(name,__init)(void){\
  				name.front =&CONCAT_2(name,_node_head);		\
  				name.rear =&CONCAT_2(name,_node_head);		\
  				name.length =0;					\
  			}\
  /*3 定义ele数组*/			\
  		ele_str CONCAT_2(name,_ele)[cnt];\
  /*3.1 初始化ele status//--- next need app called ------*/\
  		void CONCAT_2(name,__init_ele)(void){\
  			for(unsigned short x = 0;x < cnt;x++)\
  				CONCAT_2(name,_ele)[x].status = _ELE_STAT_NULL;\
  		}\
  /*3.2 获取一个空闲的ele 返回其地址*/			\
    		ele_str *CONCAT_2(name,__malloc_ele)(void){\
  				for(unsigned short x = 0;x < cnt;x++){\
  					if(CONCAT_2(name,_ele)[x].status == _ELE_STAT_NULL ){\
  						CONCAT_2(name,_ele)[x].status = _ELE_STAT_VALID;\
  						return &CONCAT_2(name,_ele)[x];\
  					}\
  				}\
  				return NULL;\
  			}\
  /*3.3 获取空闲ele的总个数*/\
  		unsigned char CONCAT_2(name,__get_free_ele_cnt)(void){\
  				unsigned char count=0;\
5913e7ab   李外   V100.0.16-1
92
  				for(unsigned short x = 0;x < cnt;x++){\
9d8bbd1c   李外   改升级前备份
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
  					if(CONCAT_2(name,_ele)[x].status == _ELE_STAT_NULL ){\
  						count++;\
  					}\
  				}\
  				return count;\
  		}\
  /* 5封装linklist相关函数*/			\
  		unsigned char	CONCAT_2(name,__insert)(void *pele,unsigned short index){\
  			return gen_linklist__insert(&name,pele,index);\
  		}\
  		void* CONCAT_2(name,__detele)(ele_str * pele,unsigned short index){\
  			pele->status = _ELE_STAT_NULL;\
  			ele_str *pe =gen_linklist__detele(&name,index);\
  			return pe;\
  		}\
  		unsigned short CONCAT_2(name,__get_len)(void){\
  			return gen_linklist__get_len(&name);\
  		}\
  		void * CONCAT_2(name,__get_ele)(unsigned short index){\
  			return gen_linklist__get_ele(&name,index);\
  		}\
  /* 通用遍历函数*/	\
  		unsigned char CONCAT_2(name,__traverse)(unsigned char (*trav_func)(ele_str *,unsigned char) ){\
  			ele_str *pele;	\
  			unsigned char ret_cnt=0;\
5913e7ab   李外   V100.0.16-1
118
  			for(unsigned short i=0;i< gen_linklist__get_len(&name);i++){\
9d8bbd1c   李外   改升级前备份
119
120
121
122
123
124
125
126
127
128
  				pele = gen_linklist__get_ele(&name,i);\
  				if( trav_func(pele,i) )\
  					ret_cnt++;\
  			}\
  			return ret_cnt;\
  		}	\
  /* 通用遍历函数,同时输入用户指针*/	\
  		unsigned char CONCAT_2(name,__traverse_input)(unsigned char (*trav_func)(ele_str *,unsigned char*),unsigned char* pt ){\
  			ele_str *pele;	\
  			unsigned char ret_cnt=0;\
5913e7ab   李外   V100.0.16-1
129
  			for(unsigned short i=0;i< gen_linklist__get_len(&name);i++){\
9d8bbd1c   李外   改升级前备份
130
131
132
133
134
135
136
137
138
139
  				pele = gen_linklist__get_ele(&name,i);\
  				if( trav_func(pele,pt) )\
  					ret_cnt++;\
  			}\
  			return ret_cnt;\
  		}	
  
  
  			
  #endif