C语言--带头双向循环链表的基本操作实现

带头双向循环链表

链表为空的条件:

header->next == header
#include<stdio.h>
#include<stdlib.h>
typedef int LTDataType;
typedef struct ListNode
{
 LTDataType data;
 struct ListNode* next;
 struct ListNode* prev;
}ListNode;
typedef struct List {
 ListNode* header;
}List;
// 创建返回链表的头结点.
ListNode* ListCreate(LTDataType x) {
 ListNode* node = (ListNode*)malloc(sizeof(ListNode));
 node->prev = node->next = NULL;
 node->data = x;
 return node;
}
//链表初始化
void ListInit(List* lst) {
 lst->header = ListCreate(0);
 lst->header->next = lst->header;
 lst->header->prev = lst->header;
}
// 双向链表销毁
void ListDestory(List* lst) {
 ListNode* cur = lst->header->next;
 while (lst->header != cur) {
  ListNode* next = cur->next;
  free(cur);
  cur = next;
 }
 free(lst->header);
 lst->header = NULL;
}
// 双向链表打印
void ListPrint(List* lst) {
 ListNode* cur = lst->header->next;
 while (cur != lst->header) {
  printf("%d ", cur->data);
  cur = cur->next;
 }
 printf("\n");
}
// 双向链表尾插
void ListPushBack(List* lst, LTDataType x) {
 ListNode* node = ListCreate(x);
 ListNode* last = lst->header->prev;
 last->next = node;
 node->prev = last;
 node->next = lst->header;
 lst->header->prev = node;
}
// 双向链表尾删
void ListPopBack(List* lst) {
 ListNode* last;
 ListNode* prev;
 //不可以把头删掉
 if (lst->header == lst->header->next) {
  return;
 }
 last = lst->header->prev;
 prev = last->prev;
 prev->next = lst->header;
 lst->header->prev = prev;
 free(last);
}
// 双向链表头插
void ListPushFront(List* lst, LTDataType x) {
 ListNode* front = lst->header->next;
 ListNode* node = ListCreate(x);
 node->next = front;
 front->prev = node;
 node->prev = lst->header;
 lst->header->next = node;
}
// 双向链表头删
void ListPopFront(List* lst) {
 ListNode* front, *next;
 if (lst->header == lst->header->next) {
  return;
 }
 front = lst->header->next;
 next = front->next;
 free(front);
 lst->header->next = next;
 next->prev = lst->header;
}
// 双向链表查找
ListNode* ListFind(List* lst, LTDataType x) {
 ListNode* cur = lst->header->next;
 while (cur != lst->header) {
  if (cur->data == x) {
   return cur;
  }
  cur = cur->next;
 }
 return NULL;
}
// 双向链表在pos的前面进行插入
void ListInsert(ListNode* pos, LTDataType x) {
 ListNode* node = ListCreate(x);
 ListNode* prev = pos->prev;
 prev->next = node;
 node->prev = prev;
 node->next = pos;
 pos->prev = node;
}
// 双向链表删除pos位置的节点
void ListErase(ListNode* pos) {
 //header不可以删掉
 if (pos == pos->next) {
  return;
 }
 ListNode* front, * last;
 front = pos->prev;
 last = pos->next;
 free(pos);
 front->next = last;
 last->prev = front;
}
int main() {
 List lst;
 //初始化
 ListInit(&lst);
 ListPrint(&lst);
 //尾插
 ListPushBack(&lst, 1);
 ListPrint(&lst);
 ListPushBack(&lst, 2);
 ListPrint(&lst);
 ListPushBack(&lst, 3);
 ListPrint(&lst);
 ListPushBack(&lst, 4);
 ListPrint(&lst);
 ListPushBack(&lst, 5);
 ListPrint(&lst);
 //头插
 ListPushFront(&lst, 0);
 ListPrint(&lst);
 ListPushFront(&lst, 0);
 ListPrint(&lst);
 ListPushFront(&lst, 0);
 ListPrint(&lst);
 //查到3,删掉
 ListNode* pos = ListFind(&lst, 3); 
 ListErase(pos);
 ListPrint(&lst);
 //头删
 ListPopFront(&lst);
 ListPrint(&lst);
 ListPopFront(&lst);
 ListPrint(&lst);
 ListPopFront(&lst); 
 ListPrint(&lst);
 //尾删
 ListPopBack(&lst);
 ListPrint(&lst);
 ListPopBack(&lst);
 ListPrint(&lst);
 ListPopBack(&lst);
 ListPrint(&lst);
 ListPopBack(&lst);
 ListPrint(&lst);
 return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值