一郎科技|就靠这20+张图了,一口气搞懂「链表」( 五 )


其次我们选中这个新创建的独立节点 , 将其的pre指针指向所需插入位置的前一个结点;
同时 , 其所需插入的前一个结点的next指针修改指向为该新的结点 , 该新的结点的next指针将会指向一个原本的下一个结点 , 而修改下一个结点的pre指针为指向新结点自身 , 这样的一个操作我们称之为双向链表的插入操作 。
其代码可以表示为:
//插入数据
line*insertLine(line*head,intdata,intadd){
//三个参数分别为:进行此操作的双链表 , 插入的数据 , 插入的位置
//新建数据域为data的结点
line*temp=(line*)malloc(sizeof(line));
temp->data=https://pcff.toutiao.jxnews.com.cn/p/20200829/data;
temp->pre=;
temp->next=;
//插入到链表头 , 要特殊考虑
if(add==1){
temp->next=head;
head->pre=temp;
head=temp;
}else{
line*body=head;
//找到要插入位置的前一个结点
for(inti=1;ibody=body->next;
}
//判断条件为真 , 说明插入位置为链表尾
if(body->next==){
body->next=temp;
temp->pre=body;
}else{
body->next->pre=temp;
temp->next=body->next;
body->next=temp;
temp->pre=body;
}
}
returnhead;
}
双向链表的删除操作如图:
在进行遍历的时候直接将这一个结点给跳过了 , 之后 , 我们释放删除结点 , 归还空间给内存 , 这样的操作我们称之为双链表的删除操作 。
其代码可以表示为:
//删除元素
line*deleteLine(line*head,intdata){
//输入的参数分别为进行此操作的双链表 , 需要删除的数据
line*list=head;
//遍历链表
while(list){
//判断是否与此元素相等
//删除该点方法为将该结点前一结点的next指向该节点后一结点
//同时将该结点的后一结点的pre指向该节点的前一结点
if(list->data=https://pcff.toutiao.jxnews.com.cn/p/20200829/=data){
list->pre->next=list->next;
list->next->pre=list->pre;
free(list);
printf("--删除成功--n");
returnhead;
}
list=list->next;
}
printf("Error:没有找到该元素 , 没有产生删除n");
returnhead;
}
双向链表的遍历双向链表的遍历利用next指针逐步向后进行索引即可 。
注意 , 在判断这里 , 我们既可以用while(list)的操作直接判断是否链表为空 , 也可以使用while(list->next)的操作判断该链表是否为空 , 其下一节点为空和本结点是否为空的判断条件是一样的效果 。
其简单的代码可以表示为:
//遍历双链表,同时打印元素数据
voidprintLine(line*head){
line*list=head;
intpos=1;
while(list){
printf("第%d个数据是:%dn",pos++,list->data);
【一郎科技|就靠这20+张图了,一口气搞懂「链表」】list=list->next;


推荐阅读