当前位置: 首页 > 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;
}

运行结果

http://www.dtcms.com/a/133446.html

相关文章:

  • 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: 基于增强层间特征关联的轻量级即插即用融合策略,即插即用适,用于小目标检测
  • AIP-233 批量方法:Create
  • 中和农信的“三农”服务密码:科技+标准化助力乡村振兴
  • React中 点击事件写法 的注意(this、箭头函数)
  • 【React】基本语法
  • 浙江大学DeepSeek系列专题线上公开课第二季第五期即将上线!deepseek音乐创作最强玩法来了!
  • python: audioFlux XXCC 提取梅尔频率倒谱系数 MFCC
  • day30 第八章 贪心算法 part04
  • 阳台光伏 “WiFi” 电表:开启智慧能源新纪元/出海欧标认证!
  • 2025高频面试算法总结篇【动态规划】
  • Spark-SQL核心编程:DataFrame、DataSet与RDD深度解析