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

双向链表中间插入节点,删除节点

#include<stdio.h>
#include<stdlib.h>
#include<string.h>typedef int data_t;
typedef struct node
{data_t data;struct node* prev;struct node* next;
}node_t;
int dlist_create(node_t** head, data_t data);//函数声明创建链表
void dlist_showall(node_t* head);//函数声明遍历链表
int dlist_addhead(node_t** head, data_t data);//函数声明头插链表
int dlist_addtail(node_t** head, data_t data);//函数声明尾插链表
int dlist_insert(node_t** head, data_t,data_t );// 函数声明中间插链表
node_t* dlist_query(node_t** head, data_t data);//函数声明数据查询
int dlist_update(node_t** head, data_t old,data_t new_data);//函数声明链表更新
void dlist_destory(node_t* head);//函数声明销毁链表
int dlist_delete(node_t** head, data_t data);//函数声明删除节点int dlist_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->next = NULL;*head = pnew;return 0;
}
int dlist_addhead(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->next = NULL;pnew->next = *head;if (*head){(*head)->prev = pnew;}*head = pnew;return 0;
}
int dlist_addtail(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->next = NULL;if (*head == NULL)//空链表,创建{*head = pnew;return 0;}node_t* p = *head;while (p->next){ p = p->next;}p->next = pnew;pnew->prev = p;return 0;}int dlist_insert(node_t** head, data_t pos, data_t new_data)
{// 创建新节点node_t* pnew = (node_t*)malloc(sizeof(node_t));if (pnew == NULL)return -1;pnew->data = new_data;// 空链表处理if (*head == NULL){pnew->prev = NULL;pnew->next = NULL;*head = pnew;return 0;}node_t* p = *head;// 如果要插入的位置是头节点if (p->data == pos){pnew->prev = NULL;pnew->next = p;p->prev = pnew;*head = pnew;return 0;}// 查找插入位置while (p != NULL){if (p->data == pos){// 在找到的节点前插入新节点pnew->next = p;pnew->prev = p->prev;p->prev->next = pnew;p->prev = pnew;return 0;}p = p->next;}// 如果没找到指定位置,则插入到尾部p = *head;while (p->next != NULL){p = p->next;}p->next = pnew;pnew->prev = p;pnew->next = NULL;return 0;
}node_t* dlist_query(node_t* head, data_t data)
{node_t* p = head;while (p){if (p->data == data)  // 直接比较数据return p;         // 返回找到的节点指针p = p->next;}return NULL;
}int dlist_update(node_t** head, data_t old, data_t new_data)
{node_t* p = dlist_query(*head, old);if (p == NULL)return 0;p->data = new_data;return 0;
}int dlist_delete(node_t** head, data_t data)
{if (*head == NULL) return -1;  // 空链表检查node_t* p = *head;while (p){if (p->data == data){// 处理头节点情况if (p->prev == NULL){*head = p->next;if (p->next)p->next->prev = NULL;}else{p->prev->next = p->next;if (p->next)  // 检查是否是尾节点p->next->prev = p->prev;}free(p);return 0;}p = p->next;}return -1;
}void dlist_destory(node_t** head)
{node_t* p = *head;if (p == NULL)return;while (p->next){p = p->next;free(p->prev);}free(p);*head = NULL;}void dlist_showall(node_t* head)
{node_t* p = head;while (p){printf("%3d", p->data);p = p->next;}printf("\n");
}int main()
{node_t* head = NULL;dlist_create(&head, 1024);for ( int i = 0; i < 6; i++)dlist_addtail(&head,i+1);dlist_showall(head);while (1){printf("\n请输入要插入处节点数据(-1退出):");data_t pos;scanf_s("%d", &pos);if (pos == -1)break;printf("请输入要插入的新数据:");data_t new_data;scanf_s("%d", &new_data);if (dlist_insert(&head, pos, new_data) == 0){printf("插入后的链表内容:\n");dlist_showall(head);}else{printf("插入失败!\n");}}while (1){printf("\n请输入要删除的节点数据(-1退出):");data_t del_data;  // 正确声明变量scanf_s("%d", &del_data);if (del_data == -1)break;if (dlist_delete(&head, del_data) == 0){printf("删除后的链表内容:\n");dlist_showall(head);}else{printf("删除失败!\n");  // 修正错误提示}}dlist_destory(&head);return 0;
}

运行结果

相关文章:

  • Trae CN 使用入门指南
  • 【uniapp-兼容性处理】swiper在iOS上偶发出现后几张图片白屏情况
  • Vue使用axios实现:上传文件、下载文件
  • .NET Core DI(依赖注入)的生命周期及应用场景
  • React 更新state中的对象
  • Doris 中 Compaction 问题的深度剖析与解决方案
  • linux编译adbd工具使用
  • Python + Playwright:规避常见的UI自动化测试反模式
  • Spark-SQL核心编程
  • 基于PyQt5和OpenCV的传统图像分割应用UI程序
  • 100个有用的AI工具 之 生成透明图像LayerDiffuse
  • 欧拉服务器操作系统部署deekseep(Ollama+DeekSeep+open WebUI)
  • 解决 Spring Boot 启动报错:数据源配置引发的启动失败
  • Windows 图形显示驱动开发-WDDM 1.2功能~显示设备的容器id支持
  • 双链表各种操作实现(数据结构C语言多文件编写)
  • QT中多线程写法
  • 摄影测量——单像空间后方交会
  • AI知识补全(十六):A2A - 谷歌开源的agent通信协议是什么?
  • 集成学习介绍
  • 【YOLOv8改进 - 特征融合】EFC: 基于增强层间特征关联的轻量级即插即用融合策略,即插即用适,用于小目标检测
  • 港股持续拉升:恒生科技指数盘中涨幅扩大至6%,恒生指数涨3.3%
  • 上海建筑领域绿色发展2025年工作要点发布
  • 前四月全国铁路完成固定资产投资1947亿元,同比增长5.3%
  • 非洲雕刻艺术有着怎样的“变形之美”
  • 苏东坡:人生就是哈哈哈哈哈
  • 北京:下调个人住房公积金贷款利率