链表 任意位置插入一个节点

 

 

 那么,内存中发生了什么事情呢?

当程序开始执行时,最初将调用main函数,栈中的部分内存被分配用于执行函数。
所有局部变量以及该函数的执行状态都保存在这个特定的区域,我们也将其称为函数的栈帧。
在此main函数中,我们尚未声明任何局部变量,然后我们将对函数insert进行调用。
因此,机器将设置main的执行状态为暂停,并继续执行insert的调用。
进入insert的栈,insert函数有两个局部变量,数据和变量n。
这个栈帧会更大一些,因为我们有几个局部变量。
现在我们创建另一个本地变量,它是指向节点的指针temp1,
然后我们用new运算符在堆中创建一个内存块,temp1最初是指向该储存块的起始地址。
假设此内存块位于地址150,因此temp1储存的地址是150。
当我们使用new或者malloc来请求一些堆上的内存时,
我们并不是通过获取变量名,唯一的访问方法是通过指针变量。
因此head现在指向了这里,因为它像temp1一样储存了地址150在第一个插入请求中,
此后我们将Return,insert的执行将完成,现在控制将返回到main函数。
随后我们将用不同的参数再次调用insert,把数字3插入位置2过程中,
我们将再次为特定的insert调用分配栈帧中的内存,栈帧分配对应于特定的调用。
因此每次函数执行完成的时候,所有局部变量都会从栈内存释放。
现在在此调用中,我们再次创建一个新节点,我们最初将地址保存在此临时变量temp1中,
假设我们这次在地址100处获得此node。
现在n不等于1,我们将继续创建另一个临时变量temp2。
但是我们不再创建新节点,并将地址储存在temp2中,
temp2最初等于head,所以我们储存地址150。
因此,我们最初让他指向头节点,现在我们要运行此循环,并希望继续前进到下一个节点,
直到到达第n- 1个节点,在这种情况下n=2,因此此循环一次也不会执行该语句,
第n- 1个节点是第一个节点本身。现在我们执行下面这两行,
temp1 ->next = temp2 ->next;重置后为零
temp2 ->next = temp1;建立链接
现在对insert的调用将完成,因此我们回到main函数。
这也是其他调用也会发生的方式,插入所有内容后,
main函数到达Print函数,执行print,然后再次在print函数中使用临时变量,最后结束。
//任意位置插入一个节点
#include<stdlib.h>
#include<stdio.h>
struct Node{
	int data;
	struct Node* next;
}; 
struct Node* head;
void Insert(int data,int n){
	Node* temp1=new Node(); 
	//等同于struct Node* temp1=(struct Node*)malloc(sizeof(struct Node*));
	temp1->data =data;
	temp1->next =NULL;
	if(n==1){
		temp1->next =head;
		head=temp1;
		//不管现在头部是什么 调整此变量以指向新的头部 
		return; 
	}
	//对于其他情况,我们首先要转到第n-1个节点 
	Node* temp2= head;//创建一个指向节点的指针 命名为temp2 
	//从头开始 运行一个循环并到达第n-1个节点 
	for(int i=0;i<n-2;i++){
		temp2=temp2->next;
	}
	temp1->next =temp2->next;//把新节点的链接字段设置为 n-1个节点的链接字段 
	temp2->next =temp1;//调整第n-1个节点指向新创建的节点 
}
void Print(){
	Node* temp=head;
	while(temp !=NULL){
		printf("%d ",temp->data ); 
		temp=temp->next ; 
	} 
	printf("\n");
}

int main(){
	head=NULL;//空链表 
	Insert(2,1);//list:2
	Insert(3,2);//list:2,3
	Insert(4,1);//list:4,2,3
	Insert(5,2);//list:4,5,2,3
	Print();
}

 

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

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

相关文章

【FreeRTOS基础入门】软件定时器

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、软件定时器的介绍1.1 软件定时器的特性1.2 软件定时器的特性1.3 守护任务 二、软件定时器的使用2.1 回调函数2.2 创建定时器创建动态定时器创建静态定时器 …

快速搭建网站流程

快速搭建网站流程 1、购买服务器 国内网服务器都可以、国内的腾讯云和阿里云操作什么都差不多&#xff0c; 目前腾讯云服务器举例、买个轻量级服务器或者云服务器都行。然后我们后续会通过宝塔面板进行操作&#xff0c;系统以centos 举例。 或者选第二个 2、通过SSH登录到…

Python环境无缝移植,拷贝到其他机器也能使用

1.前景 下载&#xff1a;Python版本下载 对于Python原生环境来说&#xff0c;假设读者各位&#xff0c;安装了一个Python环境&#xff0c;环境变量&#xff0c;路径&#xff0c;都是安装包自动配好的。 相信大家有的人是单机开发或者有其他需求&#xff0c;就会发现&#xff…

Hudi程序导致集群RPC偏高问题分析

1、背景 Hudi程序中upsert操作频繁&#xff0c;过多的删除和回滚操作,导致集群RPC持续偏高 2、描述 hudi采用的是mvcc设计&#xff0c;提供了清理工具cleaner来把旧版本的文件分片删除&#xff0c;默认开启了清理功能&#xff0c;可以防止文件系统的存储空间和文件数量的无限…

Selenium安装与配置

文章目录 一、selenium安装1. Python环境准备&#xff1a;2. 安装Selenium&#xff1a;3. 浏览器驱动安装&#xff1a;4. 验证安装&#xff1a; 二、常见问题1. Selenium版本与浏览器驱动程序不兼容&#xff1a;2. 浏览器驱动程序路径未正确设置&#xff1a; Selenium是一个用于…

