当前位置: 首页 > news >正文

环状双向链表创建,删除,插入,遍历详细讲解

#include<stdio.h>
#include<stdlib.h>typedef int data_t;
typedef struct node
{data_t data;struct node* next;struct node* prev;
}node_t;// 函数声明
int dclist_create(node_t** head, data_t data);
static void __dclist_insert(node_t* prev, node_t* pnew, node_t* next);
int dclist_insert(node_t** head, data_t data);
static void __dclist_delete(node_t* prev, node_t* p, node_t* next);
int dclist_delete(node_t** head, data_t data);
node_t* dclist_query(node_t* head, data_t data);
void dclist_showall(node_t* head);int dclist_create(node_t** head, data_t data)
{node_t* pnew = (node_t*)malloc(sizeof(node_t));if (pnew == NULL)return -1;pnew->data = data;pnew->prev = pnew;pnew->next = pnew;*head = pnew;return 0;
}static void __dclist_insert(node_t* prev, node_t* pnew, node_t* next)
{pnew->next = next;pnew->prev = prev;prev->next = pnew;next->prev = pnew;
}int dclist_insert(node_t** head, data_t data)
{node_t* pnew = (node_t*)malloc(sizeof(node_t));if (pnew == NULL)return -1;pnew->data = data;if (*head == NULL)  // 修正比较运算符{pnew->prev = pnew;pnew->next = pnew;*head = pnew;return 0;}else{__dclist_insert((*head)->prev, pnew, *head);return 0;}
}static void __dclist_delete(node_t* prev, node_t* p, node_t* next)
{prev->next = next;next->prev = prev;  // 修正指针连接free(p);           // 释放被删除的节点
}int dclist_delete(node_t** head, data_t data)
{if (*head == NULL) return -1;  // 空链表检查node_t* p = dclist_query(*head, data);if (p == NULL)return -1;if (p == *head){if (p->next == p)  // 只有一个节点{free(p);*head = NULL;return 0;}*head = p->next;  // 更新头指针}__dclist_delete(p->prev, p, p->next);return 0;
}node_t* dclist_query(node_t* head, data_t data)
{if (head == NULL) return NULL;  // 空链表检查node_t* p = head;do {if (p->data == data)return p;p = p->next;} while (p != head);return NULL;
}void dclist_showall(node_t* head)
{if (head == NULL) {printf("空链表\n");return;}node_t* p = head;do {printf("%3d", p->data);p = p->next;} while (p != head);printf("\n");
}int main()
{node_t* head = NULL;dclist_create(&head, 888);for (int i = 1; i < 6; i++)dclist_insert(&head, i);printf("初始链表:\n");dclist_showall(head);while (1){printf("请输入删除数据(-1退出):");data_t data;if (scanf_s("%d", &data) != 1){printf("输入无效,请重新输入。\n");while (getchar() != '\n');continue;}if (data == -1)break;if (dclist_delete(&head, data) == -1){printf("删除失败,请重试...\n");continue;}printf("删除后的链表:\n");dclist_showall(head);}// 清理剩余节点while (head != NULL) {dclist_delete(&head, head->data);}return 0;
}

运行结果:

相关文章:

  • DDoS本地防御与绕线防御的区别
  • 三轴云台之开源算法篇
  • ubuntu配置网卡为AP模式
  • Spring Boot 中配置 Redis 连接池的详细
  • 台账自动统计——餐饮物资管理台账——仙盟共创平台——未来之窗
  • 软件测试之测试数据生成(Excel版)
  • 【function call】大模型的hello function call
  • 存储过程开发规范
  • Biu懂AI:本地部署大模型
  • 数字时代的AI与大数据:用高级AI开发技术革新大数据管理
  • Java实现Redis
  • [特殊字符] PostgreSQL MCP 开发指南
  • ruoyi中如何使用Public来存储静态资源
  • 全国青少年信息素养大赛 C++算法创意实践挑战赛初赛 集训模拟试卷《四》及详细答案解析
  • 03.Python代码NumPy-通过numPy来创建不同数组
  • 【Qt】Qt 按钮控件详解,PushButton,RadioButton,CheckBox,ToolButton
  • 韩金明董事长受邀出席“个人经济体高质量发展暨私域直播行业合规”调研活动
  • 长亭红队技术面试题
  • springboot中的事务失效(自调用)
  • 基于YOLO11的跌倒检测报警系统
  • 新疆公路建设管理局网站/正规网络公司关键词排名优化
  • 宝塔系统怎么建设网站/最新域名解析
  • wordpress自由定制导航/seo优化是利用规则提高排名
  • 网站拨测人员是干嘛的/站长工具在线查询
  • 企业做网站的/企业文化的重要性和意义
  • 基于asp网站开发 论文/惠州网站建设方案推广