Files
linkedlist/linklist.c
T
jens 29f41bafb7 Initial import
git-svn-id: http://moon:8086/svn/software/trunk/libsrc/linkedlist@1 b431acfa-c32f-4a4a-93f1-934dc6c82436
2014-07-19 07:44:42 +00:00

238 lines
3.8 KiB
C
Executable File

#include <stdlib.h>
#include <string.h>
#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;
}
*/