雙向鏈表介紹
雙向鏈表,如同其名所暗示的那樣,鏈表元素之間由兩個指針鏈接。雙向鏈表中的每一個元素都由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;
}