链表初解(二)——双链表的创建、删除、插入

2024-08-21 15:18

本文主要是介绍链表初解(二)——双链表的创建、删除、插入,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

下面是基本的双链表操作,由于双链表有两个方向,所以在删除和插入节点时,可以节省一个指针,只用一个链表上的指针和一个待操作的指针即可完成插入和删除;同时也要注意在编写双链表时对情况的判断要仔细,否则很容易出错~

#include<iostream>
using namespace std;typedef struct student
{int data;struct student *next;struct student *pre;
}dnode;//建立双链表
dnode *create()
{dnode *head, *p, *s;int x;head = (dnode *)malloc(sizeof(dnode));p = head;cout<<"\nInput the data : ";while(1){if(scanf("%d", &x) != EOF && x != 0){s = (dnode *)malloc(sizeof(dnode));s->data = x;p->next = s;s->pre = p;p = s;}else break;}head = head->next;head->pre = NULL;p->next = NULL;return head;
}//双链表删除节点
dnode *del(dnode *head, int num)
{dnode *p1;p1 = head;while(num != p1->data && p1->next != NULL)p1 = p1->next;if(num == p1->data){if(head == p1){head = head->next;head->pre = NULL;}/*此处的处理与单链表不同,因为双链表有两个方向,所以在定义时仅定义一个指针,这使得当出现删除链表尾部时,由于NULL没有前驱,导致无法连接,所以要分开讨论。*/else if(p1->next == NULL) p1->pre->next = NULL;else{//p1为最后一个节点,如没有上一个分支,则第二个语句会出错。p1->pre->next = p1->next;p1->next->pre = p1->pre;}free(p1);	//释放}else cout<<"There is no %d "<<num;return head;
}//双链表插入节点
dnode *insert(dnode *head, int num)
{dnode *p0, *p1;p1 = head;p0 = (dnode *)malloc(sizeof(dnode));p0->data = num;while(num > p1->data && p1->next != NULL)p1 = p1->next;if(num <= p1->data){if(head == p1){p0->next = p1;p1->pre = p0;head = p0;}else{p1->pre->next = p0;p0->pre = p1->pre;p0->next = p1;p1->pre = p0;}}else{//插入尾部~p1->next = p0;p0->next = NULL;p0->pre = p1;}return head;
}//计算表长
int length(dnode *head)
{int n = 0;while(head != NULL){head = head->next;n++;}return n;
}
//打印双链表
void print(dnode *head)
{int n = length(head);cout<<"Output the DoubleList ("<<n<<" records~) : ";while(head != NULL){if(head->next == NULL) cout<<head->data<<endl;else cout<<head->data<<"<->";head = head->next;}
}
//排序函数同单链表,此处省略了~,默认输入为递增哈~
int main()
{dnode *head;//创建head = create();print(head);//删除int numD;cout<<"\nDelete : ";cin>>numD;print(del(head, numD));//插入int numS;cout<<"\nInsert : ";cin>>numS;print(insert(head, numS));return 0;
}


Ps:仅供参考~~

 

这篇关于链表初解(二)——双链表的创建、删除、插入的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1093529

相关文章

Mysql实现范围分区表(新增、删除、重组、查看)

《Mysql实现范围分区表(新增、删除、重组、查看)》MySQL分区表的四种类型(范围、哈希、列表、键值),主要介绍了范围分区的创建、查询、添加、删除及重组织操作,具有一定的参考价值,感兴趣的可以了解... 目录一、mysql分区表分类二、范围分区(Range Partitioning1、新建分区表:2、分

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤

python删除xml中的w:ascii属性的步骤

《python删除xml中的w:ascii属性的步骤》使用xml.etree.ElementTree删除WordXML中w:ascii属性,需注册命名空间并定位rFonts元素,通过del操作删除属... 可以使用python的XML.etree.ElementTree模块通过以下步骤删除XML中的w:as

Navicat数据表的数据添加,删除及使用sql完成数据的添加过程

《Navicat数据表的数据添加,删除及使用sql完成数据的添加过程》:本文主要介绍Navicat数据表的数据添加,删除及使用sql完成数据的添加过程,具有很好的参考价值,希望对大家有所帮助,如有... 目录Navicat数据表数据添加,删除及使用sql完成数据添加选中操作的表则出现如下界面,查看左下角从左

C++链表的虚拟头节点实现细节及注意事项

《C++链表的虚拟头节点实现细节及注意事项》虚拟头节点是链表操作中极为实用的设计技巧,它通过在链表真实头部前添加一个特殊节点,有效简化边界条件处理,:本文主要介绍C++链表的虚拟头节点实现细节及注... 目录C++链表虚拟头节点(Dummy Head)一、虚拟头节点的本质与核心作用1. 定义2. 核心价值二

python如何创建等差数列

《python如何创建等差数列》:本文主要介绍python如何创建等差数列的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python创建等差数列例题运行代码回车输出结果总结python创建等差数列import numpy as np x=int(in

怎么用idea创建一个SpringBoot项目

《怎么用idea创建一个SpringBoot项目》本文介绍了在IDEA中创建SpringBoot项目的步骤,包括环境准备(JDK1.8+、Maven3.2.5+)、使用SpringInitializr... 目录如何在idea中创建一个SpringBoot项目环境准备1.1打开IDEA,点击New新建一个项

如何使用Maven创建web目录结构

《如何使用Maven创建web目录结构》:本文主要介绍如何使用Maven创建web目录结构的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录创建web工程第一步第二步第三步第四步第五步第六步第七步总结创建web工程第一步js通过Maven骨架创pytho

如何在Mac上彻底删除Edge账户? 手动卸载Edge浏览器并清理残留文件技巧

《如何在Mac上彻底删除Edge账户?手动卸载Edge浏览器并清理残留文件技巧》Mac上的Edge账户里存了不少网站密码和个人信息,结果同事一不小心打开了,简直尴尬到爆炸,想要卸载edge浏览器并清... 如果你遇到 Microsoft Edge 浏览器运行迟缓、频繁崩溃或网页加载异常等问题,可以尝试多种方