Code前端首页关于Code前端联系我们

双向链表的插入、删除、遍历VS C语言案例代码

terry 2年前 (2023-09-27) 阅读数 72 #数据结构与算法

1。双向链表插入操作

如图:

双向链表的插入、删除、遍历操作 VS C语言案例代码

每次双向链表插入操作,首先要创建一个独立的节点,并通过malloc操作打开对应的空间。其次,我们选择这个新创建的独立节点,并将其预指针指向所需插入位置的前一个节点。同时将之前要插入的节点的next指针修改为指向新节点。类似地,新节点的下一个指针将指向原来的下一个节点,并且下一个节点的预指针被修改为指向新节点本身。这样的操作称为双向链表中的插入操作。

代码可以表示为:

//插入数据 line * insertLine(line * main,int,, int 添加){ //三个参数分别是:本次操作的双向链表、插入的数据以及插入的位置 //用数据字段 ​​创建一个数据字段line * temp=( line*)malloc(sizeof(line);temp ->pre=NULL;temp->next= NULL; //插入链表头部,要特别考虑 if (add ==1) {      温度->下一步=头; }else{     线 * 身体; 对于 (int +i=1; id+i=1; id+i=1; body=body->next; } //判断条件为真,表示插入位置为链表末尾 ❀❀❀❀❀temp; - >pre=body; >pre=temp; ​temp->下一个=body->下一个; body->下一个=温度; }}返回

2。双向链表的删除操作

如图:

双向链表的插入、删除、遍历操作 VS C语言案例代码

删除操作过程为:选中要删除的节点,选中该节点的前一个节点,将前一个节点的next指针指向其下一个节点,同时选择该节点中的下一个节点并将下一个节点移动到该节点。该节点的前光标更改为指向其前一个节点。这样做的效果是在遍历时直接跳过这个节点

这样的游标修改操作后,我们释放删除节点点击,将空间返回内存。这个操作称为双向链表的删除操作。

代码可以表示为:

//删除元素line *deleteLine(line * head,int) //输入参数为双本次操作的链表,要删除的数据 line * list=head; //遍历链表 while ( list ){ //判断是否等于这个元素 //删除这个点到它后面的下一个节点节点的方法 /                                                          免费(列表);      printf("--删除成功--\n"); ,找到且没有删除\n"); 返回

3 遍历双向链表 就像遍历单链表list一样,使用下一个光标返回。只是索引。注意这里的判断。我们既可以使用 while(list) 操作来直接判断链表是否为空,也可以使用 while(list->next) 操作来判断链表是否为空。下一个节点为空的判断状态,该节点是否为空也有同样的效果。当然,要充分利用双向链表上的预指针来实现高效的遍历。也值得一试

简单的代码可以表示为:

//遍历双向链表,同时打印元素数据 void ❀ 线*list = main; int pos=1; ){    printf(: %d\n"数据为 %d" ,pos++,list->data);

4。查询

对于双链表没有太多单独的训练数据,网上的信息也比单链表少。但是当我们熟悉了原理之后,我们可以使用与单链表相同的问题,尝试使用双链表。做题如下:

1676 题 1585 题

5。此问题的案例代码

#include#includetypedef ♹♹❀❀ 线{ int 数据; //数据 结构 行 *pre; //前置节点 struct line *next; //下一个节点第}行;//代表该节点的前驱(pre )、后继(next)和当前数据(data) //通过双链接打印该元素void printLine(line *head){ intint pos=1; 同时 (列表){            printf %th: %th: d\n",pos++ ,list->data) { ? \n");​​​ scanf("%d",&number); NULL;} //非法输入直接结束 //////创建头节点 //////// head=(line*) sizeof(线 ), scanf(in""); head->data=input_data; 行 * 列表=头; line * body= (行*)malloc(sizeof(行)); > 下一个= NULL;      printf("输入%d个数据\n"❃,pos++);" scanf("%d条数据\ n"❃,pos++);,&input_data);    正文->数据=输入数据; list=list->next; } return }//插入数据line * insertLine( line * main,int data,int ) //三个参数分别是:本次操作的双向链表、插入的数据、插入的位置 //创建数据域为数据的新节点 line * temp=(line*mal)) sizeof(line)); ​​temp->data=data ; temp->pre-NULL;n NULL; //插入链表头部必须特殊考虑 iftemp->下一个 = 头;头-> pre=temp; head=temp; }other           //查找您要插入的位置。点 对于 int❀i ; i下一个; (身体->下一个==NULL) {                                                                           }else{ body->下一个->pre=temp;  data){ //输入参数为本次操作的双向链表和要删除的数据 line * list=head;❀//遍历链表list while (list) { /juv if it等于 //方法删除该点就是将下一个节点指向到本节点的前一个节点 到本节点之后的节点     //同时将此节点的下一个节点的pre指向本节点的前一个节点 if (列表->数据==数据) { 列表   列表->下一个->前=列表->前; ("--删除成功--\n");     ❀ 男ad; } list=列表->下一个; printf("错误:未找到元素,未发生删除\n");nurn  头;} int main(){ line *head=NULL; ("创建双向链表操作\n" ); head=initLine(head); ?插入操作\n"); head=insertLine(head,40,2); //为了简化,直接写参数 (Line head );/ / /////////插入行////////////printf((() )操作“ e ); head=deleteLine(head,2); /// /删除行//////////////// n 0 ;}

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门