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

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.请简述什么内存泄露?

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

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

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

相关文章

Python进阶--爬取下载人生格言(基于格言网的Python3爬虫)

目录 一、此处需要安装第三方库: 二、抓包分析及Python代码 1、打开人生格言网&#xff08;人生格言-人生格言大全_格言网&#xff09;进行抓包分析 2、请求模块的代码 3、抓包分析人生格言界面 4、获取各种类型的人生格言链接 5、获取下一页的链接 6、获取人生格言的…

【并发编程】手写线程池阻塞队列

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;并发编程 ⛺️稳重求进&#xff0c;晒太阳 示意图 步骤1&#xff1a;自定义任务队列 变量定义 用Deque双端队列来承接任务用ReentrantLock 来做锁并声明两个条件变量 Condition fullWai…

【wu-lazy-cloud-network】Java自动化内网穿透

项目介绍 wu-lazy-cloud-network 是一款基于&#xff08;wu-framework-parent&#xff09;孵化出的项目&#xff0c;内部使用Lazy ORM操作数据库&#xff0c;主要功能是网络穿透&#xff0c;对于没有公网IP的服务进行公网IP映射 使用环境JDK17 Spring Boot 3.0.2 功能 1.内网…

办公软件巨头CCED、WPS面临新考验,新款办公软件异军突起

办公软件巨头CCED、WPS的成长经历 众所周知&#xff0c;CCED和WPS在中国办公软件领域树立了两大知名品牌的地位。然而&#xff0c;它们的成功并非一朝一夕的成就&#xff0c;而是历经了长时间的发展与积淀。 在上世纪80年代末至90年代初&#xff0c;CCED作为中国大陆早期的一款…

Unity 接口、抽象类、具体类对象的配合使用案例

文章目录 示例1&#xff1a;接口&#xff08;Interface&#xff09;示例2&#xff1a;抽象类&#xff08;Abstract Class&#xff09;示例3&#xff1a;结合使用接口与抽象类示例4&#xff1a;多接口实现示例5&#xff1a;抽象类与接口结合 在Unity中使用C#编程时&#xff0c;接…

华为OD机试真题C卷-篇3

文章目录 查找一个有向网络的头节点和尾节点幼儿园篮球游戏 查找一个有向网络的头节点和尾节点 在一个有向图中&#xff0c;有向边用两个整数表示&#xff0c;第一个整数表示起始节点&#xff0c;第二个整数表示终止节点&#xff1b;图中只有一个头节点&#xff0c;一个或者多…

一、SSM 整合理解

本章概要 什么是 SSM 整合&#xff1f;SSM 整合核心问题明确 SSM 整合需要几个 IoC 容器&#xff1f;每个 IoC 容器对应哪些类型组件&#xff1f;IoC 容器之间关系和调用方向&#xff1f;具体多少配置类以及对应容器关系&#xff1f;IoC 初始化方式和配置位置&#xff1f; 1…

用甘特图有效管理多个项目进度

当公司或组织同时承担多个项目时,合理规划各项目的时间节点与资源分配对确保高效完成至关重要。采用甘特图可以直观地展示多个项目的时间进程、关键里程碑以及资源分配情况,便于从宏观层面全面把控各项目的动态。 在线甘特图软件 zz-plan.com 提供了非常强大的时间轴规划功能,支…

Xampp中Xdebug的安装使用

工欲善其事&#xff0c;必先利其器 XDebug简介 XDebug 是一个用于 PHP 的调试和性能分析工具。它提供了一系列功能&#xff0c;帮助开发者在开发和调试 PHP 应用程序时更加高效。 以下是 XDebug 的一些主要特性和功能&#xff1a; 调试功能&#xff1a; 断点调试&#xff1a;…

基础面试题整理7之Redis

1.redis持久化RDB、AOF RDB(Redis database) 在当前redis目录下生成一个dump.rdb文件&#xff0c;对redis数据进行备份 常用save、bgsave命令进行数据备份&#xff1a; save命令会阻塞其他redis命令&#xff0c;不会消耗额外的内存&#xff0c;与IO线程同步&#xff1b;bgsav…

