1.Data.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int LTDataType;
typedef struct LTListNode
{
struct LTListNode* prev;
struct LTListNode* next;
LTDataType x;
}LTNode;
LTNode* LTInit();
void LTPushBack(LTNode* phead, LTDataType x);
void LTPushFront(LTNode* phead, LTDataType x);
void LTPopBack(LTNode* phead);
void LTPopFront(LTNode* phead);
void LTInsert(LTNode* pos, LTDataType x);
void LTErases(LTNode* pos);
void LTPrint(LTNode* phead);
//如果我们需要快速完成一个链表,只需要写好LTInsert,头插和尾插都可以复用
//同理,只需要写好LTErase,头删尾删都可以完成
// 双向链表销毁
void LTDestory(LTNode* phead);
2.main.cpp
#include"Data.h"
int main()
{
LTNode* phead = LTInit();
LTPushBack(phead, 213);
LTPushBack(phead, -23);
LTPushBack(phead, 2);
LTPushFront(phead, 23);
LTPushBack(phead, 123);
LTPrint(phead);
LTPopBack(phead);
LTPrint(phead);
LTErases(phead->next->next);
LTPrint(phead);
return 0;
}
3.Data.cpp
#include"Data.h"
LTNode* LTInit()
{
LTListNode* newnode = (LTNode*)malloc(sizeof(LTNode));
newnode->next = newnode;
newnode->prev = newnode;
newnode->x = 0;
return newnode;
}
void LTInsert(LTNode* pos, LTDataType x)
{
assert(pos);
LTNode* newnode = LTInit();
newnode->x = x;
LTNode* posnext = pos->next;
pos->next = newnode;
newnode->next = posnext;
newnode->prev = pos;
posnext->prev = newnode;
}
void LTPushBack(LTNode* phead, LTDataType x)
{
LTInsert(phead->prev, x);
}
void LTPushFront(LTNode* phead, LTDataType x)
{
LTInsert(phead, x);
}
void LTPopFront(LTNode* phead)
{
assert(phead);
/*if (phead->next == phead)
return;
else if (phead->next->next == phead)
{
free(phead->next);
phead->prev = phead;
phead->next = phead;
}
else
{
LTNode* next = phead->next->next;
free(phead->next);
phead->next = next;
next->prev = phead;
}*/
LTErases(phead->next);
}
void LTPopBack(LTNode* phead)
{
assert(phead);
/*if (phead->next == phead)
{
return;
}
else if (phead->next->next==phead)
{
free(phead->next);
phead->next = phead;
phead->prev = phead;
}
else
{
LTNode* tail = phead->prev;
LTNode* tailprev = tail->prev;
free(tail);
tailprev->next = phead;
phead->prev = tailprev;
}*/
LTErases(phead->prev);
}
void LTErases(LTNode* pos)
{
assert(pos);
LTNode* posnext = pos->next;
LTNode* posprev = pos->prev;
free(pos);
posnext->prev = posprev;
posprev->next = posnext;
}
void LTPrint(LTNode* phead)
{
assert(phead);
LTNode* cur = phead->next;
printf("head<=>");
while (cur!=phead)
{
printf("%d<=>", cur->x);
cur = cur->next;
}
printf("head\n");
printf("\n");
}