带头双向循环链表的增删查改

#include<stdio.h>
#include<stdlib.h>

typedef int DataType;
typedef struct Node {
 int data;
 struct Node* next;
 struct Node* prev;
}Node;
typedef struct List {
 Node* header;
}List;

//初始化
void listInit(List* ls) {
 //要创建一个头结点, 并实现循环结构
 ls->header = (Node*)malloc(sizeof(Node));
 ls->header->next = ls->header;
 ls->header->prev = ls->header;
}

//创建新节点
Node* listCreat(DataType data) {
 Node* node = (Node*)malloc(sizeof(Node));
 node->data = data;
 node->next = node->prev = NULL;
 return node;
}

//打印
void listPrint(List* ls) {
 if (ls->header->next == ls->header) {
  //说明链表为空
  printf("链表为空, 打印失败!\n");
  return;
 }
 Node* cur = ls->header->next;
 while (cur != ls->header) {
  printf("%d ", cur->data);
  cur = cur->next;
 }
 printf("\n");
}

//头插
void listPushFront(List* ls, DataType data) {
 Node* front = ls->header->next;
 Node* node = listCreat(data);
 node->next = front;
 front->prev = node;
 ls->header->next = node;
 node->prev = ls->header;
}

//头删
void listPopFront(List* ls) {
 if (ls->header->next == ls->header) {
  //链表为空, 无法删除
  return;
 }
 Node* front = ls->header->next;
 Node* next = front->next;
 free(front);
 ls->header->next = next;
 next->prev = ls->header;
}

//尾插
void listPushBack(List* ls, DataType data) {
 Node* node = listCreat(data);
 Node* last = ls->header->prev;
 last->next = node;
 node->prev = last;
 ls->header->prev = node;
 node->next = ls->header;
}

//尾删
void listPopBack(List* ls) {
 //注意不能删头结点
 if (ls->header->next == ls->header) {
  //链表为空, 不能删头
  return;
 }
 Node* last = ls->header->prev;
 Node* cur = last->prev;
 free(last);
 cur->next = ls->header;
 ls->header->prev = cur;
}

//在pos位置前面插入一个结点
void listInsert(Node* pos, DataType data) {
 Node* node = listCreat(data);
 Node* prev = pos->prev;
 node->next = pos;
 pos->prev = node;
 prev->next = node;
 node->prev = prev;
}

//删除pos位置的结点
void listErase(Node* pos) {
 if (pos->next == pos) {
  //说明只有头结点, 不能删除
  return;
 }
 Node* prev = pos->prev;
 Node* next = pos->next;
 prev->next = next;
 next->prev = prev;
 free(pos);
}

//查找
Node* listFind(List* ls, DataType data) {
 if (ls->header->next == ls->header) {
  //链表为空, 查找失败
  return;
 }
 Node* cur = ls->header->next;
 while (cur != ls->header) {
  if (cur->data == data) {
   return cur;
  }
  cur = cur->next;
 }
 return NULL;
}

//销毁
void listDestory(List* ls) {
 Node* cur = ls->header->next;
 while (cur != ls->header) {
  Node* tmp = cur->next;
  free(cur);
  cur = tmp;
 }
 free(ls->header);
 ls->header = NULL;
}

int main() {
 List ls;
 listInit(&ls);
 listPushFront(&ls, 1);
 listPushFront(&ls, 2);
 listPushFront(&ls, 3);
 listPushFront(&ls, 4);
 listPushFront(&ls, 5);
 listPrint(&ls);
 listPopFront(&ls);
 listPopFront(&ls);
 listPopFront(&ls);
 listPrint(&ls);
 listPushBack(&ls, 9);
 listPushBack(&ls, 8);
 listPushBack(&ls, 7);
 listPushBack(&ls, 6);
 listPrint(&ls);
 listPopBack(&ls);
 listPopBack(&ls);
 listPopBack(&ls);
 listPrint(&ls);

 Node* pos = listFind(&ls, 9);
 listInsert(pos, 6);
 listPrint(&ls);
 listErase(pos);
 listPrint(&ls);
 listDestory(&ls);
 system("pause");
 return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

殇&璃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值