双向链表

双向链表介绍

       双向链表,如同其名所暗示的那样,链表元素之间由两个指针链接。双向链表中的每一个元素都由3部分组成:除了数据域成员和next指针外,每个元素还包含一个指向其前驱元素的指针,称为prev指针。双向链表的组成是这样的:将一些元素链接在一起使得每个元素的next指针都指向其后继的元素,而每个元素的prev指针都指向其前驱元素。为了标识链表的头和尾,将第一个元素的prev指针和最后一个元素的next指针设置为NULL。

       待补图


双向链表的实现

// DList.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>


/*双链表元素结构体定义*/
typedef struct  DListElmt_
{
	unsigned int uiValueA;   /*数据域 数据成员*/
	unsigned int *puiValueB; /*数据域 数据成员,需要动态申请内存*/

	struct DListElmt_ *pNext;  /*指针域 指向后一个元素结点的指针*/
	struct DListElmt_ *pPrev;  /*指针域 指向前一个元素结点的指针*/

}DListElmt;

/*双链表结构体定义*/
typedef struct DList_
{
	int  iSize;   /*链表大小*/

	void (*destory)(void *data);  /*用于释放元素结点内动态申请的内存*/
	int (*compare)(void *key1, void *key2); /*比较函数 返回值 0 相等 1 大于 -1 小于*/

	DListElmt  *pDListElmtHead;  /*指向链表头结点的指针*/
	DListElmt  *pDListElmtTail;  /*指向链表尾结点的指针*/

}DList;

/*单链表操作宏定义*/
#define DLIST_SIZE(list)   ((list)->iSize)
#define DLIST_HEAD(list)   ((list)->pDListElmtHead)
#define DLIST_TAIL(list)   ((list)->pDListElmtTail)
#define DLIST_IS_HEAD(list, element) (((element) == (list)->pDListElmtHead) ? 1:0)
#define DLIST_IS_TAIL(list, element) (((element) == (list)->pDListElmtTail) ? 1:0)

/*函数声明*/
void MemoryFree(void *data);
int DataCompare(void *key1, void *key2);
void DList_Init(DList *dlist, void (*destory)(void *data), int (*compare)(void *key1, void *key2));
int DList_Insert_Next(DList *dlist, DListElmt *Lelement, unsigned int uiDataA, unsigned int *puiDataB);
int DList_Insert_Prev(DList *dlist, DListElmt *Lelement, unsigned int uiDataA, unsigned int *puiDataB);
int DList_Remove(DList *dlist, DListElmt *Lelement, unsigned int *puiDataA, unsigned int **puiDataB);
void DList_Sort(DList *dlist);
void DList_Swap(DListElmt *LelementKey1, DListElmt *LelementKey2);
void DList_Destory(DList *dlist);

/*
*函数名:MemoryFree
*参数:data  待释放的内存
*功能:释放动态申请的内存
*返回值:无
*作者:AlbertoNo1
*日期:2016-04-20
*/
void MemoryFree(void *data)
{
	free(data);
}

