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

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.mfbz.cn/a/373387.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

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…

文件夹正在使用无法删除(重命名)解决办法

1、问题描述 相信都遇到文件夹无法删除&#xff0c;或者无法重命名的情况。如果将文件夹正在使用的文件都已经关闭后&#xff0c;文件夹仍旧无法删除或重命名。 这个时候大概率是有隐藏的进程没有关闭&#xff0c;可以重启电脑&#xff0c;或者采用下面的方式关闭对应文件夹的…

小白水平理解面试经典题目LeetCode 20. Valid Parentheses【栈】

20.有效括号 小白渣翻译 给定一个仅包含字符 ‘(’ 、 ‘)’ 、 ‘{’ 、 ‘}’ 、 ‘[’ 和 ‘]’ &#xff0c;判断输入字符串是否有效。 输入字符串在以下情况下有效&#xff1a; 左括号必须由相同类型的括号封闭。 左括号必须按正确的顺序关闭。 每个右括号都有一个对…

vscode 突然连接不上服务器了(2024年版本 自动更新从1.85-1.86)

vscode日志 ll192.168.103.5s password:]0;C:\WINDOWS\System32\cmd.exe [17:09:16.886] Got some output, clearing connection timeout [17:09:16.887] Showing password prompt [17:09:19.688] Got password response [17:09:19.688] "install" wrote data to te…

uniapp踩坑之项目:简易版不同角色显示不一样的tabbar和页面

1. pages下创建三个不同用户身份的“我的”页面。 显示第几个tabbar&#xff0c;0是管理员 1是财务 2是司机 2. 在uni_modules文件夹创建底部导航cc-myTabbar文件夹&#xff0c;在cc-myTabbar文件夹创建components文件夹&#xff0c;在components文件夹创建cc-myTabbar.vue组件…

【机器学习】机器学习简单入门

&#x1f388;个人主页&#xff1a;甜美的江 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;matplotlib &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

【高质量精品】2024美赛C题高质量成品论文分享获取入口(后续会更新)

一定要点击文末的卡片&#xff0c;进入后&#xff0c;即可获取完整论文&#xff01;&#xff01; 首先&#xff0c;我们需要对缺失的 speed_mph 进行插补。缺失值处理是数据预处理的 重要环节之一。可以采用均值、中位数或者根据其他相关特征进行预测的方法来 填补缺失值。在这…

Packet Tracer - Configure IOS Intrusion Prevention System (IPS) Using the CLI

Packet Tracer - 使用CLI配置IOS入侵防御系统&#xff08;IPS&#xff09; 地址表 目标 启用IOS入侵防御系统&#xff08;IPS&#xff09;。 配置日志记录功能。 修改IPS签名规则。 验证IPS配置。 背景/场景 您的任务是在R1上启用IPS&#xff0c;扫描进入192.168.1.0网络…

Unity3d Cinemachine篇(完)— TargetGroup

文章目录 前言使用TargetGroup追随多个模型1. 创建二个游戏物体2. 创建TargetGroup相机3. 设置相机4. 完成 前言 上一期我们简单的使用了ClearShot相机&#xff0c;这次我们来使用一下TargetGroup 使用TargetGroup追随多个模型 1. 创建二个游戏物体 2. 创建TargetGroup相机 3…

刚刚晋升为管理者,还不会如何管理团队?你要重点关注这9个策略

管理团队需要明确团队目标、提前要求承诺、明确组织架构、团队高效协作、洞察员工、引入敏捷、执行可视化、及时反馈和复盘优化。 这样管理团队可以极大提高团队组织能力。团队组织能力强大的话&#xff0c;团队成员是可以实现自我管理的&#xff0c;会自我驱动去完成目标和执…

2024.2.5 vscode连不上虚拟机,始终waiting for server log

昨天还好好的&#xff0c;吃着火锅&#xff0c;做着毕设&#xff0c;突然就被vscode给劫了。 起初&#xff0c;哥们跟着网上教程有模有样地删除了安装包缓存&#xff0c;还删除了.vscode-server&#xff0c;发现没卵用&#xff0c;之前都是搜那个弹窗报错。 后来发现原来是vsco…

SpringBoot 全局异常处理

介绍 如果代码没有做异常处理&#xff0c;就会报框架错误&#xff0c;而这种格式不符合REST风格&#xff0c;也可以在每一个接口添加 try{ } catch { } 捕获异常&#xff0c;但是会非常的繁琐&#xff0c;这时候可以使用全局异常处理。 统一响应类 Data NoArgsConstructor …

掌握Linux du命令:高效查看文件和目录大小

今天我们在生产环境中的服务器上收到了有关/var磁盘目录使用率较高的警报。为了解决这一问题&#xff0c;我们进行了/var目录下一些大文件的清理和转移操作。在查找那些占用磁盘空间较多的文件时&#xff0c;我们频繁使用了du命令。在Linux系统中&#xff0c;du命令是一款功能强…

5G智能卷烟工厂数字孪生可视化平台,推进烟草行业数字化转型

5G智能卷烟工厂数字孪生可视化平台&#xff0c;推进烟草行业数字化转型。随着5G技术的不断发展&#xff0c;智能卷烟工厂数字孪生可视化平台成为了推进烟草行业数字化转型的重要手段。该平台将5G技术与数字孪生技术相结合&#xff0c;实现了对卷烟生产全过程的实时监控、数据分…

Springboot启动出现Waiting for changelog lock...问题

今天在开发的时候&#xff0c;Springboot启动的时候出现Waiting for changelog lock…问题. 问题原因&#xff1a;该问题就是发生了数据库的死锁问题&#xff0c;可能是由于一个杀死的liquibase进程没有释放它对DATABASECHANGELOGLOCK表的锁定&#xff0c;导致服务启动失败&…

Allegro如何把Symbols,shapes,vias,Clines,Cline segs等多种元素一起移动

Allegro如何把Symbols,shapes,vias,Clines,Cline segs等多种元素一起移动 在用Allegro进行PCB设计时,有时候需要同时移动某个区域的所有元素,如:Symbols,shapes,vias,Clines,Cline segs等元素。那么如何操作呢? 首先就是把Symbols,shapes,vias,Clines,Cline …

Unity笔记:相机移动

基础知识 鼠标输入 在Unity中&#xff0c;开发者在“Edit” > “Project Settings” > “Input Manager”中设置输入&#xff0c;如下图所示&#xff1a; 在设置了Mouse X后&#xff0c;Input.GetAxis("Mouse X")返回的是鼠标在X轴上的增量值。这意味着它会…

arm 汇编积累

C语言函数与汇编对应关系 一、MOV 系列指令 1、指令格式 MOV{条件}{S} 目的寄存器&#xff0c;源操作数 2、含义解析&#xff1a; &#xff08;1&#xff09;&#xff1a;mov 指令传送数据 案例&#xff1a; MOV R0,R1 ; R0 R1; MOV PC,R14 ;PC R14; MOV R0,R…

大型语言模型(LLM)的优势、劣势和风险

最近关于大型语言模型的奇迹&#xff08;&#xff09;已经说了很多LLMs。这些荣誉大多是当之无愧的。让 ChatGPT 描述广义相对论&#xff0c;你会得到一个非常好&#xff08;且准确&#xff09;的答案。然而&#xff0c;归根结底&#xff0c;ChatGPT 仍然是一个盲目执行其指令集…

N-143基于springboot博客系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 前端技术&#xff1a;AdminLTEHTML 服务端技术&#xff1a;springbootmybatis-plusthymeleaf 本项目分前台和后台&#xff0c;主要有普…
最新文章