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

news2024/11/17 6:21:22

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");
	else
		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] 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.coloradmin.cn/o/1435704.html

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

相关文章

【宝藏系列】嵌入式入门概念大全

【宝藏系列】嵌入式入门概念大全 0️⃣1️⃣操作系统&#xff08;Operating System&#xff0c;OS&#xff09; 是管理计算机硬件与软件资源的系统软件&#xff0c;同时也是计算机系统的内核与基石。操作系统需要处理管理与配置内存、决定系统资源供需的优先次序、控制输入与输…

nvm安装node后,npm无效

类似报这种问题&#xff0c;是因为去github下载npm时下载失败&#xff0c; Please visit https://github.com/npm/cli/releases/tag/v6.14.17 to download npm. 第一种方法&#xff1a;需要复制这里面的地址爬梯子去下载&#xff08;github有时不用梯子能直接下载&#xff0c;有…

百面嵌入式专栏(技能篇)嵌入式技能树详解

沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们将介绍嵌入式重点知识。 一、C语言 C语言这一块的高频考点有预处理、关键字、数据类型、指针与内存管理。 预处理有文件包含、宏定义、条件编译,其中最重要的是宏定义,通常考核宏定义的语法、宏替换与函数的区…

在每个地方都应该添加 memo 吗?

文章概叙 本文主要讲的是React中memo的使用&#xff0c;以及考虑是否使用memo的判断依据 memo介绍 memo 允许你的组件在 props 没有改变的情况下跳过重新渲染。 在使用memo将组件包装起来之后&#xff0c;我们可以‍获得该组件的一个 记忆化 版本。通常情况下&#xff0c;只要…

14.0 Zookeeper环球锁实现原理

全局锁是控制全局系统之间同步访问共享资源的一种方式。 下面介绍zookeeper如何实现全民锁&#xff0c;讲解他锁和共享锁两类全民锁。 排他锁 排他锁&#xff08;Exclusive Locks&#xff09;&#xff0c;又被称为写锁或独占锁&#xff0c;如果事务T1对数据对象O1加上排他锁…

可解释性AI(XAI)的主要实现方法和研究方向

文章目录 每日一句正能量前言主要实现方法可解释模型模型可解释技术 未来研究方向后记 每日一句正能量 当你还不能对自己说今天学到了什么东西时&#xff0c;你就不要去睡觉。 前言 随着人工智能的迅速发展&#xff0c;越来越多的决策和任务交给了AI系统来完成。然而&#xff…

问题:下列关于海关统计项目的表述,正确的有:A.进出境货物的统计重量和数量应以报关单位申报的重量和数 #笔记#职场发展#媒体

问题&#xff1a;下列关于海关统计项目的表述&#xff0c;正确的有&#xff1a;A&#xff0e;进出境货物的统计重量和数量应以报关单位申报的重量和数 下列关于海关统计项目的表述&#xff0c;正确的有&#xff1a; A&#xff0e;进出境货物的统计重量和数量应以报关单位申报的…

【初识爬虫+requests模块】

爬虫又称网络蜘蛛、网络机器人。本质就是程序模拟人使用浏览器访问网站&#xff0c;并将需要的数据抓取下来。爬虫不仅能够使用在搜索引擎领域&#xff0c;在数据分析、商业领域都得到了大规模的应用。 URL 每一个URL指向一个资源&#xff0c;可以是一个html页面&#xff0c;一…

Pandas教程11:关于pd.DataFrame.shift(1)数据下移的示例用法

---------------pandas数据分析集合--------------- Python教程71&#xff1a;学习Pandas中一维数组Series Python教程74&#xff1a;Pandas中DataFrame数据创建方法及缺失值与重复值处理 Pandas数据化分析&#xff0c;DataFrame行列索引数据的选取&#xff0c;增加&#xff0c…

Oracle Vagrant Box 扩展根文件系统

需求 默认的Oracle Database 19c Vagrant Box的磁盘为34GB。 最近在做数据库升级实验&#xff0c;加之导入AWR dump数据&#xff0c;导致空间不够。 因此需要对磁盘进行扩容。 扩容方法1&#xff1a;预先扩容 此方法参考文档Vagrant, how to specify the disk size?。 指…

