数据结构-----双向链表

1.什么是内存泄漏?

        主动申请到的内存空间没有进行内存释放,导致无内存空间可用。

2.双向链表?

        双向链表(Doubly Linked List)是链表的一种,它允许我们在链表中的任何一个节点向前或

向后遍历。与单向链表相比,双向链表中的每个节点不仅存储了指向下一个节点的指针(或引

用),还存储了指向前一个节点的指针(或引用)。这种双向链接性提供了更多的灵活性,但同时

也需要更多的内存来存储额外的指针。

3.双向链表的基本结构

        在双向链表中,每个节点通常包含三个基本部分:

  1. 数据域:存储节点的数据。
  2. 前驱ppre):指向链表中的前一个节点。
  3. 后继指针(next):指向链表中的下一个节点。

4.单项链表与双向链表区别?

        单向链表只能单向访问,节点只有一个指向下一个节点的指针;而双向链表可以双向访问,

节点有两个指针,分别指向前一个和后一个节点。

5.练习

#include <stdio.h>
#include "doulink.h"
#include <stdlib.h>
#include <string.h>
//创建
Dlink_t *create_dlink()
{Dlink_t *pdoulink = (Dlink_t *)malloc(sizeof(Dlink_t));if(NULL == pdoulink){perror("malloc fail");return NULL;}pdoulink->phead = NULL;pdoulink->clen = 0;pthread_mutex_init(&pdoulink->mutex,NULL);return pdoulink;
}
int is_empty_doulink(Dlink_t *pdoulink)
{return NULL == pdoulink->phead;
}
//头插
int push_doulink_head(Dlink_t *pdoulink, DataType data)
{Dlink_node_t *pnode = (Dlink_node_t *)malloc(sizeof(Dlink_node_t));if(NULL == pnode){perror("fail malloc");return -1;}pnode->data = data;pnode->ppre =NULL;pnode->pnext =NULL;if(is_empty_doulink(pdoulink)){pdoulink->phead = pnode;}else{   pnode->pnext = pdoulink->phead;pdoulink->phead->ppre = pnode;pdoulink->phead= pnode;}pdoulink->clen++;return 0;
}
int push_doulink_tail(Dlink_t *pdoulink,DataType data)
{Dlink_node_t *pnode = (Dlink_node_t *)malloc(sizeof(Dlink_node_t));if(NULL == pnode){perror("fail malloc");return -1;}pnode->data =data;pnode->ppre = NULL;pnode->pnext =NULL;if(is_empty_doulink(pdoulink)){pdoulink->phead = pnode;}else{Dlink_node_t *p =pdoulink->phead;while(p->pnext!= NULL){p=p->pnext;}p->pnext = pnode;pnode->ppre = p;}pdoulink->clen++;return 0;
}
int pop_doulink_head(Dlink_t *pdoulink)
{if(is_empty_doulink(pdoulink)){return 0;}Dlink_node_t *p = pdoulink->phead;pdoulink->phead = p->pnext;p->ppre = NULL;free(p);pdoulink->clen--;return 0;
}
int pop_doulink_tail(Dlink_t *pdoulink)
{if(is_empty_doulink(pdoulink)){return 0;}Dlink_node_t *p = pdoulink->phead;while(p->pnext->pnext != NULL){p=p->pnext;}free(p->pnext);p->pnext=NULL;pdoulink->clen--;return 0;
}Dlink_node_t *find_data(Dlink_t *pdoulink,char *name)
{if(is_empty_doulink(pdoulink)){return NULL;}Dlink_node_t *p = pdoulink->phead;while(p!= NULL){if(strcmp(p->data.name,name)==0){//printf("find : %s\n",p->data.name);return p;}p=p->pnext;}return NULL;
}int change_doulink(Dlink_t *pdoulink,char *name,int score)
{if(is_empty_doulink(pdoulink)){return 0;}Dlink_node_t *p = find_data(pdoulink,name);p->data.score = score;return 0;}
void printf_doulink(Dlink_t *pdoulink)
{Dlink_node_t *p = pdoulink->phead;while(p != NULL){printf("[%d  %s %d]\n",p->data.id, p->data.name,p->data.score);// printf("%p  ",p);p = p->pnext;}printf("%d\n",pdoulink->clen);printf("********************\n");
}
void printf_back_doulink(Dlink_t *pdoulink)
{Dlink_node_t *p = pdoulink->phead;while(p->pnext != NULL){p = p->pnext;}while(p!=NULL){printf("[%d  %s %d]\n",p->data.id, p->data.name,p->data.score);// printf("%p  ",p);p = p->ppre;}
}void destroy_dlink(Dlink_t *pdoulink)
{while(!is_empty_doulink(pdoulink)){     pop_doulink_head(pdoulink);}free(pdoulink);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/878700.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

display flex 的div 被子元素撑开不显示滚动条的一个解决demo

display flex 的div 被子元素撑开&#xff0c;不显示y轴滚动条的 一个解决demo。 注&#xff1a; 不一定适用所有人的的相同问题 less # less .contact {display: flex;flex-grow: 1;overflow: hidden auto;flex-direction: column;.contact-items {flex: 1 1 0;display: flex…

Python和Java及MATLAB和CUDA显微镜导图

&#x1f3af;要点 交互式设备控制和图像处理图像背景和阴影校正可视化萤光团位置算法和读取光学图像读写转换显微镜图像生物医学细胞图像分析荧光图像算法计算亮度数据和模拟表征新型染料和缓冲液强度估计细菌图像分析扫描透射和高分辨率透射图像模拟多模态成像分割可视化透射…

Hive服务部署及Datagrip工具使用

目录 Hive服务部署 Hiveserver2服务 1&#xff09;用户说明 2&#xff09;Hiveserver2部署 &#xff08;1&#xff09;Hadoop端配置 &#xff08;2&#xff09;Hive端配置 3&#xff09;测试 &#xff08;1&#xff09;启动Hiveserver2 &#xff08;2&#xff09;使用命…

深入学习电路基础:从理论到实践

引言 电路是电子学的核心&#xff0c;也是现代科技的基石。从简单的灯泡开关到复杂的计算机处理器&#xff0c;电路在各类电子设备中都起到了至关重要的作用。深入学习电路知识不仅有助于理解电子设备的工作原理&#xff0c;还能够为实际设计和开发电子产品打下坚实的基础。 …

flutter语法:var、late、const、final区别

var: 用于声明可变变量&#xff0c;支持类型推断并能多次赋值&#xff0c;但只能是同类型的数据赋值。之后其类型更改&#xff0c;会抛出异常。 var number 10;void main() {print(number); // 这将打印10。number 20; // 再次赋值&#xff0c;但必须同类型print(number); /…

某云彩SRM2.0任意文件下载漏洞

文章目录 免责申明搜索语法漏洞描述漏洞复现修复建议 免责申明 本文章仅供学习与交流&#xff0c;请勿用于非法用途&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任 搜索语法 fofa icon_hash"1665918155"漏洞描述 某云采 SRM2.0是一款先…

扁平数组转化分类树

使用下列数组生成一个分类树&#xff08;数组中每项中的pid是父节点的id&#xff0c;pid:0表示顶层&#xff0c;pid:1&#xff0c;表示这个节点属于id为1的节点&#xff0c;children该节点的子节点数组&#xff09; const jsona [{"ID": 1,"CreatedAt": …

【计算机视觉前沿研究 热点 顶会】ECCV 2024中扩散模型有关的论文

神经辐射场修复的驯服潜在扩散模型 神经辐射场(NERF)是一种从多视角图像进行三维重建的表示法。尽管最近的一些工作表明&#xff0c;在编辑具有扩散先验的重建的 NERF 方面取得了初步成功&#xff0c;但他们仍然在努力在完全未覆盖的区域中合成合理的几何图形。一个主要原因是…

使用大型语言模型进行监督微调(SFT)

大型语言模型&#xff08;LLMs&#xff09;通常经过几个阶段的训练&#xff0c;包括预训练和几个微调阶段&#xff1b;请参见下文。尽管预训练很昂贵&#xff08;即需要数十万美元的计算成本&#xff09;&#xff0c;但相比之下&#xff0c;微调LLM&#xff08;或进行上下文学习…

应用商店优化(ASO)的四大误区

应用商店优化 (ASO) 是移动营销中最重要的部分之一&#xff0c;可以帮助开发人员吸引自然流量并在应用推广方面取得预期效果。近年来ASO优化在开发者中越来越受欢迎。虽然它已经证明了其有效性和对应用成功的影响力&#xff0c;但尽管如此仍然存在与ASO相关的误解&#xff0c;导…

Day-04-QFile打开文件的两种方式

一、UI界面设置两个按键&#xff0c;并直接转到槽函数 二、两种代码展示 #include <QFile> #include <QDebug>//此两种方式中调用函数&#xff0c;应包含的头文件void Widget::on_btnReadFile01_clicked()//第一种打开方式 {//1. 打开文件QFile file;file.setFile…

ARM发布新一代高性能处理器N3

简介 就在2月21日&#xff0c;ARM发布了新一代面向服务器的高性能处理器N3和V3&#xff0c;N系列平衡性能和功耗&#xff0c;而V系列则注重更高的性能。此次发布的N3&#xff0c;单个die最高32核&#xff08;并加入到CCS&#xff0c;Compute Subsystems&#xff0c;包含Core&a…

【Unity案例】搭建射击系统与UI

上期将基础的移动系统搭建完毕后就可以开始搭建更加复杂的系统部分了 前排提示&#xff0c;由于一开始仅思考如何完成操作相关功能&#xff0c;以至于到后面重构稍微有些困难&#xff0c;继续写下去恐成屎山&#xff0c;故在搭完射击和武器UI后不再继续泛化到敌人和敌人状态机…

本地Gitblit使用

首先创建一个本地的gitblit的服务&#xff0c;创建流程如下&#xff1a; 【GitBlit】Windows搭建Git服务器详细教程_搭建gitblit服务-CSDN博客 GitBlit的使用教程-CSDN博客 创建好一个仓库后&#xff0c;分配好用户权限&#xff0c;再将项目拉下来&#xff0c;这里是再visua…

PhpStorm 下调试功能配置

调试是开发过程中的关键环节&#xff0c;能够极大地减少应用程序中的错误并提高代码质量。PhpStorm 作为一款功能强大的 IDE&#xff0c;提供了丰富的调试功能&#xff0c;结合 Xdebug&#xff0c;可以让开发者更轻松地进行 PHP 应用程序的调试。本指南将详细介绍如何在 PhpSto…

JS中正则表达式捕获组与反向引用详解

正则表达式&#xff08;Regular Expression&#xff0c;简称 Regex&#xff09;是一种强大的字符串匹配工具&#xff0c;它能够让我们通过模式来查找、匹配、替换字符串中的内容。而在正则表达式中&#xff0c;捕获组是一个非常重要的概念&#xff0c;常常用于将匹配到的内容保…

零信任赋予安全牙齿,AI促使它更锋利

距离上次写关于安全的文字已经过去了很久很久&#xff0c;久到上次看到的AI还停留在TTS、ASR等最初的语音交互搜索类似的各种智能音箱以及通过关键字匹配的基于知识库的聊天的机器人。之后的几年各种视觉识别遍地开花&#xff0c;AI四小龙在人脸识别上成熟应用&#xff0c;再然…

系统演示视频正确的录制顺序

低效的录制 低效的录制有几个问题&#xff1a; 1&#xff09;视频演讲稿没有提前写 写稿子是挺麻烦&#xff0c;但写好稿子后&#xff0c;可以让领导先看。如果稿子要修改&#xff0c;视频重新制作、剪辑的概率很大。返工情况概率大。 2&#xff09;视频配音不是AI生成&…

浏览器百科:网页存储篇-如何在Chrome打开localStorage窗格(五)

1.引言 在前面的章节中&#xff0c;我们详细介绍了 localStorage 的基本概念、特性及其常用方法&#xff0c;帮助开发者在网页应用中实现数据的持久化存储。为了更好地管理和调试这些存储的数据&#xff0c;了解如何打开和使用浏览器的 localStorage 窗格是非常重要的。本篇文…

科研绘图系列:R语言差异基因四分图(Quad plot)

介绍 四分图(Quad plot)是一种数据可视化技术,通常用于展示四个变量之间的关系。它由四个子图组成,每个子图都显示两个变量之间的关系。四分图的布局通常是2x2的网格,每个格子代表一个变量对的散点图。 在四分图中,通常: 第一个子图显示变量A和B的关系。第二个子图显示…