k8s(3)

目录 一.K8S的三种网络 flannel的三种模式: 在 node01 节点上操作&#xff1a; calico的 三种模式&#xff1a; flannel 与 calico 的区别&#xff1f; 二.CoreDNS 在所有 node 节点上操作&#xff1a; 在 master01 节点上操作&#xff1a; ​编辑 DNS 解析测试&#…

在苹果电脑MAC上安装Windows10(双系统安装的详细图文步骤教程)

在苹果电脑MAC上安装Windows10&#xff08;双系统安装的详细图文步骤教程&#xff09; 一、准备工作准备项1&#xff1a;U盘作为系统安装盘准备项2&#xff1a;您需要安装的系统镜像 二、启动转换助理步骤1&#xff1a;找到启动转换助理步骤2&#xff1a;启动转换助理步骤3&…

SpringCloud Nacos安装

1. Nacos的下载&#xff1a;下载的是1.4的版本。 2. Nacos的安装&#xff1a; startup.cmd -m standalone 以单机模式启动Nacos。 登录的账号密码 都是nacos。

vCenter、vSphere Client硬盘扩容详解

文章目录 1、需求2、vSphere 操作流程3、服务器操作3.1、查看分区空间大小3.2、列出所有可用块设备的信息3.3、新建分区3.4、重读分区表信息3.5、格式化分区信息3.6、查看卷组的详细状态3.7、创建物理卷3.8、扩容卷组3.9、逻辑卷在线扩容3.10、显示物理卷属性3.11、XFS 文件系统…

调用 Python 函数遗漏括号 ( )

调用 Python 函数遗漏括号 1. Example - error2. Example - correctionReferences 1. Example - error name "Forever Strong" print(name.upper()) print(name.lower)FOREVER STRONG <built-in method lower of str object at 0x0000000002310670>---------…

CSS浮动与定位

行内元素和块级元素的区别&#xff1a;&#xff08;非常重要&#xff09; 行内元素&#xff1a; 与其他行内元素并排&#xff1b;不能设置宽、高。默认的宽度&#xff0c;就是文字的宽度。 块级元素&#xff1a; 霸占一行&#xff0c;不能与其他任何元素并列&#xff1b;能…

Jmeter基础(2) 目录介绍

目录 Jmeter目录介绍bin目录docsextrasliblicensesprintable_docs Jmeter目录介绍 在学习Jmeter之前&#xff0c;需要先对工具的目录有些了解&#xff0c;也会方便后续的学习 bin目录 examplesCSV目录中有CSV样例jmeter.batwindow 启动文件jmeter.shMac/linux的启动文件jmete…

MES管理系统的实施原则以及规划方向

在实施MES管理系统时&#xff0c;为确保项目的成功&#xff0c;有几个核心要素和策略需要重点关注。MES系统作为制造业的关键信息系统&#xff0c;对于提升生产效率、优化生产流程具有至关重要的作用。 一、系统规划与分布实施 首先&#xff0c;我们需要制定一个全面且灵活的系…

常见锁策略,CAS,synchrodized原理讲解

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 常见锁策略 乐观锁和悲观锁 轻量级锁和重量级锁 自旋锁和挂起等待锁 读写锁 公平锁和非公平锁…

六、回归与聚类算法 - K-means算法

目录 1、K-means 聚类步骤 2、API 3、案例 4、性能评估指标 5、总结 线性回归欠拟合与过拟合线性回归的改进 - 岭回归分类算法&#xff1a;逻辑回归模型保存与加载无监督学习&#xff1a;K-means算法 1、K-means 聚类步骤 2、API 3、案例 4、性能评估指标 5、总结

电气机械5G智能工厂数字孪生可视化平台,推进电气机械行业数字化转型

电气机械5G智能工厂数字孪生可视化平台&#xff0c;推进电气机械行业数字化转型。随着科技的不断发展&#xff0c;数字化转型已经成为各行各业发展的重要趋势。电气机械行业作为传统制造业的重要组成部分&#xff0c;也面临着数字化转型的挑战和机遇。为了更好地推进电气机械行…

学习JAVA的第三天(基础)

目录 流程控制语句 顺序结构 分支结构 循环结构 分类&#xff1a; 练习 跳转控制语句 练习 数组 数组介绍 数组的定义和静态初始化 数组定义 数组的静态初始化 数组元素访问 数组遍历 数组动态初始化 JAVA内存分配 流程控制语句 顺序结构 是Java程序默认的执行流程…

算法——模拟

1. 什么是模拟算法&#xff1f; 官方一点来说 模拟算法&#xff08;Simulation Algorithm&#xff09;是一种通过模拟现实或抽象系统的运行过程来研究、分析或解决问题的方法。它通常涉及创建一个模型&#xff0c;模拟系统中的各种事件和过程&#xff0c;以便观察系统的行为&a…

【Java程序设计】【C00296】基于Springboot的4S车辆管理系统(有论文)

基于Springboot的4S车辆管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的4S店车辆管理系统 本系统分为销售员功能模块、管理员功能模块以及维修员功能模块。 管理员功能模块&#xff1a;管理员登录进入4S…

Apache Flink连载(三十三):Flink基于Kubernetes部署(3)-Kubernetes 核心概念

🏡 个人主页:IT贫道-CSDN博客 🚩 私聊博主:私聊博主加WX好友,获取更多资料哦~ 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 1. Pod 2. Label