目录

  • 前言
  • 双向链表插入节点
    • 实现代码
  • 双向链表删除节点
    • 实现代码
  • 整个项目的完整代码
    • 运行截图
  • 总结

前言

本篇文章主要接着上文的双向链表的创建与遍历(c++实现)

双向链表插入节点

在双向链表中插入新节点与单向链表相似,而根据新节点插入位置的不同,分为三种不同处理方式具体分析如下:
1.当在链表头部插入节点,只需把新节点的右指针指向链表原来的第一个节点,再把原链表头左指针指向新节点即可,
用代码描述:
insertnode->right= head;
head->left = insertnode;
head = insertnode;
2.当在链表中间位置插入新节点,例如在A和B之间,则需将A节点的右指针指向新节点,新节点的右指针指向B节点,B节点的左指针指向新节点,新节点的左指针指向A节点,
用代码描述:
A->right->left = insertnode;
insertnode->right = A->right;
insertnode->left = A;
A->right = insertnode;
3.当在链表尾插入新节点时,将原链表最后一个节点的右指针指向新节点,新节点的左指针指向原链表最后一个节点,且新节点的右指针指向NULL,
用代码描述:
ptr->right = insertnode;
insertnode->left = ptr;
insertnode->right = NULL;

实现代码

link InsertNode(link head,int position_data,int data){link phead = new node;phead = FindNode(head,position_data);link insertnode = new node;if(!insertnode) return NULL;insertnode->data = data;insertnode->right = NULL;insertnode->left = NULL;if(phead->right == NULL){//插入最后一个节点insertnode->left = phead;phead->right = insertnode;}  else{  //插入中间节点 insertnode->right = phead->right;phead->right->left = insertnode;phead->right = insertnode;insertnode->left = phead;}return head;
}

双向链表删除节点

插入新节点同样分为三种情况,分别进行操作:
1.当删除链表头的节点时,把头指针指向第二个节点即可,并释放第一个节点内存空间。
head = head->right;
head->left = NULL;
2.当删除中间节点时,将要删除节点的前一个节点的右指针指向要被删除节点的后一个节点,再将删除节点的后一个节点的左指针指向被删除节点的前一个节点,并释放内存空间。
del->left->right = del->right;
del->right->left = del->left;
3.当删除尾结点时,把指向最后一个节点之前的一个节点的右指针直接指向NULL,并释放内存空间即可。
ptr->left->right = NULL;

实现代码

if(head == phead){  //删除头结点 head = head->right;head->left = NULL;delete phead;}else{if(phead->right == NULL){  //删除尾结点 phead->left->right = NULL;delete phead;}else{phead->left->right = phead->right;phead->right->left = phead->left;delete phead;} }return head;
}

整个项目的完整代码

包括双向链表的创建、遍历、插入、删除。

#include<bits/stdc++.h>
using namespace std;struct list1{int data;struct list1 *left,*right;
};
typedef struct list1 node;
typedef node *link;void PrintList(link head){link phead = new node;phead = head;cout<<"链表元素如下:(从头节点往右遍历): "<<endl;while(phead!=NULL){head = phead;cout<<phead->data<<"->";phead = phead->right;  //phead按序往后遍历整个链表if(!phead) cout<<"NULL"<<endl;}phead = head;cout<<"链表元素如下:(从尾节点往左遍历): "<<endl;while(phead!=NULL){cout<<phead->data<<"->";phead = phead->left;head = phead;if(!phead) cout<<"NULL"<<endl;}
}link CreateList(int a[],int n){link head,phead,newnode;head = new node;///建立头结点 if(!head) return NULL;head->data = a[0];head->right = NULL;head->left = NULL;phead = head;for(int i = 1;i<n;i++){//建立链表 newnode = new node;newnode->data = a[i];newnode->right = NULL;newnode->left = NULL;phead->right = newnode;newnode->left = phead;phead = newnode;}return head;
}link FindNode(link head,int position_data){link phead;phead = head;while(phead != NULL){if(phead->data == position_data)return phead;phead = phead->right;}return phead;
}link InsertNode(link head,int position_data,int data){link phead = new node;phead = FindNode(head,position_data);link insertnode = new node;if(!insertnode) return NULL;insertnode->data = data;insertnode->right = NULL;insertnode->left = NULL;if(phead->right == NULL){//插入最后一个节点insertnode->left = phead;phead->right = insertnode;}  else{  //插入中间节点 insertnode->right = phead->right;phead->right->left = insertnode;phead->right = insertnode;insertnode->left = phead;}return head;
}link DeleteNode(link head,int position_data){link top = head;  //保留头指针 link phead = FindNode(head,position_data);if(head == phead){  //删除头结点 head = head->right;head->left = NULL;delete phead;}else{if(phead->right == NULL){  //删除尾结点 phead->left->right = NULL;delete phead;}else{phead->left->right = phead->right;phead->right->left = phead->left;delete phead;} }return head;
}int main(){int position_data,data;link head,phead;int n;cout<<"请输入初始链表元素个数: "<<endl;cin>>n;int a[n];cout<<"请依次输入链表元素: ";for(int i = 0;i<n;i++) cin>>a[i];head = CreateList(a,n);PrintList(head);cout<<"请输入预插入位置之前的元素和要插入的元素(例:5 8): ";cin>>position_data>>data;head = InsertNode(head,position_data,data);cout<<"插入之后的";PrintList(head); cout<<"请输入想删除的链表元素: ";cin>>position_data;head = DeleteNode(head,position_data);cout<<"删除之后的";PrintList(head);return 0;
}

对上面代码中出现的函数做简单讲解:
FindNode()方法通过头结点和要查询的数据,遍历链表并返回预查询数据的节点;
CreateList()通过用户输入的数组创建一个链表;
InsertNode()插入新节点;
DeleteNode()删除指定节点;
PrintList()通过传入的链表头指针遍历整个链表数据并输出(双向链表分为两个方向进行)。

运行截图

总结

本文完成的代码只作为双向链表创建、遍历、插入、删除的简单实例,分别插入、删除了一次,读者也可自行添加判断语句通过输入来控制是插入还是删除,且本文代码所设前提为链表内数据唯一,即没有两个相同的数据,如果考虑数据不唯一,则增加了难度,不便于初学者理解链表的插入、删除节点。同时,没有考虑其他更多的意外情况,例如:用户输入要删除的元素,实际链表中不存在;这些操作需要在具体使用时再根据调整。

作者水平有限,旨在记录自己的学习过程,大家发现有什么错误或者建议尽可提出。

双向链表的插入与删除(c++实现)相关推荐

  1. 如何实现双向链表的插入、删除操作

    如何实现双向链表的插入.删除操作 循环单链表的出现,虽然能够实现从任一结点出发沿着链能找到其前驱结点,但是时间复杂度为O(N).如果希望能从链表中快速确定某一个结点的前驱,另一个解决方法就是在单链表的 ...

  2. C语言双向链表的插入与删除

    数据结构复习1.2--双向链表的插入与删除 插入元素 删除元素 代码:和单链表差不多,不会就画一画,就写出来了 //双向链表的插入与删除 #include<stdio.h> #includ ...

  3. 双向链表的插入和删除

    双向链表的插入 第一步:首先找到插入位置,节点 s 将插入到节点 p 之前 第二步:将节点 s 的前驱指向节点 p 的前驱,即 s->prior = p->prior; 第三步:将节点 p ...

  4. C语言实现双向链表:插入和删除

    抽象数据类型 typedef sturct DuLnode {int data;struct DuLnode* next, *prior; }DuLnode, *DuLinklist; 带头结点的双向 ...

  5. Java双向链表快速排序_双向链表的插入,删除,以及链表的快速排序

    双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.#pragma once/ ...

  6. 双向链表的插入和删除算法描述

    #include <iostream> using namespace std; typedef int elemtype; typedef int status; typedef str ...

  7. 双向链表的插入及删除图解

    第一步:首先找到插入位置,节点 s 将插入到节点 p 之前 第二步:将节点 s 的前驱指向节点 p 的前驱,即 s->prior = p->prior; 第三步:将节点 p 的前驱的后继指 ...

  8. (C语言版)链表(四)——实现双向循环链表创建、插入、删除、释放内存等简单操作

    http://blog.csdn.net/fisherwan/article/details/19801993 双向循环链表是基于双向链表的基础上实现的,和双向链表的操作差不多,唯一的区别就是它是个循 ...

  9. 双向链表中插入结点并输出

    [问题描述] 对带头结点的双向链表,实现插入算法. [输入形式] 第一行输入一个N(N大于等于1,小于1000): 第二行输入N个整数,以空格作为分隔,创建长度为N的双向链表,为双向输出方便,需保留头 ...

最新文章

  1. android音视频工程师,音视频学习 (十三) Android 中通过 FFmpeg 命令对音视频编辑处理(已开源)...
  2. opencv-车牌区域提取
  3. 1、Reactive Extensions for .NET(译)
  4. 90后售楼人员的肺腑之言:再便宜你也不能买的房子(转)
  5. Hyperledger(超级账本)的worldstate和SAP CRM的CRMD_CUMULAT_H
  6. 大数据电商数仓--记录各种奇奇怪怪的issue
  7. mysql 5.6.19 linux_MySQL 5.6.19升级到 5.7.9 步骤记录
  8. java jacoco覆盖率报错_接口测试代码覆盖率(jacoco)方案分享
  9. 第三章 Python丰富的数据类型
  10. 异步复位同步释放机制-系统完美稳定
  11. 一些值得借鉴的处事、励志语句
  12. Java 建模:子整体软件开发
  13. 信号检测与估计(1)
  14. 系统分析师2020年真题解析
  15. 计算机配色故障,计算机配色模型中存在的限制点
  16. PAT : PAT (Basic Level) Practice(中文)答案(1001 ~ 1095)(纯C编写)
  17. java如何将图片转为pdf
  18. 市值暴跌7成,马斯克急了:特斯拉是最有价值的公司!
  19. 乡村老师网络计算机培训日志,乡村年轻女教师 “教育日记”火爆网络
  20. MATLAB矩阵分块拼装

热门文章

  1. 互联网摸鱼日报(2023-03-08)
  2. 又是一个新问题,Field 'id' doesn't have a default value 最终完美解决
  3. scrapy 爬取酷狗T500音乐
  4. 海康威视DS-4100、4000HC 系列板卡SDK编程指南
  5. 科技为驱,创新为翼——鲸鲮科技喜获“2021北京软件核心竞争力企业”评价
  6. 智源社区AI周刊No.98:Adept发布行为预训练模型ACT-1;首个扩散模型领域综述发布;PyTorch加入Linux基金会...
  7. [论]博士和小工的区别
  8. 我不曾忘记的初心-军还好吗
  9. java 3d 配置_Java3D的环境配置
  10. 基线_基线检查平台之Linux与Windows