#define _CRT_SECURE_NO_WARNINGS 1
#include "LN.h"
bool LNempty(ListNode* pHead)
{
assert(pHead);
return pHead->_next == pHead;
}
ListNode* Buynode()
{
ListNode* newnode = (ListNode*)malloc(sizeof(ListNode));
if (newnode == NULL)
{
perror("malloc false");
return NULL;
}
return newnode;
}
ListNode* ListCreate()
{
ListNode* head = Buynode();
head->_next = head;
head->_prev = head;
return head;
}
void ListDestory(ListNode* pHead)
{
assert(pHead);
ListNode* cur = pHead->_next;
while (cur->_next != pHead)
{
ListNode* next = cur->_next;
free(cur);
cur = next;
}
free(pHead);
}
void ListPrint(ListNode* pHead)
{
assert(pHead);
ListNode* cur = pHead;
printf("head->");
while (cur->_next != pHead)
{
cur = cur->_next;
printf("%d-> ", cur->_data);
}
printf("head\n");
}
void ListPushBack(ListNode* pHead, LTDataType x)
{
assert(pHead);
ListNode* tail = pHead->_prev;
ListNode* newnode = Buynode();
newnode->_data = x;
newnode->_prev = tail;
newnode->_next = pHead;
tail->_next = newnode;
pHead->_prev = newnode;
}
void ListPopBack(ListNode* pHead)
{
assert(pHead);
assert(!LNempty(pHead));
ListNode* tail = pHead->_prev;
pHead->_prev = tail->_prev;
tail->_prev->_next = pHead;
free(tail);
}
void ListPushFront(ListNode* pHead, LTDataType x)
{
assert(pHead);
ListNode* newnode = Buynode();
newnode->_data = x;
newnode->_next = pHead->_next;
newnode->_prev = pHead;
pHead->_next->_prev = newnode;
pHead->_next = newnode;
}
void ListPopFront(ListNode* pHead)
{
assert(pHead);
assert(!LNempty(pHead));
ListNode* first = pHead->_next;
ListNode* second = first->_next;
pHead->_next = second;
second->_prev = pHead;
free(first);
}
ListNode* ListFind(ListNode* pHead, LTDataType x)
{
assert(pHead);
ListNode* cur = pHead->_next;
while (cur != pHead)
{
if (cur->_data == x)
{
return cur;
}
cur = cur->_next;
}
return NULL;
}
void ListInsert(ListNode* pos, LTDataType x)
{
assert(pos);
ListNode* newnode = Buynode();
ListNode* prev = pos->_prev;
newnode->_data = x;
newnode->_next = pos;
newnode->_prev = prev;
prev->_next = newnode;
pos->_prev = newnode;
}
void ListErase(ListNode* pos)
{
assert(pos);
ListNode* next = pos->_next;
ListNode* prev = pos->_prev;
next->_prev = prev;
prev->_next = next;
free(pos);
}
链表之双向循环带头链表
最新推荐文章于 2024-07-18 13:20:33 发布