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