数据结构-双向链表

一、双向链表-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;  
} 
结果显示:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值