10 List_Head
*list_new(void)
12 List_Head
*pHead
= malloc(sizeof(List_Head
));
13 if (pHead
== NULL
) return NULL
;
19 void list_delete(List_Head
*pHead
)
22 assert(pHead
!= NULL
);
23 if(pHead
->count
== 0) { return; }
25 while(pTemp
->pNext
!= NULL
)
35 int list_len(List_Head
*pHead
)
37 assert(pHead
!= NULL
);
38 if (pHead
== NULL
) return -1;
42 int list_search(List_Head
*pHead
, List_Node
*pNode
)
44 List_Node
*pTemp
= NULL
;
45 assert(pHead
!= NULL
);
46 if(pHead
->count
== 0) return 0;
48 while(pTemp
!= NULL
) {
49 if(pTemp
== pNode
) return 1;
55 List_Node
*list_tail(List_Head
*pHead
)
57 List_Node
*pTemp
= pHead
->pNext
;
59 if(pHead
->pNext
== NULL
) return NULL
;
60 while(pTemp
->pNext
!= NULL
)
65 List_Node
*list_ins_head(List_Head
*pHead
)
67 List_Node
*pTemp
= pHead
->pNext
;
69 List_Node
*pNode
= malloc(sizeof(List_Node
));
70 if (pNode
== NULL
) return NULL
;
73 if(pHead
->pNext
== NULL
) /* adding to empty list */
84 List_Node
*list_ins_head_data(List_Head
*pHead
, void *Data
)
86 List_Node
*temp
= list_ins_head(pHead
);
91 List_Node
*list_ins_tail(List_Head
*pHead
)
93 List_Node
*pTemp
= pHead
->pNext
;
94 List_Node
*pNode
= malloc(sizeof(List_Node
));
95 if (pNode
== NULL
) return NULL
;
97 if(pHead
->pNext
== NULL
) /* empty list */
101 pTemp
= list_tail(pHead
);
102 pTemp
->pNext
= pNode
;
109 List_Node
*list_ins_tail_data(List_Head
*pHead
, void *Data
)
111 List_Node
*temp
= list_ins_tail(pHead
);
116 List_Node
*list_ins_before(List_Head
*pHead
, List_Node
*pNode
)
118 List_Node
*pTemp
= pHead
->pNext
;
119 List_Node
*pPrev
= NULL
;
120 List_Node
*pNew
= malloc(sizeof(List_Node
));
121 if (pNew
== NULL
) return NULL
;
123 if(pTemp
== NULL
) /* empty list */
125 pHead
->pNext
= pNode
;
127 while(pTemp
!= pNode
&& pTemp
!= NULL
)
130 pTemp
= pTemp
->pNext
;
132 if(pTemp
== NULL
) /* did not find matching node */
137 if(pPrev
== NULL
) pHead
->pNext
= pNew
;
138 else pPrev
->pNext
= pNew
; /* put new node at end of previous */
139 pNew
->pNext
= pTemp
; /* push current node down */
145 List_Node
*list_ins_after(List_Head
*pHead
, List_Node
*pNode
)
147 List_Node
*pTemp
= pHead
->pNext
;
148 List_Node
*pNew
= malloc(sizeof(List_Node
));
149 if (pNew
== NULL
) return NULL
;
151 if(pTemp
== NULL
) /* empty list */
153 pHead
->pNext
= pNode
;
155 while(pTemp
!= pNode
&& pTemp
!= NULL
)
157 pTemp
= pTemp
->pNext
;
159 if(pTemp
== NULL
) /* did not find matching node */
171 int list_rm_node(List_Head
*pHead
, List_Node
*pNode
)
173 List_Node
*pPrev
= NULL
;
175 if(pHead
== NULL
|| pNode
== NULL
)
176 return -1; /* Not valid data */
178 if(list_size(pHead
) == 0)
179 return -1; /* list was empty */
181 pPrev
= list_prev_node(pHead
, pNode
);
182 if(pNode
->pNext
== NULL
) /* removing from end of list */
184 if(pPrev
== NULL
) /* no node before this one */
187 } else { /* previous node exists */
188 /*pHead->pNext = pHead->pNext->pNext;*/
191 } else { /* removing from middle */
194 pHead
->pNext
= pNode
->pNext
;
196 pPrev
->pNext
= pNode
->pNext
;
205 int list_rm_before(List_Head
*pHead
, List_Node
*pNode
)
207 List_Node
*pPrev
= list_prev_node(pHead
, pNode
);
210 return list_rm_node(pHead
, pPrev
);
213 int list_copy(List_Head
*pDest
, List_Head
*pSrc
)
215 int i
= 1; /* start with head node */
216 List_Node
*pTemp
= NULL
;
217 assert(pDest
!= NULL
&& pSrc
!= NULL
);
218 if(pSrc
->count
== 0) { return 0; } /* nothing to copy */
220 while (i
<= pSrc
->count
) {
221 pTemp
= list_get_num(pSrc
, i
);
222 list_ins_tail_data(pDest
, pTemp
->pData
);
228 void list_print(List_Head
*pHead
)
231 List_Node
*temp
= NULL
;
232 assert(pHead
!= NULL
);
234 if(pHead
->count
== 0)
235 printf("Empty List\n");
239 printf("List Item: %d -> Data: %p\n", i
, (void *)temp
);
242 } while (temp
!= NULL
);
246 List_Node
*list_get_num(List_Head
*pHead
, int count
)
251 assert(pHead
!= NULL
);
252 if(pHead
->count
== 0) { return NULL
; } /* list is empty */
253 if(count
> pHead
->count
) { return NULL
; } /* node does not exist */
254 pNode
= pHead
->pNext
;
256 pNode
= pNode
->pNext
;
262 int list_node_swap(List_Node
*pPrev
, List_Node
*pCurr
)
264 List_Node
* pTemp
= NULL
;
265 assert(pCurr
!= NULL
&& pPrev
!= NULL
);
266 pTemp
= pCurr
->pNext
;
267 pCurr
->pNext
= pPrev
->pNext
;
268 pPrev
->pNext
= pTemp
;
272 List_Head
*list_reverse(List_Head
*pHead
)
274 List_Head
*newList
= list_new();
275 assert(pHead
!= NULL
);
276 while(pHead
->count
> 0)
278 list_ins_head_data(newList
, pHead
->pNext
->pData
);
279 list_rm_node(pHead
, pHead
->pNext
);
285 void list_append(List_Head
*pLo
, List_Head
*pHi
)
287 List_Node
*pTemp
= NULL
;
288 assert(pLo
!= NULL
&& pHi
!= NULL
);
289 pTemp
= list_tail(pLo
);
290 pTemp
->pNext
= pHi
->pNext
;
291 pLo
->count
= pLo
->count
+ pHi
->count
;
294 int list_data_array(List_Head
*pHead
, void *pArr
[], int len
)
297 List_Node
*pTemp
= NULL
;
298 assert(pHead
!= NULL
);
299 assert(pArr
!= NULL
);
301 for(i
= 0; i
< len
; i
++) /* reset array */
303 if(pHead
->count
== 0) return 1;
304 pTemp
= pHead
->pNext
;
306 while(pTemp
!= NULL
) {
307 pArr
[i
++] = pTemp
->pData
;
308 pTemp
= pTemp
->pNext
;
313 int list_node_array(List_Head
*pHead
, void *pArr
[], int len
)
316 List_Node
*pTemp
= NULL
;
317 assert(pHead
!= NULL
);
318 assert(pArr
!= NULL
);
320 for(i
= 0; i
< len
; i
++) /* reset array */
322 if(pHead
->count
== 0) return 1;
323 pTemp
= pHead
->pNext
;
325 while(pTemp
!= NULL
){
327 pTemp
= pTemp
->pNext
;
332 void list_clear(List_Head
*pHead
)
334 List_Node
*pTemp
= pHead
->pNext
;
335 assert(pHead
!= NULL
);
338 while(pTemp
->pNext
!= NULL
)
340 pTemp
= pTemp
->pNext
;
348 List_Node
*list_prev_node(List_Head
*pHead
, List_Node
*pNode
)
350 List_Node
*pPrev
= NULL
, *pTemp
;
351 if(pHead
== NULL
|| pNode
== NULL
)
353 pTemp
= pHead
->pNext
;
356 pTemp
= pTemp
->pNext
;
357 if(pTemp
== NULL
) return NULL
; /* reached end of list */
358 } while(pTemp
!= pNode
);