Tow-wayList.h
typedef int LTDataType;
typedef struct ListNode
{
struct ListNode* next;
struct ListNode* prev;
LTDataType val;
}LTNode;
//函数声明
LTNode* LTInit();
void LTPrint(LTNode* phead);
void LTPushBack(LTNode* phead, LTDataType x);
void LTPopBack(LTNode* phead);
void LTPushFront(LTNode* phead, LTDataType x);
void LTPopFront(LTNode* phead);
LTNode* LTFind(LTNode* phead, LTDataType x);
void LTInsert(LTNode* pos, LTDataType x);
void LTErase(LTNode* pos);
void LTDestroy(LTNode* phead)
Tow-wayList.c
#include "Tow-wayList.h"
//创造新节点
LTNode* CreateLTNode(LTDataType x)
{
LTNode* nwenode = (LTNode*)malloc(sizeof(LTNode));
if (nwenode == NULL)
{
perror("malloc fail");
exit(-1);
}
nwenode->val = x;
nwenode->next = NULL;
nwenode->prev = NULL;
return nwenode;
}
//初始化
LTNode* LTInit()
{
LTNode* phead = CreatNode(-1);
phead->next = phead;
phead->prev = phead;
return phead;
}
//打印
void LTPrint(LTNode* phead)
{
assert(phead);
printf("ڱλ");
LTNode* cur = phead->next;
while (cur != phead)
{
printf("%d <->", cur->val);
cur = cur->next;
}
}
//尾插
void LTPushBack(LTNode* phead, LTDataType x)
{
//LTNode* tail = phead->prev;
//LTNode* newnode = CreadeLTNode(x);
//tail->next = newnode;
//newnode->prev = tail;
//newnode->next = phead;
//phead->prev = newnode;
assert(phead);
LTInsert(phead,x);
}
//尾删
void LTPopBack(LTNode* phead)
{
//assert(phead);
//LTNode* tail = phead->prev;
//LTNode* tailPrev = tail->prev;
//free(tail);
//tailPrev->next = phead;
//phead->prev = tailPrev;
assert(phead);
assert(phead->next != phead);
LTErase(phead->prev);
}
//头插
void LTPushFront(LTNode* phead, LTDataType x)
{
assert(phead);
LTInsert(phead->next, x);
}
//头删
void LTPopFront(LTNode* phead)
{
assert(phead);
assert(phead->next != phead);
LTErase(phead->next);
}
//查找
LTNode* LTFind(LTNode* phead, LTDataType x)
{
assert(phead);
LTNode* cur = phead->next;
while (cur != phead)
{
if (cur->val == x)
{
return cur;
}
cur = cur->next;
}
return NULL;
}
//pos位置插入
void LTInsert(LTNode* pos, LTDataType x)
{
assert(pos);
LTNode* newnode = CreateLTNode(x);
LTNode* Postt = pos->prev;
newnode->next = pos;
pos->prev = newnode;
Postt->next = newnode;
newnode->prev = Postt;
}
//pos位置删除
void LTErase(LTNode* pos)
{
LTNode* Prev = pos->prev;
LTNode* Next = pos->next;
free(pos);
pos = NULL;
Prev->next = Next;
Next->prev = Prev;
}
//销毁
void LTDestroy(LTNode* phead)
{
assert(phead);
LTNode* cur = phead->next;
while (cur != phead)
{
LTNode* next = cur->next;
free(cur);
cur = next;
}
free(phead);
}