//定义一个结构体表示双向链表的指针
typedef struct ListNode {
int data;
struct ListNode* next;
struct ListNode* prev;
}LTNode;
//初始化
LTNode* ListCreate() {
LTNode* guard = (LTNode*)malloc(sizeof(LTNode));//开辟一块空间
if (guard == NULL) {
perror("malloc fail:");
exit(-1);
}
guard->next = guard;
guard->prev = guard;
return guard;
}
//节点的创建
LTNode* BuyListNode(int x) {
LTNode* node = (LTNode*)malloc(sizeof(LTNode));
if (node == NULL) {
perror("malloc fail");
exit(-1);
}
node->next = NULL;
node->prev = NULL;
node->data = x;
return node;
}
//双向链表的打印
void ListPrint(LTNode* phead) {
assert(phead);
printf("phead<=>");
LTNode* cur = phead->next;//哨兵节点
while (cur != phead) {
//就是说只要链表中流动指针不返回到哨兵节点就会一直遍历
printf("%d<=>", cur->data);
cur = cur->next;
}
printf("n");
}
//双向链表的尾部插入
void ListPushBack(LTNode* phead, int x) {
assert(phead);
LTNode* newnode = BuyListNode(x);
//首先找到当前的尾结点
LTNode* tail = phead->prev;
//当前尾结点的下一个节点指向新的节点
tail->next = newnode;
//新节点的前一个是当前的尾结点
newnode->prev = tail;
phead->prev = newnode;
newnode->next = phead;
}
//双向链表的前部插入
void ListPushFront(LTNode* phead, int x) {
assert(phead);
LTNode* newnode = BuyListNode(x);
newnode->next = phead->next;
//先处理好newnode与首节点的下一个节点之间的关系
newnode->next = phead->next;
phead->next->prev = newnode;
phead->next = newnode;
newnode->prev = phead;
}
//判断链表是不是空链表
bool ListEmpty(LTNode* phead) {
assert(phead);
return phead->next == phead;
}
//双向链表的尾部删除
void ListPopBack(LTNode* phead) {
assert(phead);
assert(!ListEmpty(phead));
LTNode* tail = phead->prev;
LTNode* prev = tail->prev;
prev->next = phead;
phead->prev = prev;
free(tail);
tail = NULL;
}
//头删
void ListPopFront(LTNode* phead) {
assert(phead);
assert(!ListEmpty(phead));
LTNode* first = phead->next;
LTNode* second = first->next;
phead->next = second;
second->prev = phead;
free(first);
first = NULL;
}
//双向链表元素计数
size_t ListNode(LTNode* phead) {
assert(phead);
size_t n = 0;
LTNode* cur = phead->next;
while (cur != phead) {
++n;
cur = cur->next;
}
return n;
}
//查找
LTNode* ListFind(LTNode* phead, int x) {
assert(phead);
size_t n = 0;
LTNode* cur = phead->next;
while(cur != phead) {
if (cur->data == x) {
return cur;
}
cur = cur->next;
}
return NULL;
}
//在指定的位置之前进行插入
void ListInsert(LTNode* pos, int x) {
assert(pos);
LTNode* prev = pos->prev;
LTNode* newnode = BuyListNode(x);
prev->next = newnode;
newnode->prev = prev;
newnode->next = pos;
pos->prev = newnode;
}
//删除pos位置的值
void ListErase(LTNode* pos) {
assert(pos);
LTNode* prev = pos->prev;
LTNode* next = pos->next;
prev->next = next;
next->prev = prev;
free(pos);
}
//销毁
void ListDestory(LTNode* phead) {
assert(phead);
LTNode* cur = phead->next;
while (cur != phead) {
LTNode* next = cur->next;
free(cur);
cur = next;
}
free(phead);
}