Postman发送带登录信息的请求

环境&#xff1a;win10Postman10.17.7 假设有个请求是这样的&#xff1a; RequiresPermissions("tool:add") PostMapping(value"/predict") ResponseBody /** * xxx * param seqOrderJson json格式的参数 * return */ public String predictSampleIds(Req…

蓝桥杯省赛无忧 课件125 线段树-标记永久化

前置知识 线段树 01 什么是标记永久化 02 如何标记永久化 03 标记永久化的优势

RabbitMQ-2.SpringAMQP

SpringAMQP 2.SpringAMQP2.1.创建Demo工程2.2.快速入门2.1.1.消息发送2.1.2.消息接收2.1.3.测试 2.3.WorkQueues模型2.2.1.消息发送2.2.2.消息接收2.2.3.测试2.2.4.能者多劳2.2.5.总结 2.4.交换机类型2.5.Fanout交换机2.5.1.声明队列和交换机2.5.2.消息发送2.5.3.消息接收2.5.4…

OpenCV/C++:点线面相关计算(二)

接续&#xff0c;继续更新 OpenCV/C:点线面相关计算_线面相交的点 代码计算-CSDN博客文章浏览阅读1.6k次&#xff0c;点赞2次&#xff0c;收藏12次。OpenCV处理点线面的常用操作_线面相交的点 代码计算https://blog.csdn.net/cd_yourheart/article/details/125626239 目录 1、…

前端工程化之:webpack3-5(css module)

目录 一、css module 1.思路 2.实现原理 3.如何应用样式 4.其他操作 &#xff08;1&#xff09;全局类名 &#xff08;2&#xff09;如何控制最终的类名 5.其他注意事项 一、css module 通过命名规范来限制类名太过死板&#xff0c;而 css in js 虽然足够灵活&…

CleanMyMac X 4.14.7帮您安全清理Mac系统垃圾

CleanMyMac X 4.14.7是一款强大的 Mac 清理、加速工具和健康卫士,可以让您的 Mac 再次恢复巅峰性能。 移除大型和旧文件、卸载应用,并删除浪费磁盘空间的无用数据。 5倍 更多可用磁盘空间 CleanMyMac X 4.14.7帮您安全清理Mac系统垃圾 CleanMyMac X 4.14.7一键深度扫描mac系统…

正点原子-STM32通用定时器学习笔记(1)

1. 通用定时器简介&#xff08;F1为例&#xff09; F1系列通用定时器有4个&#xff0c;TIM2/TIM3/TIM4/TIM5 主要特性&#xff1a; 16位递增、递减、中心对齐计数器&#xff08;计数值&#xff1a;0~65535&#xff09;&#xff1b; 16位预分频器&#xff08;分频系数&#xff…

安装python详细步骤(超详细,保姆级,一步一图)_python 安装

前言 作为一个实用学习的主义的学习者&#xff0c;最关心的问题一定是“我为什么要学习 Python&#xff0c;学会之后我可以用来做什么&#xff1f;” 首先&#xff0c;对于初学者来说&#xff0c;比起其他编程语言&#xff0c;Python更容易上手。 Python 的设计哲学是优雅、明…

C语言:内存函数

创作不易&#xff0c;友友们给个三连吧&#xff01;&#xff01; C语言标准库中有这样一些内存函数&#xff0c;让我们一起学习吧&#xff01;&#xff01; 一、memcpy函数的使用和模拟实现 void * memcpy ( void * destination, const void * source, size_t num ); 1.1 使…

高速接口PCB布局指南(二)通用高速信号布线

高速接口PCB布局指南&#xff08;二&#xff09;通用高速信号布线 1.PCB材料编织2.高速信号布线长度3.高速信号布线长度匹配4.高速信号参考平面 tips&#xff1a;资料主要来自网络&#xff0c;仅供学习使用。 1.PCB材料编织 在常见的 PCB 材料上为差分信号布线时&#xff0c;…