当前位置: 首页 > news >正文

双向链表的插入、删除、按位置增删改查、栈和队列区别、什么是内存泄漏

2024年2月4日
1.请编程实现双向链表的头插,头删、尾插、尾删

头文件:

#ifndef __HEAD_H__
#define __HEAD_H__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef int datatype;
enum{FALSE=-1,SUCCSE};
typedef struct Node
{datatype data;struct Node *next;struct Node *prev;
}*Doublelist;Doublelist create();
Doublelist insert_head(Doublelist head,datatype element);
Doublelist insert_rear(Doublelist head,datatype element);
void output(Doublelist head);
Doublelist delete_head(Doublelist head);
Doublelist delete_rear(Doublelist head);#endif

主函数:

#include"head.h"
int main(int argc, const char *argv[])
{Doublelist head=NULL;int n;printf("please enter n:");scanf("%d",&n);datatype element;for(int i=0;i<n;i++){printf("please enter %d element:",i+1);scanf("%d",&element);head=insert_head(head,element);//head=insert_rear(head,element);}output(head);puts("");head=delete_head(head);output(head);puts("");head=delete_rear(head);output(head);return 0;
}

自定义函数:

#include"head.h"
/** function:    节点创建* @param [ in] * @param [out] 成功返回首地址,失败返回空* @return      */
Doublelist create()
{Doublelist s=(Doublelist)malloc(sizeof(struct Node));if(s==NULL)return NULL;s->data=0;s->next=s->prev=NULL;return s;
}
/** function:    头插* @param [ in] 头 插入元素* @param [out] 头* @return      */
Doublelist insert_head(Doublelist head,datatype element)
{Doublelist s=create();s->data=element;if(NULL==head)head=s;else{s->next=head;head->prev=s;head=s;}return head;
}
/** function:    尾插* @param [ in] 头 插入元素* @param [out] 头* @return      */
Doublelist insert_rear(Doublelist head,datatype element)
{Doublelist s=create();s->data=element;if(NULL==head)head=s;else{Doublelist p=head;while(p->next)p=p->next;p->next=s;s->prev=p;}return head;
}
/** function:    遍历输出* @param [ in] 头* @param [out] * @return      */
void output(Doublelist head)
{if(head==NULL){puts("empty");return;}Doublelist p=head;while(p){printf("%-5d",p->data);p=p->next;}
}
/** function:    头删* @param [ in] 头* @param [out] 头* @return      */
Doublelist delete_head(Doublelist head)
{if(head==NULL)return NULL;if(head->next==NULL){free(head);head=NULL;return NULL;}Doublelist del=head;head=head->next;free(del);head->prev=NULL;del=NULL;return head;
}
/** function:    尾删* @param [ in] 头* @param [out] 头* @return      */
Doublelist delete_rear(Doublelist head)
{if(NULL==head)return head;if(head->next==NULL){free(head);head=NULL;return NULL;}Doublelist p=head;while(p->next)p=p->next;Doublelist del=p;p->prev->next=NULL;free(del);del=NULL;return head;
}

头插、头删、尾删:

尾插、头删、尾删:


⒉请编程实现双向链表按任意位置插入、删除、修改、查找

头文件:

#ifndef __HEAD_H__
#define __HEAD_H__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef int datatype;
enum{FALSE=-1,SUCCSE};
typedef struct Node
{datatype data;struct Node *next;struct Node *prev;
}*Doublelist;Doublelist create();
Doublelist insert_head(Doublelist head,datatype element);
Doublelist insert_rear(Doublelist head,datatype element);
void output(Doublelist head);
Doublelist delete_head(Doublelist head);
Doublelist delete_rear(Doublelist head);
Doublelist insert_pos(Doublelist head,int pos,datatype element);
Doublelist delete_pos(Doublelist head,int pos);
void find_pos(Doublelist head,int pos);
int revise_pos(Doublelist head,int pos,datatype element);#endif

主函数:

#include"head.h"
int main(int argc, const char *argv[])
{Doublelist head=NULL;int n;printf("please enter n:");scanf("%d",&n);datatype element;for(int i=0;i<n;i++){printf("please enter %d element:",i+1);scanf("%d",&element);//head=insert_head(head,element);head=insert_rear(head,element);}output(head);puts("");
/*	head=delete_head(head);output(head);puts("");head=delete_rear(head);output(head);
*/	int pos;
/*	printf("please enter pos:");scanf("%d",&pos);printf("please enter insert element:");scanf("%d",&element);head=insert_pos(head,pos,element);output(head);printf("please enter pos:");scanf("%d",&pos);head=delete_pos(head,pos);output(head);
*/	printf("please enter pos:");scanf("%d",&pos);find_pos(head,pos);printf("please enter pos:");scanf("%d",&pos);printf("please enter insert element:");scanf("%d",&element);int num=revise_pos(head,pos,element);if(num==-1)puts("ERROR");elseoutput(head);return 0;
}

自定义函数:

#include"head.h"
/** function:    节点创建* @param [ in] * @param [out] 成功返回首地址,失败返回空* @return      */
Doublelist create()
{Doublelist s=(Doublelist)malloc(sizeof(struct Node));if(s==NULL)return NULL;s->data=0;s->next=s->prev=NULL;return s;
}
/** function:    头插* @param [ in] 头 插入元素* @param [out] 头* @return      */
Doublelist insert_head(Doublelist head,datatype element)
{Doublelist s=create();s->data=element;if(NULL==head)head=s;else{s->next=head;head->prev=s;head=s;}return head;
}
/** function:    尾插* @param [ in] 头 插入元素* @param [out] 头* @return      */
Doublelist insert_rear(Doublelist head,datatype element)
{Doublelist s=create();s->data=element;if(NULL==head)head=s;else{Doublelist p=head;while(p->next)p=p->next;p->next=s;s->prev=p;}return head;
}
/** function:    遍历输出* @param [ in] tou* @param [out] * @return      */
void output(Doublelist head)
{if(head==NULL){puts("empty");return;}Doublelist p=head;while(p){printf("%-5d",p->data);p=p->next;}
}
/** function:    头删* @param [ in] 头* @param [out] 头* @return      */
Doublelist delete_head(Doublelist head)
{if(head==NULL)return NULL;if(head->next==NULL){free(head);head=NULL;return NULL;}Doublelist del=head;head=head->next;free(del);head->prev=NULL;del=NULL;return head;
}
/** function:    尾删* @param [ in] 头* @param [out] 头* @return      */
Doublelist delete_rear(Doublelist head)
{if(NULL==head)return head;if(head->next==NULL){free(head);head=NULL;return NULL;}Doublelist p=head;while(p->next)p=p->next;Doublelist del=p;p->prev->next=NULL;free(del);del=NULL;return head;
}
/** function:    计算长度* @param [ in] 头* @param [out] 长度* @return      */
int lengh(Doublelist head)
{int len=0;while(head){len++;head=head->next;}return len;
}
/** function:    按任意位置插入* @param [ in] 头 位置 插入元素* @param [out] 头* @return      */
Doublelist insert_pos(Doublelist head,int pos,datatype element)
{if(NULL==head || pos<1 || pos>lengh(head)+1){puts("POS ERROR OR EMPTY");return head;}if(pos==1){head=insert_head(head,element);return head;}else if(pos==lengh(head)+1){head=insert_rear(head,element);return head;}Doublelist s=create();s->data=element;Doublelist p=head;for(int i=1;i<pos-1;i++)p=p->next;s->next=p->next;p->next->prev=s;s->prev=p;p->next=s;return head;
}
/** function:    任意位置删除* @param [ in] 头 位置* @param [out] 头* @return      */
Doublelist delete_pos(Doublelist head,int pos)
{if(NULL==head || pos<1 || pos>lengh(head)){puts("POS ERROR OR EMPTY");return head;}if(pos==1)head=delete_head(head);else if(pos==lengh(head))head=delete_rear(head);else{Doublelist p=head;for(int i=1;i<pos-1;i++)p=p->next;Doublelist del=p->next;p->next=del->next;del->next->prev=p;free(del);del=NULL;}return head;
}
/** function:    任意位置查找* @param [ in] 头 位置* @param [out] * @return      */
void find_pos(Doublelist head,int pos)
{if(NULL==head || pos<1 || pos>lengh(head)){puts("POS ERROR OR EMPTY");return;}Doublelist p=head;for(int i=1;i<pos;i++)p=p->next;printf("The pos element is %d\n",p->data);
}
/** function:    任意位置修改* @param [ in] 头 位置 修改后的元素* @param [out] 成功返回0,失败返回-1* @return      */
int revise_pos(Doublelist head,int pos,datatype element)
{if(NULL==head || pos<1 || pos>lengh(head)){puts("POS ERROR OR EMPTY");return FALSE;}Doublelist p=head;for(int i=1;i<pos;i++)p=p->next;p->data=element;return SUCCSE;
}

任意位置插入:

任意位置删除:

任意位置查找:

任意位置修改:

3.请简述栈和队列的区别?

1、栈和队列的出入方式不同:栈是先进后出,队列是先进先出。

2、栈和队列的实现时操作位置不同:栈是出入在一端,后入先出,队列是出入在两端先进先出。

4.请简述什么内存泄露?

程序员释放在堆区申请的内存时,指针未指向释放内存的首地址,导致前部分内存未释放,且没有指针指向导致内存泄漏。

相关文章:

双向链表的插入、删除、按位置增删改查、栈和队列区别、什么是内存泄漏

2024年2月4日 1.请编程实现双向链表的头插&#xff0c;头删、尾插、尾删 头文件&#xff1a; #ifndef __HEAD_H__ #define __HEAD_H__ #include<stdio.h> #include<stdlib.h> #include<string.h> typedef int datatype; enum{FALSE-1,SUCCSE}; typedef str…...

Linux 驱动开发基础知识——总线设备驱动模型(七)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;Vir2021GKBS &#x1f43c;本文由…...

RTthread线程间通信(邮箱,消息队列,信号/软件中断)---03信号(软件中断)源码分析

信号 实际使用看这一个 #if defined(RT_USING_SIGNALS)rt_sigset_t sig_pending; /**< the pending signals 记录来了的信号 */rt_sigset_t sig_mask; /**< the mask bits of signal 记录屏蔽的信号 */rt_sigh…...

老版本labelme如何不保存imagedata

我的版本是3.16&#xff0c;默认英文且不带取消保存imagedata的选项。 最简单粗暴的方法就是在json文件保存时把传递过来的imagedata数据设定为None&#xff0c;方法如下&#xff1a; 找到labelme的源文件&#xff0c;例如&#xff1a;D:\conda\envs\deeplab\Lib\site-packages…...

vscode 如何修改c/c++格式化风格,大括号不换行

在Visual Studio Code&#xff08;VSCode&#xff09;中&#xff0c;若要修改C代码格式化的风格以实现大括号不换行&#xff0c;通常会借助于插件C/C扩展中的ClangFormat配置。以下是具体的步骤&#xff1a; 确保已安装了C/C扩展&#xff1a; 打开VSCode的扩展市场&#xff08;…...

IP协议(2) 和 数据链路层协议基础

IP协议续 1.路由选择 在复杂的网络结构中,我们需要找到一个通往终点的路线,这就是路由选择 举个例子:我们在没有手机导航之前,想去一个地方得是到一个地方问一下路的方式最终找到目的地 路由的过程,其实就是样子问路的过程 1.当IP数据包到达路由器的时候,会查看目的IP 2.路由器…...

Flink-1.18.1环境搭建

下载 下载flink安装包 Index of /dist/flink/flink-1.18.1 下载flink-cdc安装包 Release Release 3.0.0 ververica/flink-cdc-connectors GitHub 安装 添加环境变量 vi ~/.bash_profile export FLINK_HOME=/home/postgres/flink/flink-1.18.1 export PATH=$PATH:$FL…...

deepin20.9安装及配置

安装deepin20.9很简单&#xff0c;刻录u盘 安装 一路next apt install nginx global vim-nox debian11 使用apt安装php, 使php多版本共存_debain11 php5-CSDN博客 vim LeaderF安装问题 - 知乎 debian10安装vue环境, 包括安装node.js-CSDN博客 debian安装vue3 nodejs20-CSD…...

2-2 动手学深度学习v2-损失函数-笔记

损失函数&#xff0c;用来衡量预测值和真实值之间的区别。是机器学习里面一个非常重要的概念。 三个常用的损失函数 L2 loss、L1 loss、Huber’s Robust loss 均方损失 L2 Loss l ( y , y ′ ) 1 2 ( y − y ′ ) 2 l(y,y^{\prime})\frac{1}{2}(y-y^{\prime})^{2} l(y,y′)21…...

非springboot 使用aop 切面

在非Spring Boot应用中使用AOP&#xff08;Aspect Oriented Programming&#xff0c;面向切面编程&#xff09;的代码实现需要依赖Spring AOP库。由于Spring AOP库并不直接支持非Spring应用&#xff0c;你需要将Spring AOP库作为依赖项添加到项目中&#xff0c;并使用Spring AO…...

MongoDB 字段中数据类型不一致序列化异常排查与处理

MongoDB 字段中数据类型不一致序列化异常排查与处理 背景如下&#xff0c;因为项目迁移愿意&#xff0c;一个使用Mongodb的业务拥有C#和Java两组Api。Java Api开发和测试都很顺利。上线一段时间后&#xff0c;客服反馈记录都不见了。查看数据库发现&#xff0c;时间字段拥有两…...

网络安全简介

网络安全&#xff1a; ​ 网络安全攻击分为被动攻击和主动攻击。 1. 被动攻击&#xff1a;是指攻击者从网络上窃取了他人的通信内容&#xff0c;通常把这类的攻击称为截获&#xff0c;被动攻击只要有2种形式&#xff1a;消息内容泄漏攻击和流量分析攻击。由于攻击者没…...

【Docker】.NET Core 6.0 webapi 发布上传到Docker Desktop并启动运行访问,接口返回数据乱码解决方法

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Docker容器》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…...

【Android Gradle 插件】自定义 Gradle 插件模块 ⑤ ( 完整总结 )

一、创建自定义插件类型模块 ( Java or Kotlin Library ) 选择 " 菜单栏 / New / New Module… " 选项 , 在 " Create New Module " 对话框中 , 选择 创建 " Java or Kotlin Library " 类型的依赖库 ; 二、手动导入相关依赖 ( Java | Groovy | …...

浅析现代计算机启动流程

文章目录 前言启动流程概述磁盘分区格式MBR磁盘GPT磁盘隐藏分区 传统BIOS引导传统BIOS启动流程 UEFI引导UEFI引导程序UEFI启动流程 引导加载程序启动操作系统相关参考 前言 现代计算机的启动是一个漫长的流程&#xff0c;这个流程中会涉及到各种硬件的配置与交互&#xff0c;包…...

七月论文审稿GPT第2.5和第3版:分别微调GPT3.5、Llama2 13B以扩大对GPT4的优势

前言 自去年7月份我带队成立大模型项目团队以来&#xff0c;我司至今已有5个项目组&#xff0c;其中 第一个项目组的AIGC模特生成系统已经上线在七月官网第二项目组的论文审稿GPT则将在今年3 4月份对外上线发布第三项目组的RAG知识库问答第1版则在春节之前已就绪至于第四、第…...

Android Studio导入项目 下载gradle很慢或连接超时

AS最常见的问题之一就是下载gradle非常慢&#xff0c;还经常出现下载失败的情况&#xff0c;没有gradle就无法build项目&#xff0c;所以一定要先解决gradle的下载问题&#xff0c;下面教大家两种常用方法 手动下载压缩包并替换 1、关闭Android Studio&#xff0c;复制下面的网…...

如何使用VSCode上运行Jupyter,详细案例过程出可视化图

Python作为最受AI喜欢的语言之一&#xff0c;我们与大家共同学习下如何在VS Code上运行Jupyter&#xff0c;并且用简单案例实现出图。 环境 VS Code version: 1.80.1 Python: 3.12.0 小白安装过程&#xff1a; 在准备好基础环境&#xff0c;小白心想&#xff0c;AI可是霸占科…...

Linux中有名管道和无名管道

无名管道基础 进程间通信介绍 常用通信方式 无名管道&#xff08;pipe&#xff09; 有名管道 &#xff08;fifo&#xff09; 信号&#xff08;signal&#xff09; 共享内存(mmap) 套接字&#xff08;socket&#xff09;过时的IPC通信方式 System V IPC 共享内存&#xff08;sh…...

[SWPUCTF 2021 新生赛]easyupload1.0

发现是上传文件第一想到是文件木马 <?php eval ($_POST[123]);?>木马上传burp修改后缀发现flag里面这个是假的 我们猜想是在phpinfo我们上传<?php eval(phpinfo(););?>木马上传burp修改后缀里面 CtrlF 发现flag...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...