一、双向链表-api
#include<stdio.h>
#include<stdlib.h>
typedef struct dll_node
{
dll_node *pPrev;
dll_node *pNext;
}DLL_NODE;
typedef struct dl_list
{
DLL_NODE *pHead;
DLL_NODE *pTail;
int iSize;
}DL_LIST;
typedef void (*DLL_FUNC)(DLL_NODE *pNode);
DL_LIST *dlListCreate (void)
{
DL_LIST *pList = (DL_LIST *) malloc((unsigned) sizeof (DL_LIST));
pList->pHead = NULL;
pList->pTail = NULL;
pList->iSize = 0;
return (pList);
}
int dlListDelete(DL_LIST *pList)
{
free ((char *) pList);
return 0;
}
int dlListCount(DL_LIST *pList)
{
return pList->iSize;
}
void dlListInsert(DL_LIST *pList, DLL_NODE *pPrev, DLL_NODE *pNode)
{
DLL_NODE *pNext = NULL;
if (pPrev == NULL)
{
pNext = pList->pHead;
pList->pHead = pNode;
}
else
{
pNext = pPrev->pNext;
pPrev->pNext = pNode;
}
if (pNext == NULL)
{
pList->pTail = pNode;
}
else
{
pNext->pPrev = pNode;
}
pNode->pNext = pNext;
pNode->pPrev = pPrev;
pList->iSize++;
return;
}
//从链表尾部追加
void dlListAdd(DL_LIST *pList,DLL_NODE *pNode)
{
dlListInsert(pList, pList->pTail, pNode);
return;
}
DLL_NODE * dllRemove(DL_LIST *pList, DLL_NODE *pNode)
{
if (pNode->pPrev == NULL)
{
pList->pHead = pNode->pNext;
}
else
{
pNode->pPrev->pNext = pNode->pNext;
}
if (pNode->pNext == NULL)
{
pList->pTail = pNode->pPrev;
}
else
{
pNode->pNext->pPrev = pNode->pPrev;
}
pList->iSize--;
return pNode;
}
//从开头获得节点
DLL_NODE *dllGetFromHead(DL_LIST *pList)
{
DLL_NODE *pNode = dllRemove(pList, pList->pHead);
return pNode;
}
void dlListTraverse(DL_LIST *plist, DLL_FUNC Func)
{
DLL_NODE *pNode = plist->pHead;
while(pNode!=NULL)
{
Func(pNode);
pNode = pNode->pNext;
}
return;
}
二、双向链表-测试程序
#define OFFSET_OF(TYPE, MEM_NAME) ((unsigned long)&((TYPE *)0)->MEM_NAME)
#define MEM_TO_TYPE(pMem,TYPE, MEM_NAME) ((TYPE *)((unsigned long)(pMem)-OFFSET_OF(TYPE, MEM_NAME)))
typedef struct link_data
{
int iValue;
DLL_NODE node;
}LINK_DATA;
void printElem(DLL_NODE *pNode)
{
LINK_DATA *pData = MEM_TO_TYPE(pNode, LINK_DATA, node);
printf("iValue %d\n", pData->iValue);
return;
}
int _tmain(int argc, _TCHAR* argv[])
{
LINK_DATA data1;
data1.iValue = 1;
data1.node.pNext = NULL;
LINK_DATA data2;
data2.iValue = 2;
data2.node.pNext = NULL;
LINK_DATA data3;
data3.iValue = 3;
data3.node.pNext = NULL;
LINK_DATA data4;
data4.iValue = 4;
data4.node.pNext = NULL;
LINK_DATA data5;
data5.iValue = 5;
data5.node.pNext = NULL;
DL_LIST *pList = dlListCreate();
dlListAdd(pList, &(data1.node));
dlListAdd(pList, &(data2.node));
dlListAdd(pList, &(data3.node));
dlListAdd(pList, &(data4.node));
dlListAdd(pList, &(data5.node));
printf("desc[create dllist] count[%d]\n", dlListCount(pList));
dlListTraverse(pList, printElem);
dllGetFromHead(pList);
printf("desc[after dllGetFromHead] count[%d]\n", dlListCount(pList));
dlListTraverse(pList, printElem);
dllRemove(pList, &(data2.node));
printf("desc[after dllRemove] count[%d]\n", dlListCount(pList));
dlListTraverse(pList, printElem);
getchar();
return 0;
}
结果显示: