带头双向循环链表的增删查改
程序员文章站
2024-03-22 14:30:28
...
头文件
#include <stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int LTdAateType;
typedef struct ListNode
{
LTdAateType data;
struct ListNode *next;
struct ListNode *prev;
}ListNode;
//初始化链表
ListNode *InitListNode();
//尾插链表
void ListPushBack(ListNode* plist, LTdAateType x);
// 双向链表打印
void ListPrint(ListNode* plist);
// 双向链表头插
void ListPushFront(ListNode* plist, LTdAateType x);
// 双向链表尾删
void ListPopBack(ListNode* plist);
// 双向链表头删
void ListPopFront(ListNode* plist);
// 双向链表查找
ListNode* ListFind(ListNode* plist, LTdAateType x);
// 双向链表在pos的前面进行插入
void ListInsert(ListNode* pos, LTdAateType x);
// 双向链表删除pos位置的节点
void ListErase(ListNode* pos);
实现
#include "List.h"
//新建节点
ListNode *BuyListNode(LTdAateType x)
{
ListNode *NewNode = (struct ListNode*)malloc(sizeof(struct ListNode));
NewNode->data = x;
NewNode->next = NULL;
NewNode->prev = NULL;
return NewNode;
}
//初始化链表
ListNode *InitListNode()
{
ListNode *phead = BuyListNode(0);
phead->next = phead;
phead->prev = phead;
return phead;
}
//尾插链表
void ListPushBack(ListNode* plist, LTdAateType x)
{
assert(plist);
ListNode *tail = plist->prev;
ListNode *Newnode = BuyListNode(x);
tail->next = Newnode;
Newnode->next = plist;
Newnode->prev = tail;
plist->prev = Newnode;
}
// 双向链表打印
void ListPrint(ListNode* plist)
{
assert(plist);
ListNode *cur = plist->next;
while (cur != plist)
{
printf("%d ", cur->data);
cur = cur->next;
}
printf("\n");
}
// 双向链表头插
void ListPushFront(ListNode* plist, LTdAateType x)
{
assert(plist);
ListNode *first = plist->next;
ListNode *newnode = BuyListNode(x);
newnode->next = first;
newnode->prev = plist;
plist->next = newnode;
first->prev = newnode;
}
// 双向链表尾删
void ListPopBack(ListNode* plist)
{
assert(plist);
assert(plist->next != plist);
ListNode *tail = plist->prev;
plist->prev = tail->prev;
(tail->prev)->next = plist;
free(tail);
}
// 双向链表头删
void ListPopFront(ListNode* plist)
{
assert(plist);
assert(plist->next != plist);
ListNode *del = plist->next;
ListNode *delnext = del->next;
delnext->prev = plist;
plist->next = delnext;
free(del);
}
// 双向链表查找
ListNode* ListFind(ListNode* plist, LTdAateType x)
{
assert(plist);
ListNode *cur = plist->next;
while (cur != plist)
{
if (cur->data == x)
{
return cur;
}
cur = cur->next;
}
return NULL;
}
// 双向链表在pos的前面进行插入
void ListInsert(ListNode* pos, LTdAateType x)
{
assert(pos);
ListNode *newnode = BuyListNode(x);
newnode->next = pos;
(pos->prev)->next = newnode;
newnode->prev = (pos->prev);
pos->prev = newnode;
}
// 双向链表删除pos位置的节点
void ListErase(ListNode* pos)
{
assert(pos);
ListNode *prev = pos->prev;
ListNode *next = pos->next;
prev->next = next;
next->prev = prev;
}
上一篇: 数字在升序数组中出现的次数
下一篇: 【LeetCode】110. 平衡二叉树