🌏定义节点
typedef int dataType;
typedef struct ListNode ListNode;
struct ListNode
{
ListNode* prev;
dataType data;
ListNode* next;
};
🌏初始化链表
void initList(ListNode* head)
{
head->next = head;
head->prev = head;
}
🌏创建节点
ListNode* createNode(dataType x)
{
ListNode* node = malloc(sizeof (ListNode));
node->data = x;
return node;
}
🌏尾插
void listPushBack(ListNode* head, dataType x)
{
assert(head != NULL);
ListNode* tail = head->prev;
ListNode* node = createNode(x);
tail->next = node;
node->prev = tail;
node->next = head;
head->prev = node;
}
🌏头插
void listPushFront(ListNode* head, dataType x)
{
assert(head != NULL);
ListNode* first = head->next;
ListNode* node = createNode(x);
head->next = node;
node->prev = head;
node->next = first;
first->prev = node;
}
🌏尾删
void listPopBack(ListNode* head)
{
assert(head->next != NULL);
ListNode* tail = head->prev;
ListNode* tailPrev = tail->prev;
tailPrev->next = head;
head->prev = tailPrev;
free(tail);
}
🌏头删
void listPopFront(ListNode* head)
{
assert(head->next != NULL);
ListNode* first = head->next;
ListNode* second = first->next;
head->next = second;
second->prev = head;
free(first);
}
🌏查找节点
ListNode* findNode(ListNode* head, dataType x)
{
ListNode* cur = head->next;
while (cur != head)
{
if (cur->data == x)
return cur;
cur = cur->next;
}
return NULL;
}
🌏后插
void listInsertAfter(ListNode* pos, dataType x)
{
assert(pos != NULL);
ListNode* next = pos->next;
ListNode* node = createNode(x);
pos->next = node;
node->prev = pos;
node->next = next;
next->prev = node;
}
🌏前插
void listInsertBefore(ListNode* pos, dataType x)
{
assert(pos != NULL);
ListNode* prev = pos->prev;
ListNode* node = createNode(x);
prev->next = node;
node->prev = prev;
node->next = pos;
pos->prev = node;
}
🌏删除任意位置节点
void listErase(ListNode* pos)
{
assert(pos != NULL);
assert(pos != head);
ListNode* prev = pos->prev;
ListNode* next = pos->next;
prev->next = next;
next->prev = prev;
free(pos);
}
🌏打印链表所有节点
void printList(ListNode* head)
{
ListNode* cur = head->next;
while (cur != head)
{
printf("%d->", cur->data);
cur = cur->next;
}
printf("NULL\n");
}
🌏销毁链表
void destroyList(ListNode* head)
{
ListNode* cur = head->next;
while (cur != head)
{
ListNode* next = cur->next;
free(cur);
cur = next;
}
free(head);
}