关于递归函数,非递归函数中引用传参的问题

首先 我们来看这个函数

typedef int Ele;
typedef struct list{Ele data;list *next;	
}List,*LNode;
void dele2(LNode &l,Ele e){if(l==NULL)return;printf("Hello!!\n");printf("to %d\n",l);if(l->data==e){LNode p = l;l = l->next;//***free(p);dele2(l,e);}else dele2(l->next,e);printf("back %d\n",l);
}

这个函数就是将链表中所有为x的节点全部删除的操作

但是传参的时候传入的是一个指向链表节点指针的引用类型 也就是说在其中打***的地方 

不会因为没有把前面的节点链接到后面而导致断链 相反

这里的l = l->next 是把当前节点的地址指向了后面

比如对于1 3 1这个链表 删除3操作

第一次走到1 那么递归层数加1时 调用dele2(l->next,e); 相当于(*l).next 将该指针所指向的next域的值

取出来并付给更深一层的参数 也就是引用指针&l 那么在此时在删除3时

会触发***处的操作 那么这里的操作实质上是 (*l).next = (*(*l).next).next

就相当于直接在1节点的next值修改成了 最后一个节点的地址 也就是相当于整个递归过程中对引用指针的操作其实就是对原表

操作

那么引用就是这样

在递归调用的时候 可以直接对原表操作 而且无视可能的断链情况

 

再来看一个函数


void delehead(LNode &p,Ele x){while(p!=NULL){		if(p->data == x){LNode q = p;p = p->next;//	pre->next = p;free(q);}else {//	pre = p;p = p->next;			}}
}

相同的操作 就是把递归改成非递归了 相同的是引用 但是这种情况下 就会导致断链

因为当在递归中使用引用的过程时 递归结束时会把一层层加上的取值操作符再把取值操作符一层层摘掉

而这里却是让p不断指向next 指到最后变成空 因为这里没有递归函数中返回的操作

1 3 1中执行结束的时候 递归不断返回后 原指针指向的是首节点 

而非递归中由于没有返回操作 会不断地让头指针所指向的值一直向后走 最后使头指针

指到最后的NULL处

所以应另外使用指针非指针引用 这样不会修改原表的地址 并且附加前后链接操作

如果为了防止首元素删除导致头指针找不到首节点 应该另外设置头结点 或者 用计数另外记录下修改后头指针

应指向的位置 所以应改为

void delehead(LNode &l,Ele x){// l指向头结点LNode p = l->next,pre = l;// p指向头节点的后继节点 pre指向头节点 // no head nodewhile(p!=NULL){		if(p->data == x){LNode q = p;p = p->next;pre->next = p;free(q);}else {pre = p;p = p->next;			}}
}

这样就处理了非递归情况下对链表中删除任意位置值为x的操作 如果这里用头指针的单链表

会可能导致由于第一个节点的释放从而头指针指向了一个释放内存的地址

 

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

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

相关文章

请让蝴蝶爬满全身

请。转载于:https://www.cnblogs.com/SINXIII/p/10657726.html

第二十四期:揭秘:为什么电脑越用越卡 大型破案现场

今天谈一个大家都好奇地问题,为什么电脑越来越卡,相信大家都深有体会,好好的电脑刚买的时候像火箭,现在怎么就支棱不起来了呢,是老了么? 今天谈一个大家都好奇地问题,为什么电脑越来越卡,相信大…

[Leetcode]第[43]题[JAVA][字符串相乘][字符串相加]

【问题描述】[中等] 【解答思路】 1. 普通竖式 **复杂度:O(N^2) ** class Solution {/*** 计算形式* num1* x num2* ------* result*/public String multiply(String num1, String num2) {if (num1.equals("0") || num2.equals("0")) …

JSP中使用iframe导致内层网页CSS失效问题的解决方案

jsp中使用<iframe>&#xff0c;由于CSS层级问题 导致外层主页面的CSS对<iframe>中的控件无效... 解决方案&#xff1a; &#xff08;1&#xff09;用<jsp:include>啊&#xff0c;CSS不失效&#xff0c;哈哈哈哈 &#xff08;2&#xff09;把CSS引用路…

第七期:详解JavaScript运行机制(Event Loop)

在浏览器中,每个渲染进程都有一个主线程,主线程非常繁忙&#xff0c;既要处理DOM&#xff0c;又要计算样式&#xff0c;还要处理布局&#xff0c;同时还需要处理JavaScript任务以及各种输入事件。此时我们就需要一个系统来统筹调度这么多不同类型的任务在主线程中有条不紊地执行…

Spring框架 JdbcTemplate类 @Junit单元测试,可以让方法独立执行 如:@Test

1 package cn.zmh.PingCe;2 3 import org.junit.Test;4 import org.springframework.jdbc.core.BeanPropertyRowMapper;5 import org.springframework.jdbc.core.JdbcTemplate;6 7 import java.util.List;8 import java.util.Map;9 /** 10 * Spring框架 JdbcTemplate类 11 …

[剑指offer]面试题第[45]题[JAVA][把数组排成最小的数][快排][ Comparator][PriorityQueue]

【问题描述】[中等] 【解答思路】 1. 快速排序 时间复杂度&#xff1a;O(N^2) 空间复杂度&#xff1a;O(1) class Solution {public String minNumber(int[] nums) {String[] strs new String[nums.length];for(int i 0; i < nums.length; i)strs[i] String.valueOf(num…

div覆盖div DIV相互重叠如何解决

转载出处&#xff1a;http://www.divcss5.com/rumen/r674.shtml div覆盖div,出现div与div盒子之间产生重叠覆盖现象&#xff0c;而内容没有出现覆盖重叠现象原因与解决方法。DIVCSS5通过CSS图文案例介绍产生原因与解决方法。DIV与DIV覆盖原因与解决方法。 可能您遇到过上下结…

第二十五期:5G预约用户超千万!是“虚火”还是“真旺”?

十一假期刚过&#xff0c;“中国5G套餐预约数已超千万”的消息就迅速在朋友圈刷屏&#xff0c;这一庞大的数字背后&#xff0c;也引发了业界关于5G市场的种种思考和担忧&#xff1a;预约热闹过后真正的5G用户会有多少?暂时不选择5G的用户有何顾虑? 十一假期刚过&#xff0c;“…

oracle索引

简介 1.说明 1&#xff09;索引是数据库对象之一&#xff0c;用于加快数据的检索&#xff0c;类似于书籍的索引。在数据库中索引可以减少数据库程序查询结果时需要读取的数据量&#xff0c;类似于在书籍中我们利用索引可以不用翻阅整本书即可找到想要的信息。 2&#xff09;索引…

第八期:实操:两台路由器,如何分别通过WAN和LAN口连接?

两个路由器在一个网段内IP地址是一样的&#xff0c;两个路由器连接有两个DHCP服务器共同工作所以IP会产生冲突。下面我们来一起看下分别通过WAN口和LAN口怎么连接。 两个路由器在一个网段内IP地址是一样的&#xff0c;两个路由器连接有两个DHCP服务器共同工作所以IP会产生冲突。…

cognos10 安装部署

由于工作的原因&#xff0c;今天需要安装下cognos10&#xff0c;由于以前没有接触过IBM的这个产品&#xff0c;因此付出了一天时间的惨痛代价&#xff0c;写这篇文章的目的就是对cognos10的初学者安装部署时能少走弯路&#xff0c;各位cognos的大侠请多批评和指教&#xff0c;不…

GPLT2017题目

阅览室: L1-043. 阅览室 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 天梯图书阅览室请你编写一个简单的图书借阅统计程序。当读者借书时&#xff0c;管理员输入书号并按下S键&#xff0c;程序开始计时&#xff1b;当读者还书时&#…

Spring各jar包的作用(转载)

spring.jar是包含有完整发布的单个jar 包&#xff0c;spring.jar中包含除了spring-mock.jar里所包含的内容外其它所有jar包的内容&#xff0c;因为只有在开发环境下才会用到 spring-mock.jar来进行辅助测试&#xff0c;正式应用系统中是用不得这些类的。 除了spring.jar文件&am…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第15篇]RSA-OAEP和ECIES的密钥生成,加密和解密

这是一系列博客文章中最新的一篇&#xff0c;该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇总是为了让博士生们在第一年结束时知道些什么。通过描述RSA-OAEP和ECIES的密钥生成、加密和解密算法&#xff0c;我们回到了"more crypto" staff …

第二十六期:HTTP 3的前世今生及尝鲜

HTTP/3又迎来一个里程碑&#xff1a;近日Cloudflare官方宣其边缘网络上已全面提供QUIC和HTTP/3支持。那么HTTP/3可以带来哪些变化和优势呢? 对Internet的用户&#xff0c;并且通过浏览器和其他客户端与站点进行高效交互。 HTTP/3又迎来一个里程碑&#xff1a;近日Cloudflare官…

业务时间做开发,使用jeecg框架

最近想在业余时间做一个项目管理的应用给自己用&#xff0c;但自己业余时间又不多&#xff0c;所以就想找一个不用重复写基本代码&#xff08;例如bean、dao、service、action的增删改查&#xff09;&#xff0c;不用重复写jsp代码。这样&#xff0c;我选择了jeecg。它基本满足…

前端中标签页的手写方法

虽然流行用框架写出来 这里也可以用手写方法写出来 也并不是这么复杂 首先为了实现如下效果的标签 我们可以在前端把两个表直接输出出来 <table class "tag char" id "tagf" ><tr><td>Found</td><td>Found time</td&…

Redis中的执行命令的过程

在redis.c的initServerConfig()方法中&#xff0c;通过调用dictCreate方法初始化server端的命令表。这个命令表是一个hashtable,可以通过key找到相关的命令&#xff1a; /* Command table -- we initiialize it here as it is part of the* initial configuration, since comma…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第16篇]描述DSA、Schnorr和RSA-FDH的密钥生成、签名和验证算法。

这是一系列博客文章中最新的一篇&#xff0c;文章的主题是“做密码学每个博士生都应该知道的52件事”。这一系列问题是为了让博士生们在第一年结束时了解他们应该知道的事情。本周我们将介绍DSA、Schnorr和RSA-FDH的密钥生成、签名和验证算法。 1.DSA 2.Schnorr 3.RSA-FDH Refe…