HeadFile.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
DoubleLinklist.h
#pragma once
#include"HeadFile.h"
typedef int LTDataType;
typedef struct ListNode
{
LTDataType _data;
struct ListNode* _next;
struct ListNode* _prev;
}ListNode;
ListNode *BuyNode(LTDataType x);
ListNode* ListCreate();
void ListDestory(ListNode** pHead);
void ListPrint(ListNode* pHead);
void ListPushBack(ListNode* pHead, LTDataType x);
bool ListEmpty(ListNode *pHead);
void ListPopBack(ListNode* pHead);
void ListPushFront(ListNode* pHead, LTDataType x);
void ListPopFront(ListNode* pHead);
ListNode* ListFind(ListNode* pHead, LTDataType x);
void ListInsert(ListNode* pos, LTDataType x);
void ListErase(ListNode* pos);
DoubleLinklist.c
#include"HeadFile.h"
#include"DoubleLinklist.h"
ListNode *BuyNode(LTDataType x)
{
ListNode *newnode = (ListNode*)malloc(sizeof(ListNode));
if (!newnode)
{
assert(0);
return NULL;
}
newnode->_data = x;
newnode->_next = NULL;
newnode->_prev = NULL;
return newnode;
}
ListNode* ListCreate()
{
ListNode *head = BuyNode(0);
head->_next = head;
head->_prev = head;
return head;
}
void ListDestory(ListNode** pHead)
{
ListNode* cur = (*pHead)->_next;
while (cur != *pHead)
{
(*pHead)->_next = cur->_next;
free(cur);
cur = (*pHead)->_next;
}
free(*pHead);
*pHead = NULL;
}
void ListPrint(ListNode* pHead)
{
assert(pHead);
ListNode *cur = pHead->_next;
while (cur != pHead)
{
printf("%d ", cur->_data);
cur = cur->_next;
}
printf("\n");
}
void ListPushBack(ListNode* pHead, LTDataType x)
{
ListNode *cur = pHead;
ListNode *newnode = BuyNode(x);
newnode->_prev = cur->_prev;
newnode->_next = cur;
cur->_prev = newnode;
newnode->_prev->_next = newnode;
}
bool ListEmpty(ListNode *pHead)
{
assert(pHead);
return pHead->_next == pHead;
}
void ListPopBack(ListNode* pHead)
{
ListNode *cur = pHead;
if (ListEmpty(pHead))
return;
ListNode *tmp = cur->_prev;
cur->_prev->_prev->_next = cur;
cur->_prev = cur->_prev->_prev;
free(tmp);
}
void ListPushFront(ListNode* pHead, LTDataType x)
{
ListNode *newnode = BuyNode(x);
ListNode *cur = pHead;
newnode->_next = cur->_next;
newnode->_prev = cur;
cur->_next = newnode;
newnode->_next->_prev = newnode;
}
void ListPopFront(ListNode* pHead)
{
if (ListEmpty(pHead))
return;
ListNode *delnode = NULL;
delnode = pHead->_next;
delnode->_next->_prev = pHead;
pHead->_next = delnode->_next;
free(delnode);
}
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)
{
if (!pos)
return;
ListNode *newnode = BuyNode(x);
newnode->_prev = pos->_prev;
newnode->_next = pos;
pos->_prev->_next = newnode;
pos->_prev = newnode;
}
void ListErase(ListNode* pos)
{
if (!pos)
return;
pos->_prev->_next = pos->_next;
pos->_next->_prev = pos->_prev;
free(pos);
}
main.c
#include"HeadFile.h"
#include"DoubleLinklist.h"
void test1()
{
ListNode *L = NULL;
L = ListCreate();
ListPushBack(L, 1);
ListPushBack(L, 2);
ListPushBack(L, 3);
ListPrint(L);
ListPushFront(L, 4);
ListPushFront(L, 5);
ListPushFront(L, 6);
ListPrint(L);
ListPopBack(L);
ListPopBack(L);
ListPopBack(L);
ListPrint(L);
ListPopFront(L);
ListPopFront(L);
ListPrint(L);
ListDestory(&L);
}
void test2()
{
ListNode *L = ListCreate();
ListPushBack(L, 1);
ListPushBack(L, 2);
ListPushBack(L, 3);
ListPushBack(L, 4);
ListPushBack(L, 5);
ListPushBack(L, 6);
ListPrint(L);
ListInsert(ListFind(L, 4), 10);
ListPrint(L);
ListErase(ListFind(L, 1));
ListPrint(L);
ListDestory(&L);
}
int main()
{
test1();
test2();
return 0;
}
|