双链表的基本操作和单链表是相同的:增 、删、改
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int DataType;
typedef struct DList
{
DataType data;
struct DList *pPrev;
struct DList *pNext;
}DList;
DList * BuyNewNode(DataType data);
void Init(DList ** ppHead);
void PushBack(DList ** ppHead,DataType data);
void PushFront(DList **ppHead, DataType data);
void Insert(DList **ppHead, DList *pPos, DataType data);
void Earse(DList **ppHead, DList *pPos);
void PopBack(DList *pHead);
void PopFront(DList * pHead);
void Remove(DList ** ppHead,DataType data);
void RemoveAll(DList ** ppHead, DataType data);
DList * Find(DList *pHead,DataType data);
void Print(DList *pHead);
void Clear(DList *pHead);
void Destroy(DList **ppHead);
#include"DList.h"
DList * BuyNewNode(DataType data)
{
DList * pNode;
pNode = (DList *)malloc(sizeof (DList));
assert(pNode);
pNode->data = data;
pNode->pPrev = NULL;
pNode->pNext = NULL;
return pNode;
}
void Init(DList ** ppHead)
{
int no_use = 0;
*ppHead = BuyNewNode(no_use);
(*ppHead)->pNext = *ppHead;
(*ppHead)->pPrev = *ppHead;
}
void PushBack(DList **ppHead,DataType data)
{
DList *pLast,*pNewNode;
pNewNode = BuyNewNode(data);
pLast = (*ppHead)->pPrev;
pNewNode->pNext = *ppHead;
pNewNode->pPrev = pLast;
pLast->pNext = pNewNode;
(*ppHead)->pPrev = pNewNode;
}
void PushFront(DList **ppHead, DataType data)
{
DList *pFirst, *pNewNode;
pNewNode = BuyNewNode(data);
pFirst = (*ppHead)->pNext;
pNewNode->pNext = pFirst;
pNewNode->pPrev = *ppHead;
pFirst->pPrev = pNewNode;
(*ppHead)->pNext = pNewNode;
}
void Insert(DList **ppHead, DList *pPos, DataType data)
{
DList *pNewNode,*pPrevpos;
pNewNode = BuyNewNode(data);
pPrevpos = pPos->pPrev;
pNewNode->pNext = pPos;
pNewNode->pPrev = pPrevpos;
pPos->pPrev = pNewNode;
pPrevpos->pNext = pNewNode;
}
void Earse(DList **ppHead, DList *pPos)
{
DList *pPrePos,*pNext;
pPrePos = pPos->pPrev;
pNext = pPos->pNext;
pPrePos->pNext = pNext;
pNext->pPrev = pPrePos;
}
void PopBack(DList * pHead)
{
DList *pLast, *pPrePos;
pLast = pHead->pPrev;
pPrePos = pLast->pPrev;
pHead->pPrev = pPrePos;
pPrePos->pNext = pHead;
}
void PopFront(DList *pHead)
{
DList *pFirst, *pSec;
pFirst = pHead->pNext;
pSec = pFirst ->pNext;
pHead->pNext = pSec;
pSec->pPrev = pHead;
free(pFirst);
pFirst = NULL;
}
void Remove(DList ** ppHead, DataType data)
{
DList * pNode;
pNode = Find(*ppHead, data);
if (pNode == NULL)
{
printf("输入数据不存在\n");
}
else
{
Earse(ppHead, pNode);
}
}
void RemoveAll(DList ** ppHead, DataType data)
{
DList * pNode;
while (Find(*ppHead, data))
{
pNode = Find(*ppHead, data);
if (pNode == NULL)
{
printf("输入数据不存在\n");
}
else
{
Earse(ppHead, pNode);
}
}
}
DList * Find(DList * pHead,DataType data)
{
DList *pNode;
for (pNode = pHead->pNext; pNode != pHead; pNode = pNode->pNext)
{
if (pNode->data == data)
{
return pNode;
}
}
return NULL;
}
void Print(DList *pHead)
{
DList *pNode;
pNode = pHead;
printf("%2d->", pHead->data);
for (pNode = pHead->pNext; pNode != pHead; pNode = pNode->pNext)
{
printf("%2d->", pNode->data);
}
printf("%2d", pHead->data);
printf("\n");
}
void Clear(DList * pHead)
{
DList * pNode,*pNext;
for (pNode = pHead->pNext; pNode != pHead; pNode = pNext)
{
pNext = pNode->pNext;
free(pNode);
pNode = NULL;
}
pHead->pNext = pHead;
pHead->pPrev = pHead;
}
void Destroy(DList **ppHead)
{
Clear(*ppHead);
free(*ppHead);
*ppHead = NULL;
printf("销毁成功\n");
}
#include"DList.h"
void test()
{
DList * DL;
Init(&DL);
PushBack(&DL, 4);
PushBack(&DL, 5);
PushBack(&DL, 5);
PushBack(&DL, 4);
PushBack(&DL, 4);
PushBack(&DL, 5);
PushFront(&DL, 3);
Print(DL);
Insert(&DL, DL->pNext, 2);
Print(DL);
Earse(&DL, DL->pNext);
Print(DL);
PopBack(DL);
Print(DL);
PopFront(DL);
Print(DL);
Remove(&DL, 3);
Print(DL);
RemoveAll(&DL, 4);
Print(DL);
Destroy(&DL);
}
int main()
{
test();
return 0;
}