Initial import
git-svn-id: http://moon:8086/svn/software/trunk/libsrc/linkedlist@1 b431acfa-c32f-4a4a-93f1-934dc6c82436
This commit is contained in:
Executable
+238
@@ -0,0 +1,238 @@
|
||||
#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;
|
||||
}
|
||||
*/
|
||||
Executable
+28
@@ -0,0 +1,28 @@
|
||||
#ifndef LINKLIST_H
|
||||
#define LINKLIST_H
|
||||
|
||||
#include <string.h>
|
||||
#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
|
||||
Reference in New Issue
Block a user