MySql索引分类

目录 第一章、按数据结构分类1.1&#xff09;树型数据结构索引1.2&#xff09;Hash数据结构索引1.3&#xff09; 其他数据结构索引 第二章、按物理存储方式分类2.1&#xff09;聚簇索引&#xff08;聚集索引&#xff09;2.2&#xff09;非聚簇索引&#xff08;非聚集索引&#…

Blender教程(基础)-顶点的移动、滑移-16

一、顶点的移动与缩放 ShiftA新建柱体、切换到编辑模式 点模式下&#xff0c;选择一个顶点、选择移动&#xff08;GZ&#xff09;&#xff0c;发现顶点严Z轴移动&#xff0c;如下图所示 GY 按数字键盘7切换视图&#xff0c;选择这个面的所有顶点 按S把面缩放大 Ctrl…

【大模型上下文长度扩展】FlashAttention-2:比1代加速1.29倍、GPU利用率从55%上升到72%

FlashAttention-2 提出背景FlashAttention-2 改进 前向传播和反向传播对比FlashAttention前向传播FlashAttention反向传播FlashAttention-2前向传播FlashAttention-2反向传播FlashAttention-2并行性线程束之间的工作分区 总结FlashAttentionFlashAttention-2 论文&#xff1a;h…

Typora导出html文件图片自动转换成base64

Typora导出html文件图片自动转换成base64 一、出现问题二、解决方案三、编码实现3.1.创建Java项目3.2.代码3.3.打包成Jar包 四、如何使用endl 一、出现问题 typora 导出 html 的时候必须带有原图片&#xff0c;不方便交流学习&#xff0c;文件太多显得冗余&#xff0c;只有将图…

Golang GC 介绍

文章目录 0.前言1.发展史2.并发三色标记清除和混合写屏障2.1 三色标记2.2 并发标记问题2.3 屏障机制Dijkstra 插入写屏障Yuasa 删除写屏障混合写屏障 3.GC 过程4.GC 触发时机5.哪里记录了对象的三色状态&#xff1f;6.如何观察 GC&#xff1f;方式1&#xff1a;GODEBUGgctrace1…

鸿蒙OS导入项目报错不能运行 @ohos\hvigor\bin\hvigor.js‘

在自学HarmonyOS时&#xff0c;想在DevEco Studio导入官方示例代码&#xff1a;待办列表&#xff08;ArkTS&#xff09;报错 C:\Users\woods\Downloads\test01\ToDoListArkTS\node_modules\ohos\hvigor\bin\hvigor.js --mode module -p moduleentrydefault -p productdefault …

开源软件:引领技术创新、商业模式与安全的融合

序 在信息技术日新月异的今天&#xff0c;开源软件以其独特的魅力和影响力&#xff0c;正逐渐成为软件产业的新常态。开源软件的低成本、高度可协作性和透明度等特点&#xff0c;不仅吸引了无数企业和个人用户的青睐&#xff0c;更为软件行业带来了前所未有的繁荣景象。 一、…

【C++】构造函数、初始化列表,析构函数,拷贝构造函数,运算符重载

注&#xff1a;本博客图片来源于学习笔记: 学习笔记https://gitee.com/box-he-he/learning-notes 完整思维导图请前往该博主码云下载。 目录 注&#xff1a;本博客图片来源于学习笔记: 学习笔记https://gitee.com/box-he-he/learning-notes 完整思维导图请前往该博主码云下载…

微信小程序(三十六)事件传参

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.传参步骤 2.传参接收解构步骤 源码&#xff1a; index.wxml <button type"primary" bind:tap"onclick" mark:index"{{0}}" mark:remb"{{1}}" class"But&quo…

我的QQ编程学习群

欢迎大家加入我的QQ编程学习群。 群号:950365002 群里面有许多的大学生大佬&#xff0c;有编程上的疑惑可以随时问&#xff0c;也可以聊一些休闲的东西。 热烈欢迎大家加入&#xff01;&#xff01; 上限:150人。