带头循环双向链表的具体实现
typedef int LTDataType;
typedef struct ListNode
{
LTDataType data;
struct ListNode* next;
struct ListNode* prev;
}ListNode;
ListNode* ListCreate();
void ListDestory(ListNode* plist);
void ListPrint(ListNode* plist);
void ListPushBack(ListNode* plist, LTDataType x);
void ListPopBack(ListNode* plist);
void ListPushFront(ListNode* plist, LTDataType x);
void ListPopFront(ListNode* plist);
ListNode* ListFind(ListNode* plist, LTDataType x);
void ListInsert(ListNode* pos, LTDataType x);
void ListErase(ListNode* pos);
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include <malloc.h>
#include "text2.h"
ListNode* ListNodeBuy()
{
ListNode* newNode = malloc(sizeof(ListNode));
newNode->next = NULL;
newNode->prev = NULL;
return newNode;
}
ListNode* ListCreate()
{
ListNode* pHead = (ListNode*)malloc(sizeof(ListNode));
pHead->next = pHead;
pHead->prev = pHead;
return pHead;
}
void ListDestory(ListNode* plist)
{
}
void ListPrint(ListNode* plist)
{
ListNode* cur = plist->next;
while (cur!=plist)
{
printf("%d->",cur->data);
cur = cur->next;
}
printf("\n");
}
void ListPushBack(ListNode* plist, LTDataType x)
{
ListNode* newNode=ListNodeBuy();
newNode->data = x;
ListNode* ListTail = plist->prev;
ListTail->next = newNode;
newNode->prev = ListTail;
newNode->next = plist;
plist->next = newNode;
}
void ListPopBack(ListNode* plist)
{
if (plist->next=plist)
{
return;
}
ListNode* ListTail = plist->prev;
ListNode* newTail = plist->prev->prev;
newTail->next = plist;
plist->prev = newTail;
free(ListTail);
}
void ListPushFront(ListNode* plist, LTDataType x)
{
ListNode* newNode=ListNodeBuy();
newNode->data = x;
newNode->next = plist->next;
plist->next->prev = newNode;
newNode->prev = plist;
plist->next = newNode;
}
void ListPopFront(ListNode* plist)
{
if (plist->next==plist)
{
return;
}
ListNode* ListClean = plist->next;
ListNode* newHead=ListClean->next;
plist->next = newHead;
newHead->prev = plist;
free(ListClean);
}
ListNode* ListFind(ListNode* plist, LTDataType x)
{
if (plist->next==plist)
{
return NULL;
}
ListNode* cur = plist->next;
while (cur!=plist)
{
if (cur->data==x)
{
return cur;
}
cur = cur->next;
}
return NULL;
}
void ListInsert(ListNode* pos, LTDataType x)
{
ListNode* newPos = ListNodeBuy();
newPos->data = x;
newPos->prev = pos->prev;
newPos->next = pos;
pos->prev->next = newPos;
pos->prev = newPos;
}
void ListErase(ListNode* pos)
{
ListNode* prveNode = pos->prev;
ListNode* nextNode = pos->next;
prveNode->next = nextNode;
nextNode->prev = prveNode;
free(pos);
}
int main()
{
system("pause");
return 0;
}