/*
*函数名:DataCompare
*参数:key1  待比较的元素1
*      key2  待比较的元素2
*功能:比较两个元素的大小(无符号整型)
*返回值:0 key1 等于 key2  1 key1 大于 key2  -1 key1 小于 key2 
*作者:AlbertoNo1
*日期:2016-04-20
*/
int DataCompare(void *key1, void *key2)
{
	unsigned int uiKey1 = 0;
	unsigned int uiKey2 = 0;

	uiKey1 = *((unsigned int*)key1);
	uiKey2 = *((unsigned int*)key2);

	if (uiKey1 < uiKey2)
	{
		return -1;
	}
	else if (uiKey1 > uiKey2)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

/*
*函数名:DList_Init
*参数:dlist  待初始化的链表
*      destory  数据域动态内存释放函数
*      compare  比较函数
*功能:双链表初始化函数
*返回值:无 
*作者:AlbertoNo1
*日期:2016-04-20
*/
void DList_Init(DList *dlist, void (*destory)(void *data), int (*compare)(void *key1, void *key2))
{
	dlist->iSize = 0;

	dlist->destory = destory;
	dlist->compare = compare;

	dlist->pDListElmtHead = NULL;
	dlist->pDListElmtTail = NULL;
}

/*
*函数名:DList_Insert_Next
*参数:dlist  链表
*      Lelment  待插入元素的前一个元素指针
*      uiDataA  数据成员值
*      puiDataB 数据成员值(动态申请内存)
*功能:双链表插入元素函数(指定元素之后)
*返回值:0 成功 -1 失败 
*作者:AlbertoNo1
*日期:2016-04-20
*/
int DList_Insert_Next(DList *dlist, DListElmt *Lelement, unsigned int uiDataA, unsigned int *puiDataB)
{
	DListElmt  *pElment = NULL;

	/*入参合法值由调用者保证*/

	/*申请内存*/
	pElment = (DListElmt*)malloc(sizeof(DListElmt));
	if (NULL == pElment)
	{
		return -1;
	}

	/*数据域赋值*/
	pElment->uiValueA = uiDataA;
	pElment->puiValueB = puiDataB;

	if (0 == DLIST_SIZE(dlist))
	{/*空链表插入元素*/
		pElment->pNext = NULL;
		pElment->pPrev = NULL;

		/*更新链表头尾结点指针*/
		dlist->pDListElmtHead = pElment;
		dlist->pDListElmtTail = pElment;
	}
	else
	{
		if (NULL == Lelement)
		{/*插入链表头*/
			pElment->pNext = dlist->pDListElmtHead;
			pElment->pPrev = NULL;

			dlist->pDListElmtHead->pPrev = pElment;
			dlist->pDListElmtHead = pElment;
		}
		else if (DLIST_IS_TAIL(dlist, Lelement))
		{/*插入链表尾*/
			pElment->pNext = NULL;
			pElment->pPrev = dlist->pDListElmtTail;

			dlist->pDListElmtTail->pNext = pElment;
			dlist->pDListElmtTail = pElment;
		}
		else
		{
			Lelement->pNext->pPrev = pElment;

			pElment->pNext = Lelement->pNext;
			pElment->pPrev = Lelement;

			Lelement->pNext = pElment;
		}
	}

	dlist->iSize++;

	return 0;
}

/*
*函数名:DList_Insert_Prev
*参数:dlist  链表
*      Lelment  待插入元素的后一个元素指针
*      uiDataA  数据成员值
*      puiDataB 数据成员值(动态申请内存)
*功能:双链表插入元素函数(指定元素之前)
*返回值:0 成功 -1 失败 
*作者:AlbertoNo1
*日期:2016-04-20
*/
int DList_Insert_Prev(DList *dlist, DListElmt *Lelement, unsigned int uiDataA, unsigned int *puiDataB)
{
	DListElmt  *pElment = NULL;

	/*入参合法值由调用者保证*/

	/*申请内存*/
	pElment = (DListElmt*)malloc(sizeof(DListElmt));
	if (NULL == pElment)
	{
		return -1;
	}

	/*数据域赋值*/
	pElment->uiValueA = uiDataA;
	pElment->puiValueB = puiDataB;

	if (0 == DLIST_SIZE(dlist))
	{/*空链表插入元素*/
		pElment->pNext = NULL;
		pElment->pPrev = NULL;

		/*更新链表头尾结点指针*/
		dlist->pDListElmtHead = pElment;
		dlist->pDListElmtTail = pElment;
	}
	else
	{
		if (NULL == Lelement)
		{/*插入链表尾*/
			pElment->pNext = NULL;
			pElment->pPrev = dlist->pDListElmtTail;

			dlist->pDListElmtTail->pNext = pElment;
			dlist->pDListElmtTail = pElment;
		}
		else if (DLIST_IS_HEAD(dlist, Lelement))
		{/*插入链表头*/
			pElment->pNext = dlist->pDListElmtHead;
			pElment->pPrev = NULL;

			dlist->pDListElmtHead->pPrev = pElment;
			dlist->pDListElmtHead = pElment;
		}
		else
		{
			Lelement->pPrev->pNext = pElment;

			pElment->pPrev = Lelement->pPrev;
			pElment->pNext = Lelement;

			Lelement->pPrev = pElment;
		}
	}

	dlist->iSize++;

	return 0;
}


/*
*函数名:DList_Remove
*参数:dlist  链表
*      Lelment  待删除元素的指针
*      puiDataA  返回数据成员值
*      puiDataB 返回数据成员值(动态申请内存)
*功能:双链表删除指定的元素
*返回值:0 成功 -1 失败 
*作者:AlbertoNo1
*日期:2016-04-20
*/
int DList_Remove(DList *dlist, DListElmt *Lelement, unsigned int *puiDataA, unsigned int **puiDataB)
{
	if (0 == DLIST_SIZE(dlist) || (NULL == Lelement))
	{
		return -1;
	}

	*puiDataA = Lelement->uiValueA;
	*puiDataB = Lelement->puiValueB;

	if (DLIST_IS_HEAD(dlist, Lelement))
	{
		dlist->pDListElmtHead = dlist->pDListElmtHead->pNext;

		if (1 == DLIST_SIZE(dlist))
		{/*最后一个元素*/
			dlist->pDListElmtHead = NULL;
			dlist->pDListElmtTail = NULL;
		}
		else
		{
			dlist->pDListElmtHead->pPrev = NULL;
		}

	}
	else if (DLIST_IS_TAIL(dlist, Lelement))
	{
		dlist->pDListElmtTail = dlist->pDListElmtTail->pPrev;

		if (1 == DLIST_SIZE(dlist))
		{/*最后一个元素*/
			dlist->pDListElmtHead = NULL;
			dlist->pDListElmtTail = NULL;
		}
		else
		{
			dlist->pDListElmtTail->pNext = NULL;
		}
	}
	else
	{
		Lelement->pNext->pPrev = Lelement->pPrev;
		Lelement->pPrev->pNext = Lelement->pNext;
	}

	free(Lelement);

	dlist->iSize--;

	return 0 ;
}

/*
*函数名:DList_Sort
*参数:dlist 链表
*功能:双链表排序
*返回值:无 
*作者:AlbertoNo1
*日期:2016-04-20
*/
void DList_Sort(DList *dlist)
{
	DListElmt  *pElmentPos = NULL;
	DListElmt  *pElmentA = NULL;
	DListElmt  *pElmentB = NULL;

	if (0 == DLIST_SIZE(dlist))
	{
		return ;
	}

	for (pElmentA = dlist->pDListElmtHead; NULL != pElmentA; pElmentA = pElmentA->pNext)
	{
		pElmentPos = pElmentA;

		for (pElmentB = pElmentA->pNext; NULL != pElmentB; pElmentB = pElmentB->pNext)
		{
			if (dlist->compare(&(pElmentB->uiValueA), &(pElmentPos->uiValueA)) < 0)
			{
				pElmentPos = pElmentB;
			}
		}

		if (pElmentPos != pElmentA)
		{
			DList_Swap(pElmentPos, pElmentA);
		}
	}
}

/*
*函数名:DList_Swap
*参数:dlist  链表
*功能:双链表交换两个结点的数据域
*返回值:无 
*作者:AlbertoNo1
*日期:2016-04-20
*/
void DList_Swap(DListElmt *LelementKey1, DListElmt *LelementKey2)
{
	unsigned int uiValueA = 0;   
	unsigned int *puiValueB = NULL; 

	uiValueA = LelementKey1->uiValueA;
	puiValueB = LelementKey1->puiValueB;

	LelementKey1->uiValueA = LelementKey2->uiValueA;
	LelementKey1->puiValueB = LelementKey2->puiValueB;

	LelementKey2->uiValueA = uiValueA;
	LelementKey2->puiValueB = puiValueB;
}


/*
*函数名:DList_Destory
*参数:dlist 链表
*功能:双链表销毁函数
*返回值:无 
*作者:AlbertoNo1
*日期:2016-04-20
*/
void DList_Destory(DList *dlist)
{
	unsigned int uiDataA = 0;
	unsigned int *puiDataB = NULL;

	while (DLIST_SIZE(dlist) > 0)
	{
		if ((0 == DList_Remove(dlist, DLIST_HEAD(dlist), &uiDataA, &puiDataB))&&(NULL != dlist->destory))
		{
			dlist->destory(puiDataB);
		}
	}
}

/*空链表插入*/
void test_func1(DList *dlist)
{
	int iRet = 0;

	unsigned int uiDataA = 0;
	unsigned int *puiDataB = NULL;

	DListElmt *element = NULL;

	/*测试*/
	uiDataA = 11;
	puiDataB = (unsigned int*)malloc(sizeof(unsigned int));
	if (NULL == puiDataB)
	{
		return;
	}

	*puiDataB = 99;

	iRet = DList_Insert_Next(dlist, NULL, uiDataA, puiDataB);
	if (-1 == iRet)
	{
		return;
	}

	printf("预期结果\n");
	printf("数据:11 99 \n");
	printf("链表大小:1 \n");

	printf("\n实际结果1(顺序)\n");
	printf("数据:");

	for(element = DLIST_HEAD(dlist); NULL != element; element = element->pNext)
	{
		printf("%u %u ", element->uiValueA, *(element->puiValueB));
	}

	printf("\n链表大小:%d \n", DLIST_SIZE(dlist));

	printf("\n实际结果2(逆序)\n");
	printf("数据:");

	for(element = DLIST_TAIL(dlist); NULL != element; element = element->pPrev)
	{
		printf("%u %u ", element->uiValueA, *(element->puiValueB));
	}

	printf("\n链表大小:%d \n", DLIST_SIZE(dlist));

}

/*非空链表插入头结点*/
void test_func2(DList *dlist)
{
	int iRet = 0;

	unsigned int uiDataA = 0;
	unsigned int *puiDataB = NULL;

	DListElmt *element = NULL;

	/*测试*/
	uiDataA = 12;
	puiDataB = (unsigned int*)malloc(sizeof(unsigned int));
	if (NULL == puiDataB)
	{
		return;
	}

	*puiDataB = 98;

	iRet = DList_Insert_Next(dlist, NULL, uiDataA, puiDataB);
	if (-1 == iRet)
	{
		return;
	}

	printf("预期结果\n");
	printf("数据:12 98 11 99 \n");
	printf("链表大小:2 \n");

	printf("\n实际结果1(顺序)\n");
	printf("数据:");

	for(element = DLIST_HEAD(dlist); NULL != element; element = element->pNext)
	{
		printf("%u %u ", element->uiValueA, *(element->puiValueB));
	}

	printf("\n链表大小:%d \n", DLIST_SIZE(dlist));

	printf("\n实际结果2(逆序)\n");
	printf("数据:");

	for(element = DLIST_TAIL(dlist); NULL != element; element = element->pPrev)
	{
		printf("%u %u ", element->uiValueA, *(element->puiValueB));
	}

	printf("\n链表大小:%d \n", DLIST_SIZE(dlist));

}

/*非空链表插入尾结点*/
void test_func3(DList *dlist)
{
	int iRet = 0;

	unsigned int uiDataA = 0;
	unsigned int *puiDataB = NULL;

	DListElmt *element = NULL;

	/*测试*/
	uiDataA = 13;
	puiDataB = (unsigned int*)malloc(sizeof(unsigned int));
	if (NULL == puiDataB)
	{
		return;
	}

	*puiDataB = 97;

	iRet = DList_Insert_Next(dlist, DLIST_TAIL(dlist), uiDataA, puiDataB);
	if (-1 == iRet)
	{
		return;
	}

	printf("预期结果\n");
	printf("数据:12 98 11 99 13 97\n");
	printf("链表大小:3 \n");

	printf("\n实际结果1(顺序)\n");
	printf("数据:");

	for(element = DLIST_HEAD(dlist); NULL != element; element = element->pNext)
	{
		printf("%u %u ", element->uiValueA, *(element->puiValueB));
	}

	printf("\n链表大小:%d \n", DLIST_SIZE(dlist));

	printf("\n实际结果2(逆序)\n");
	printf("数据:");

	for(element = DLIST_TAIL(dlist); NULL != element; element = element->pPrev)
	{
		printf("%u %u ", element->uiValueA, *(element->puiValueB));
	}

	printf("\n链表大小:%d \n", DLIST_SIZE(dlist));

}

/*非空链表插入非头尾结点*/
void test_func4(DList *dlist)
{
	int iRet = 0;

	unsigned int uiDataA = 0;
	unsigned int *puiDataB = NULL;

	DListElmt *element = NULL;

	/*测试*/
	uiDataA = 14;
	puiDataB = (unsigned int*)malloc(sizeof(unsigned int));
	if (NULL == puiDataB)
	{
		return;
	}

	*puiDataB = 96;

	iRet = DList_Insert_Next(dlist, dlist->pDListElmtHead->pNext, uiDataA, puiDataB);
	if (-1 == iRet)
	{
		return;
	}

	printf("预期结果\n");
	printf("数据:12 98 11 99 14 96 13 97\n");
	printf("链表大小:4 \n");

	printf("\n实际结果1(顺序)\n");
	printf("数据:");

	for(element = DLIST_HEAD(dlist); NULL != element; element = element->pNext)
	{
		printf("%u %u ", element->uiValueA, *(element->puiValueB));
	}

	printf("\n链表大小:%d \n", DLIST_SIZE(dlist));

	printf("\n实际结果2(逆序)\n");
	printf("数据:");

	for(element = DLIST_TAIL(dlist); NULL != element; element = element->pPrev)
	{
		printf("%u %u ", element->uiValueA, *(element->puiValueB));
	}

	printf("\n链表大小:%d \n", DLIST_SIZE(dlist));

}

/*空链表插入*/
void test_func5(DList *dlist)
{
	int iRet = 0;

	unsigned int uiDataA = 0;
	unsigned int *puiDataB = NULL;

	DListElmt *element = NULL;

	/*测试*/
	uiDataA = 11;
	puiDataB = (unsigned int*)malloc(sizeof(unsigned int));
	if (NULL == puiDataB)
	{
		return;
	}

	*puiDataB = 99;

	iRet = DList_Insert_Prev(dlist, NULL, uiDataA, puiDataB);
	if (-1 == iRet)
	{
		return;
	}

	printf("预期结果\n");
	printf("数据:11 99 \n");
	printf("链表大小:1 \n");

	printf("\n实际结果1(顺序)\n");
	printf("数据:");

	for(element = DLIST_HEAD(dlist); NULL != element; element = element->pNext)
	{
		printf("%u %u ", element->uiValueA, *(element->puiValueB));
	}

	printf("\n链表大小:%d \n", DLIST_SIZE(dlist));

	printf("\n实际结果2(逆序)\n");
	printf("数据:");

	for(element = DLIST_TAIL(dlist); NULL != element; element = element->pPrev)
	{
		printf("%u %u ", element->uiValueA, *(element->puiValueB));
	}

	printf("\n链表大小:%d \n", DLIST_SIZE(dlist));

}

/*非空链表插入头结点*/
void test_func6(DList *dlist)
{
	int iRet = 0;

	unsigned int uiDataA = 0;
	unsigned int *puiDataB = NULL;

	DListElmt *element = NULL;

	/*测试*/
	uiDataA = 12;
	puiDataB = (unsigned int*)malloc(sizeof(unsigned int));
	if (NULL == puiDataB)
	{
		return;
	}

	*puiDataB = 98;

	iRet = DList_Insert_Prev(dlist, DLIST_HEAD(dlist), uiDataA, puiDataB);
	if (-1 == iRet)
	{
		return;
	}

	printf("预期结果\n");
	printf("数据:12 98 11 99 \n");
	printf("链表大小:2 \n");

	printf("\n实际结果1(顺序)\n");
	printf("数据:");

	for(element = DLIST_HEAD(dlist); NULL != element; element = element->pNext)
	{
		printf("%u %u ", element->uiValueA, *(element->puiValueB));
	}

	printf("\n链表大小:%d \n", DLIST_SIZE(dlist));

	printf("\n实际结果2(逆序)\n");
	printf("数据:");

	for(element = DLIST_TAIL(dlist); NULL != element; element = element->pPrev)
	{
		printf("%u %u ", element->uiValueA, *(element->puiValueB));
	}

	printf("\n链表大小:%d \n", DLIST_SIZE(dlist));

}

/*非空链表插入尾结点*/
void test_func7(DList *dlist)
{
	int iRet = 0;

	unsigned int uiDataA = 0;
	unsigned int *puiDataB = NULL;

	DListElmt *element = NULL;

	/*测试*/
	uiDataA = 13;
	puiDataB = (unsigned int*)malloc(sizeof(unsigned int));
	if (NULL == puiDataB)
	{
		return;
	}

	*puiDataB = 97;

	iRet = DList_Insert_Prev(dlist, NULL, uiDataA, puiDataB);
	if (-1 == iRet)
	{
		return;
	}

	printf("预期结果\n");
	printf("数据:12 98 11 99 13 97\n");
	printf("链表大小:3 \n");

	printf("\n实际结果1(顺序)\n");
	printf("数据:");

	for(element = DLIST_HEAD(dlist); NULL != element; element = element->pNext)
	{
		printf("%u %u ", element->uiValueA, *(element->puiValueB));
	}

	printf("\n链表大小:%d \n", DLIST_SIZE(dlist));

	printf("\n实际结果2(逆序)\n");
	printf("数据:");

	for(element = DLIST_TAIL(dlist); NULL != element; element = element->pPrev)
	{
		printf("%u %u ", element->uiValueA, *(element->puiValueB));
	}

	printf("\n链表大小:%d \n", DLIST_SIZE(dlist));

}

/*非空链表插入非头尾结点*/
void test_func8(DList *dlist)
{
	int iRet = 0;

	unsigned int uiDataA = 0;
	unsigned int *puiDataB = NULL;

	DListElmt *element = NULL;

	/*测试*/
	uiDataA = 14;
	puiDataB = (unsigned int*)malloc(sizeof(unsigned int));
	if (NULL == puiDataB)
	{
		return;
	}

	*puiDataB = 96;

	iRet = DList_Insert_Prev(dlist, dlist->pDListElmtHead->pNext, uiDataA, puiDataB);
	if (-1 == iRet)
	{
		return;
	}

	printf("预期结果\n");
	printf("数据:12 98 14 96 11 99 13 97\n");
	printf("链表大小:4 \n");

	printf("\n实际结果1(顺序)\n");
	printf("数据:");

	for(element = DLIST_HEAD(dlist); NULL != element; element = element->pNext)
	{
		printf("%u %u ", element->uiValueA, *(element->puiValueB));
	}

	printf("\n链表大小:%d \n", DLIST_SIZE(dlist));

	printf("\n实际结果2(逆序)\n");
	printf("数据:");

	for(element = DLIST_TAIL(dlist); NULL != element; element = element->pPrev)
	{
		printf("%u %u ", element->uiValueA, *(element->puiValueB));
	}

	printf("\n链表大小:%d \n", DLIST_SIZE(dlist));

}

/*销毁链表*/
void test_func9(DList *dlist)
{

	DListElmt *element = NULL;

	/*测试*/


	DList_Destory(dlist);

	printf("预期结果\n");
	printf("数据:\n");
	printf("链表大小:0 \n");

	printf("\n实际结果1(顺序)\n");
	printf("数据:");

	for(element = DLIST_HEAD(dlist); NULL != element; element = element->pNext)
	{
		printf("%u %u ", element->uiValueA, *(element->puiValueB));
	}

	printf("\n链表大小:%d \n", DLIST_SIZE(dlist));

	printf("\n实际结果2(逆序)\n");
	printf("数据:");

	for(element = DLIST_TAIL(dlist); NULL != element; element = element->pPrev)
	{
		printf("%u %u ", element->uiValueA, *(element->puiValueB));
	}

	printf("\n链表大小:%d \n", DLIST_SIZE(dlist));

}

/*删除链表指定元素*/
void test_func10(DList *dlist)
{
	int iRet = 0;

	unsigned int uiDataA = 0;
	unsigned int *puiDataB = NULL;

	DListElmt *element = NULL;

	/*测试*/

	iRet = DList_Remove(dlist, DLIST_TAIL(dlist), &uiDataA, &puiDataB);
	if (-1 == iRet)
	{
		return;
	}

	printf("预期结果\n");
	printf("数据:12 98 14 96 11 99 \n");
	printf("链表大小:3 \n");

	printf("\n实际结果1(顺序)\n");
	printf("数据:");

	for(element = DLIST_HEAD(dlist); NULL != element; element = element->pNext)
	{
		printf("%u %u ", element->uiValueA, *(element->puiValueB));
	}

	printf("\n链表大小:%d \n", DLIST_SIZE(dlist));

	printf("\n实际结果2(逆序)\n");
	printf("数据:");

	for(element = DLIST_TAIL(dlist); NULL != element; element = element->pPrev)
	{
		printf("%u %u ", element->uiValueA, *(element->puiValueB));
	}

	printf("\n链表大小:%d \n", DLIST_SIZE(dlist));

}

/*删除链表指定元素*/
void test_func11(DList *dlist)
{
	int iRet = 0;

	unsigned int uiDataA = 0;
	unsigned int *puiDataB = NULL;

	DListElmt *element = NULL;

	/*测试*/

	iRet = DList_Remove(dlist, dlist->pDListElmtHead->pNext, &uiDataA, &puiDataB);
	if (-1 == iRet)
	{
		return;
	}

	printf("预期结果\n");
	printf("数据:12 98 11 99 \n");
	printf("链表大小:2 \n");

	printf("\n实际结果1(顺序)\n");
	printf("数据:");

	for(element = DLIST_HEAD(dlist); NULL != element; element = element->pNext)
	{
		printf("%u %u ", element->uiValueA, *(element->puiValueB));
	}

	printf("\n链表大小:%d \n", DLIST_SIZE(dlist));

	printf("\n实际结果2(逆序)\n");
	printf("数据:");

	for(element = DLIST_TAIL(dlist); NULL != element; element = element->pPrev)
	{
		printf("%u %u ", element->uiValueA, *(element->puiValueB));
	}

	printf("\n链表大小:%d \n", DLIST_SIZE(dlist));

}

/*双链表排序*/
void test_func12(DList *dlist)
{
	int iRet = 0;

	DListElmt *element = NULL;

	/*测试*/
	DList_Sort(dlist);

	printf("预期结果\n");
	printf("数据:11 99 12 98 13 97 14 96\n");
	printf("链表大小:4 \n");

	printf("\n实际结果1(顺序)\n");
	printf("数据:");

	for(element = DLIST_HEAD(dlist); NULL != element; element = element->pNext)
	{
		printf("%u %u ", element->uiValueA, *(element->puiValueB));
	}

	printf("\n链表大小:%d \n", DLIST_SIZE(dlist));

	printf("\n实际结果2(逆序)\n");
	printf("数据:");

	for(element = DLIST_TAIL(dlist); NULL != element; element = element->pPrev)
	{
		printf("%u %u ", element->uiValueA, *(element->puiValueB));
	}

	printf("\n链表大小:%d \n", DLIST_SIZE(dlist));

}

int _tmain(int argc, _TCHAR* argv[])
{
	int iRet = 0;
	int iLoop = 0;

	DList stDList = {0};
	DListElmt *element = NULL;

	/*链表初始化*/
	DList_Init(&stDList, MemoryFree, DataCompare);

	/*测试1*/
	test_func5(&stDList);

	printf("\n\n");

	/*测试2*/
	test_func6(&stDList);

	printf("\n\n");

	/*测试3*/
	test_func7(&stDList);

	printf("\n\n");

	/*测试4*/
	test_func8(&stDList);

	printf("\n\n");

	test_func12(&stDList);

	//test_func9(&stDList);
	//test_func10(&stDList);

	//printf("\n\n");

	//test_func9(&stDList);
	//test_func11(&stDList);

	DList_Destory(&stDList);

	getchar();
	return 0;
}


  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值