commit 29f41bafb7566560b2b10f9d442c34b39500b51f Author: Jens Ahrensfeld Date: Sat Jul 19 07:44:42 2014 +0000 Initial import git-svn-id: http://moon:8086/svn/software/trunk/libsrc/linkedlist@1 b431acfa-c32f-4a4a-93f1-934dc6c82436 diff --git a/linklist.c b/linklist.c new file mode 100755 index 0000000..318ce6e --- /dev/null +++ b/linklist.c @@ -0,0 +1,238 @@ +#include +#include +#include "linklist.h" + +linkedlist_t* LinkedList_free(linkedlist_t *pObj) +{ + + linkedlist_t *pCurr; + + pCurr = LinkedList_find_first(pObj); + + while(pCurr) + pCurr = LinkedList_del(pCurr); + + return pCurr; +} + +linkedlist_t* LinkedList_append(linkedlist_t *pObj, UINT32 num, UINT32 size) +{ + UINT32 i; + linkedlist_t *pCurr, *pLast; + char *pData = NULL; + + if (size) + pData = (void*)malloc(num*size); + + pLast = pObj; + if (pObj == NULL) + { + pCurr = (linkedlist_t*)malloc(num*sizeof(linkedlist_t)); + } + else + { + if (pObj->pNext) + pLast = LinkedList_find_last(pObj); + + pCurr = (linkedlist_t*)malloc(num*sizeof(linkedlist_t)); + } + memset(pCurr, 0, num*sizeof(linkedlist_t)); + pLast = pCurr; + pLast->pPrev = pObj; + if (pObj) + pObj->pNext = pCurr; + pLast->size = size; + if (pData) + pLast->pData = pData; + pData += size; + for(i=1; i < num; i++) + { + pLast->pNext = &pCurr[i]; + pLast = pLast->pNext; + pLast->pPrev = &pCurr[i-1]; + pLast->size = size; + if (pData) + pLast->pData = pData; + pData += size; + } + + return pCurr; + +} +/* +linkedlist_t* LinkedList_append(linkedlist_t *pObj, UINT32 id, UINT32 size) +{ + linkedlist_t *pCurr; + + if (pObj == NULL) + { + pCurr = (linkedlist_t*)malloc(sizeof(linkedlist_t)); + } + else + { + if (pObj->pNext) + pObj = LinkedList_find_last(pObj); + + pObj->pNext = (linkedlist_t*)malloc(sizeof(linkedlist_t)); + pCurr = pObj->pNext; + } + memset(pCurr, 0, sizeof(linkedlist_t)); + + if (size) + { + pCurr->pData = (void*)malloc(size); + } + pCurr->size = size; + pCurr->id = id; + pCurr->pPrev = pObj; + + return pCurr; + +} +*/ +linkedlist_t* LinkedList_add(linkedlist_t *pObj, UINT32 num, void *pData, UINT32 size) +{ + linkedlist_t *pCurr; + + pCurr = LinkedList_append(pObj, num, size); + + return LinkedList_put(pCurr, pData, size); + +} + +linkedlist_t* LinkedList_put(linkedlist_t *pObj, void *pData, UINT32 size) +{ + linkedlist_t *pCurr; + + pCurr = pObj; + + if (size <= pCurr->size) + { + if (pData) + memcpy(pCurr->pData, pData, size); + + pCurr->size = size; + } + + return pCurr; + +} + +void* LinkedList_get(linkedlist_t *pObj) +{ + return pObj->pData; +} + +linkedlist_t* LinkedList_del(linkedlist_t *pObj) +{ + linkedlist_t *pCurr; + + if (pObj == NULL) + return NULL; + + if (pObj->pPrev) + pObj->pPrev->pNext = pObj->pNext; + + if (pObj->pNext) + pObj->pNext->pPrev = pObj->pPrev; + + pCurr = NULL; + if (pObj->pNext) + { + pCurr = pObj->pNext; + } + else + { + pCurr = pObj->pPrev; + } + +// if (pObj->pPrev) +// { +// if (pObj->pPrev != pCurr) +// pObj->pPrev->pNext = pCurr; +// else +// pObj->pPrev->pNext = NULL; +// } + + if (pObj->pData) + free(pObj->pData); + + free(pObj); + + return pCurr; +} + +linkedlist_t* LinkedList_ins(linkedlist_t *pObj, UINT32 num, void *pData, UINT32 size) +{ + linkedlist_t *pCurr, *pNext; + + if (pObj == NULL) + return NULL; + + pNext = pObj->pNext; + pCurr = LinkedList_add(pObj, num, pData, size); + pCurr->pNext = pObj; + pCurr->pPrev = pObj->pPrev; + + pObj->pPrev->pNext = pCurr; + pObj->pPrev = pCurr; + pObj->pNext = pNext; + + return pCurr; +} + + +linkedlist_t* LinkedList_find_first(linkedlist_t *pObj) +{ + + linkedlist_t *pCurr; + + if (pObj == NULL) + return NULL; + + pCurr = pObj; + while(pCurr->pPrev) + pCurr = pCurr->pPrev; + + return pCurr; +} + +linkedlist_t* LinkedList_find_last(linkedlist_t *pObj) +{ + + linkedlist_t *pCurr; + + if (pObj == NULL) + return NULL; + + pCurr = pObj; + while(pCurr->pNext) + pCurr = pCurr->pNext; + + return pCurr; +} +/* +linkedlist_t* LinkedList_find_by_id(linkedlist_t *pObj, UINT32 id) +{ + + linkedlist_t *pCurr; + + if (pObj == NULL) + return NULL; + + pCurr = LinkedList_find_first(pObj); + do + { + if (pCurr->id == id) + break; + + pCurr = pCurr->pNext; + + } while(pCurr->pNext); + + if (pCurr->id == id) + return pCurr; + + return NULL; +} +*/ \ No newline at end of file diff --git a/linklist.h b/linklist.h new file mode 100755 index 0000000..fa67022 --- /dev/null +++ b/linklist.h @@ -0,0 +1,28 @@ +#ifndef LINKLIST_H +#define LINKLIST_H + +#include +#include "types.h" + + +typedef struct _slinkedlist_t +{ + UINT32 id; + UINT32 size; + void *pData; + struct _slinkedlist_t *pNext; + struct _slinkedlist_t *pPrev; + +} linkedlist_t; + +linkedlist_t* LinkedList_free(linkedlist_t *pObj); +linkedlist_t* LinkedList_append(linkedlist_t *pObj, UINT32 num, UINT32 size); +linkedlist_t* LinkedList_add(linkedlist_t *pObj, UINT32 num, void *pData, UINT32 size); +linkedlist_t* LinkedList_put(linkedlist_t *pObj, void *pData, UINT32 size); +linkedlist_t* LinkedList_ins(linkedlist_t *pObj, UINT32 num, void *pData, UINT32 size); +void* LinkedList_get(linkedlist_t *pObj); +linkedlist_t* LinkedList_del(linkedlist_t *pObj); +linkedlist_t* LinkedList_find_first(linkedlist_t *pObj); +linkedlist_t* LinkedList_find_last(linkedlist_t *pObj); + +#endif // LINKLIST_H