双向链表
头文件DList.h:
#ifndef __DLIST_H__
#define __DLIST_H__
#include <stdio.h>
#include <assert.h>
#include <stdlib.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 Clear(DList *pHead);
void Destory(DList **ppHead);
void PushBack(DList *pHead,DataType data);
void PushFront(DList *pHead,DataType data);
void Print(DList *pHead);
void Insert(DList *pHead,DList *pPos,DataType data);
void Erase(DList *pHead, DList *pPos);
void PopBack(DList *pHead);
void PopFront(DList *pHead);
DList *Find(DList *pHead,DataType data);
#endif //__DLIST_H__
主函数:
#include "DList.h"
int main()
{
DList *pHead;
Init(&pHead);
PushBack(pHead,2);
PushFront(pHead,1);
Insert(pHead,pHead,2);
Insert(pHead,pHead->pNext,1);
Print(pHead);
Erase(pHead,Find(pHead,1));
Print(pHead);
Destory(&pHead);
}
函数实现DList.c:
#include "DList.h"
DList *BuyNewNode(DataType data)
{
DList *pNewNode = (DList *)malloc(sizeof(DList));
assert(pNewNode);
pNewNode->data = data;
pNewNode->pPrev = NULL;
pNewNode->pNext = NULL;
return pNewNode;
};
void Init(DList **ppHead)
{
int no_use = 0;
*ppHead = (DList *)BuyNewNode(no_use);
(*ppHead)->pPrev = *ppHead;
(*ppHead)->pNext = *ppHead;
}
void Clear(DList *pHead)
{
DList *pNode = NULL;
DList *pNext = NULL;
for(pNode=pHead->pNext; pNode!=pHead; pNode=pNext)
{
pNext = pNode->pNext;
free(pNode);
}
pHead->pPrev = pHead;
pHead->pNext = pHead;
}
void Destory(DList **ppHead)
{
Clear(*ppHead);
free(*ppHead);
*ppHead = NULL;
}
void PushBack(DList *pHead,DataType data)
{
DList *pNewNode = BuyNewNode(data);
DList *pLast = pHead->pPrev;
pLast->pNext = pNewNode;
pNewNode->pPrev = pLast;
pNewNode->pNext = pHead;
pHead->pPrev = pNewNode;
}
void PushFront(DList *pHead,DataType data)
{
DList *pNewNode = BuyNewNode(data);
DList *pFirst = pHead->pNext;
pHead->pNext = pNewNode;
pNewNode->pPrev = pHead;
pNewNode->pNext = pFirst;
pFirst->pPrev = pNewNode;
}
void Insert(DList *pHead,DList *pPos,DataType data)
{
DList *pNewNode = BuyNewNode(data);
DList *pPrev = pPos->pPrev;
pPrev->pNext = pNewNode;
pNewNode->pPrev = pPrev;
pNewNode->pNext = pPos;
pPos->pPrev = pNewNode;
}
void Print(DList *pHead)
{
DList *pNode = pHead;
for(pNode=pHead->pNext; pNode!=pHead;pNode=pNode->pNext)
{
printf("%d -> ",pNode->data);
}
printf("\n");
}
void Erase(DList *pHead, DList *pPos)
{
DList *pLast = pPos->pPrev;
DList *pNext = pPos->pNext;
pLast->pNext = pNext;
pNext->pPrev = pLast;
free(pPos);
}
void PopBack(DList *pHead)
{
Erase(pHead,pHead->pPrev);
}
void PopFront(DList *pHead)
{
Erase(pHead,pHead->pNext);
}
DList *Find(DList *pHead,DataType data)
{
DList *pNode = pHead;
for(pNode=pHead->pNext; pNode!=pHead; pNode=pNode->pNext)
{
if(pNode->data == data)
return pNode;
}
return NULL;
}
执行结果: