前面学习了如何创建一个双向链表,本节学习有关双向链表的一些基本操作,即如何在双向链表中添加、删除、查找或更改数据元素。

本节知识基于已熟练掌握双向链表创建过程的基础上,我们继续上节所创建的双向链表来学习本节内容,创建好的双向链表如图 1 所示:

图 1 双向链表示意图

双向链表添加节点

根据数据添加到双向链表中的位置不同,可细分为以下 3 种情况:

添加至表头

将新数据元素添加到表头,只需要将该元素与表头元素建立双层逻辑关系即可。

换句话说,假设新元素节点为 temp,表头节点为 head,则需要做以下 2 步操作即可:

temp->next=head; head->prior=temp;

将 head 移至 temp,重新指向新的表头;

例如,将新元素 7 添加至双链表的表头,则实现过程如图 2 所示:

图 2 添加元素至双向链表的表头

添加至表的中间位置

同单链表添加数据类似,双向链表中间位置添加数据需要经过以下 2 个步骤,如图 3 所示:

新节点先与其直接后继节点建立双层逻辑关系;

新节点的直接前驱节点与之建立双层逻辑关系;

图 3 双向链表中间位置添加数据元素

添加至表尾

与添加到表头是一个道理,实现过程如下(如图 4 所示):

找到双链表中最后一个节点;

让新节点与最后一个节点进行双层逻辑关系;

图 4 双向链表尾部添加数据元素

因此,我们可以试着编写双向链表添加数据的 C 语言代码,参考代码如下:

line * insertLine(line * head,int data,int add){

//新建数据域为data的结点

line * temp=(line*)malloc(sizeof(line));

temp->data=data;

temp->prior=NULL;

temp->next=NULL;

//插入到链表头,要特殊考虑

if (add==1) {

temp->next=head;

head->prior=temp;

head=temp;

}else{

line * body=head;

//找到要插入位置的前一个结点

for (int i=1; i

body=body->next;

}

//判断条件为真,说明插入位置为链表尾

if (body->next==NULL) {

body->next=temp;

temp->prior=body;

}else{

body->next->prior=temp;

temp->next=body->next;

body->next=temp;

temp->prior=body;

}

}

return head;

}

双向链表删除节点

双链表删除结点时,只需遍历链表找到要删除的结点,然后将该节点从表中摘除即可。

例如,从图 1 基础上删除元素 2 的操作过程如图 5 所示:

图 5 双链表删除元素操作示意图

双向链表删除节点的 C 语言实现代码如下:

//删除结点的函数,data为要删除结点的数据域的值

line * delLine(line * head,int data){

line * temp=head;

//遍历链表

while (temp) {

//判断当前结点中数据域和data是否相等,若相等,摘除该结点

if (temp->data==data) {

temp->prior->next=temp->next;

temp->next->prior=temp->prior;

free(temp);

return head;

}

temp=temp->next;

}

printf("链表中无该数据元素");

return head;

}

双向链表查找节点

通常,双向链表同单链表一样,都仅有一个头指针。因此,双链表查找指定元素的实现同单链表类似,都是从表头依次遍历表中元素。

C 语言实现代码为:

//head为原双链表,elem表示被查找元素

int selectElem(line * head,int elem){

//新建一个指针t,初始化为头指针 head

line * t=head;

int i=1;

while (t) {

if (t->data==elem) {

return i;

}

i++;

t=t->next;

}

//程序执行至此处,表示查找失败

return -1;

}

双向链表更改节点

更改双链表中指定结点数据域的操作是在查找的基础上完成的。实现过程是:通过遍历找到存储有该数据元素的结点,直接更改其数据域即可。

实现此操作的 C 语言实现代码如下:

//更新函数,其中,add 表示更改结点在双链表中的位置,newElem 为新数据的值

line *amendElem(line * p,int add,int newElem){

line * temp=p;

//遍历到被删除结点

for (int i=1; i

temp=temp->next;

}

temp->data=newElem;

return p;

}

总结

这里给出双链表中对数据进行 "增删查改" 操作的完整实现代码:

#include

#include

typedef struct line{

struct line * prior;

int data;

struct line * next;

}line;

//双链表的创建

line* initLine(line * head);

//双链表插入元素,add表示插入位置

line * insertLine(line * head,int data,int add);

//双链表删除指定元素

line * delLine(line * head,int data);

//双链表中查找指定元素

int selectElem(line * head,int elem);

//双链表中更改指定位置节点中存储的数据,add表示更改位置

line *amendElem(line * p,int add,int newElem);

//输出双链表的实现函数

void display(line * head);

int main() {

line * head=NULL;

//创建双链表

head=initLine(head);

display(head);

//在表中第 3 的位置插入元素 7

head=insertLine(head, 7, 3);

display(head);

//表中删除元素 2

head=delLine(head, 2);

display(head);

printf("元素 3 的位置是:%d\n",selectElem(head,3));

//表中第 3 个节点中的数据改为存储 6

head = amendElem(head,3,6);

display(head);

return 0;

}

line* initLine(line * head){

head=(line*)malloc(sizeof(line));

head->prior=NULL;

head->next=NULL;

head->data=1;

line * list=head;

for (int i=2; i<=5; i++) {

line * body=(line*)malloc(sizeof(line));

body->prior=NULL;

body->next=NULL;

body->data=i;

list->next=body;

body->prior=list;

list=list->next;

}

return head;

}

line * insertLine(line * head,int data,int add){

//新建数据域为data的结点

line * temp=(line*)malloc(sizeof(line));

temp->data=data;

temp->prior=NULL;

temp->next=NULL;

//插入到链表头,要特殊考虑

if (add==1) {

temp->next=head;

head->prior=temp;

head=temp;

}else{

line * body=head;

//找到要插入位置的前一个结点

for (int i=1; i

body=body->next;

}

//判断条件为真,说明插入位置为链表尾

if (body->next==NULL) {

body->next=temp;

temp->prior=body;

}else{

body->next->prior=temp;

temp->next=body->next;

body->next=temp;

temp->prior=body;

}

}

return head;

}

line * delLine(line * head,int data){

line * temp=head;

//遍历链表

while (temp) {

//判断当前结点中数据域和data是否相等,若相等,摘除该结点

if (temp->data==data) {

temp->prior->next=temp->next;

temp->next->prior=temp->prior;

free(temp);

return head;

}

temp=temp->next;

}

printf("链表中无该数据元素");

return head;

}

//head为原双链表,elem表示被查找元素

int selectElem(line * head,int elem){

//新建一个指针t,初始化为头指针 head

line * t=head;

int i=1;

while (t) {

if (t->data==elem) {

return i;

}

i++;

t=t->next;

}

//程序执行至此处,表示查找失败

return -1;

}

//更新函数,其中,add 表示更改结点在双链表中的位置,newElem 为新数据的值

line *amendElem(line * p,int add,int newElem){

line * temp=p;

//遍历到被删除结点

for (int i=1; i

temp=temp->next;

}

temp->data=newElem;

return p;

}

//输出链表的功能函数

void display(line * head){

line * temp=head;

while (temp) {

if (temp->next==NULL) {

printf("%d\n",temp->data);

}else{

printf("%d->",temp->data);

}

temp=temp->next;

}

}

程序执行结果为:

1->2->3->4->5

1->2->7->3->4->5

1->7->3->4->5

元素 3 的位置是:3

1->7->6->4->5

matlab 双向链表,双向链表基本操作(C语言实现)相关推荐

  1. 详解双向链表的基本操作(C语言)

    工科生一枚,热衷于底层技术开发,有强烈的好奇心,感兴趣内容包括单片机,嵌入式Linux,Uboot等,欢迎学习交流! 爱好跑步,打篮球,睡觉. 欢迎加我QQ1500836631(备注CSDN),一起学 ...

  2. 双向链表和循环双向链表的基本操作

    双向链表和循环双向链表的基本操作 #include<stdio.h> #include<malloc.h> typedef struct LNode {int data;str ...

  3. MATLAB主窗口中 主菜单栏有,Matlab介绍与基本操作.ppt

    Matlab介绍与基本操作 MATLAB介绍与基本操作 数学软件与Matlab的关系 国际上最常用的三种数学类科技应用软件为:3M Matlab Mathematica Maple P.S:还有Mat ...

  4. matlab 图像上下翻,Matlab图像九宫格基本操作(翻转,镜像等)+位图操作

    Matlab图像九宫格基本操作(翻转,镜像等)+位图操作 Matlab图像九宫格基本操作(翻转,镜像等)+位图操作 这次blog提到的操作对于matlab来说都很基础,而且对于有编程和计算机基础的人来 ...

  5. matlab m语言,我要编写matlab一个公式的m语言,请问错在哪里?,M语言的MATLAB的M语言...

    导航:网站首页 > 我要编写matlab一个公式的m语言,请问错在哪里?,M语言的MATLAB的M语言 我要编写matlab一个公式的m语言,请问错在哪里?,M语言的MATLAB的M语言 匿名网 ...

  6. 【MATLAB教程案例91】将MATLAB程序转化为C语言

    欢迎订阅<FPGA学习入门100例教程>.<MATLAB学习入门100例教程> 目录 1.软件版本 2.将MATLAB程序转化为C语言 1.软件版本 matlab2021a

  7. matlab空域滤波,MATLAB数字图像处理基本操作及空域滤波

    MATLAB数字图像处理基本操作及空域滤波 实验一 MATLAB 数字图像处理基本操作及空域滤波实验目的1.了解有关数字图像处理的基本概念,熟悉Matlab软件中关于数字图像处理的基本命令,掌握利用M ...

  8. Matlab mod函数 对应C语言 函数

    Matlab mod函数 对应C语言 函数 2010-09-10 23:43 Matlab中的mod函数,不同于C语言中的"%",在C中没有专门对应的函数. Matlab的mod函 ...

  9. C语言详解双向链表的基本操作

    目录 双链表的定义与接口函数 定义双链表 接口函数 详解接口函数的实现 创建新节点(BuyLTNode) 初始化双链表(ListInit) 双向链表打印(ListPrint) 双链表查找(ListFi ...

最新文章

  1. Hadoop MapReduce入门程序wordcount代码示例及打包部署运行结果演示
  2. [阿里云]I+的一些探索
  3. android 解决java.nio.BufferOverflowException 异常
  4. Spring Cloud Eureka 入门 (二)服务提供者详解
  5. ajax脚本格式,jQuery ajax调用 - jim脚本响应是什么格式?
  6. Django 第十二课 【class meta】
  7. linux下设置opencv环境变量
  8. 升级至 vCenter Server 6.5 的最佳实践 (2147686)
  9. SOS强力求助—如何上传一个xml文件到一个服务器,并且得到服务器返回的数据。-已解...
  10. 七牛云存储,图片储存
  11. 手动调整vector容器空间的方式
  12. 若依框架入门(前后端分离版本)
  13. 地外水平/斜面的太阳理论辐照度计算及其python实现
  14. C语言RSA大数运算库,[转载]RSA大数运算库  c++实现
  15. idea 光标 快捷键_idea 快捷键汇总
  16. 基于simulink的有源功率因数校正(APFC) 系统的性能仿真
  17. C++中如何创建一个类?
  18. Wex5 popOver组件的使用
  19. (上)小程序从0快速入门到实战项目打造个性简历,让你轻松脱颖而出吸引面试官眼球(附源码)
  20. 计算机桌面打标签,桌面记事本,详细教您怎么在桌面添加便签

热门文章

  1. JVM运行时数据区分析
  2. Qt 5.12 LTS(长期维护版本)中Qt Quick的性能改进
  3. 计算任何一天是星期几的几种算法
  4. 多项式(polynomial)和 单项式(monomial)
  5. 计算机硬件结构中负责识别,计算机硬件基本结构树状图
  6. go http 处理w.write 错误_go学习笔记-错误处理
  7. OS / 几个常用的操作系统进程调度算法
  8. Altium designer—STM32F103ZET6最小系统PCB图
  9. edge浏览器如何把网页放到桌面_最强桌面浏览器
  10. vuex页面数据丢失_使用vuex解决刷新页面state数据消失的问题记录