- 博客(56)
- 收藏
- 关注
原创 Bean的生命周期
其中初始化其中有多个步骤也是其中最复杂的步骤,这一阶段包含了各种通知 BeanNameAware , BeanFactoryAware ,ApplicationContextAware 的接⼝⽅法.以及执行的初始化方法 xml定义 init-method,使⽤注解的⽅式 @PostConstruct,执⾏初始化后置⽅法( BeanPostProcessor )。在学习Bean的生命周期前,我们要先了解,生命周期是什么,简单来讲Bean的生命周期就是Bean从创建到销毁的整个过程就叫做Bean的生命周期。
2024-12-10 11:11:24
632
原创 Bean的作用域
这就意味着不同的请求,相同的Bean会是不同的实例。Session 作用域:想必对于Session大家都非常熟悉了,简单来说就是一个Spring容器会在HTTP绘画中,创建并维护一个Bean实例,每当用户发送新的会话时,Spring就会创建一个新的bean,我们可以不同的浏览器实现这一现象。这分别是两次不同的结果,我们可以看到,这两次云街道结果中从Context中拿到的数据并不相同, 由此我们就可以看到,每一次实例Bean都会创建一个新的实例,而原生的bean只会创建一次。
2024-12-09 11:21:48
543
原创 Spring AOP
假如有一个场景由于程序运行的时间有些长我们要查找是哪部分所小号的时间比较长,我们就可以使用AOP思想来进行实现,如果我们不适用AOP仅仅在想要测试的方法中逐个计算时间,那是不是非常的麻烦。AOP是一种面相切面的编程,我们之前所学到到拦截器就是AOP的实现,AOP是一种思想,而拦截器是AOP思想的一种实现,就简单来说AOP是对某一类问题的统一处理。我们可以看到其中所有的方法都备执行了,但是似乎顺序有所不同,如果我们没有指定顺序的话,那么这几类通知按照默认字典序进行先后执行的,后续我们会讲到如何设置优先级。
2024-11-28 13:41:01
614
原创 Bean的命名和获取
Spring是一种IOC容器,当我们使用这些类注解,将相当于把这些类交给了Spring进行管理,在以前的学习中如果我们不加一些注解就无法在Spring运行的时候再前端找到一些端口。接下来我们来介绍这些注解的使用,由于这四种注解在将bean放入IOC容器中的作用是一致的并且使用方法也大差不差因此我们在这里值单独的介绍其中的一个即可。当我们使用@Bean时我们会发现我们根本获取不到,这是因为@Bean(方法注解)必须要配合类注解一起使用,才可以生效。通过此处我们就可以看到我们成功的取出了User对象。
2024-10-26 20:08:33
936
1
原创 SpringMVC常用注解
通过@ResttController的底层代码 可以看到,@RestController是@Controller的一个子接口,而相较于@Controller多了一个@ResponseBody,这个注解的主要作用就是是否以数据的形式传输,如果加上了这个注解,那么返回给前端的数据就以数据的形式传输,而无法进行跳转页面也就是“返回静态页面”,我们需要同时分别使用@Controller和@ResponseBody才可以传输数据。
2024-10-23 13:47:21
1126
原创 CSS常见选择器
在刚刚学习CSS时我们会了解标签之间的父子关系,例如 u1 li{ color: red}在这里如果li是u1的后代成立,那么在u1下的li标签将会变成红色,在这里只要是后代就可以儿子可以儿子的儿子也可以。使用类选择器是需要再标签中写入class属性这样的操作也可以理解为在指定的标签做上记号以进行操作,需要特别注意的是class在可以在不同的标签中重复使用,一旦重复使用那么对该类进行样式的改变时会全部生效,先声明一个id属性 但是与类选择器不同的是这的id是唯一的,不能对个标签使用。
2024-10-15 09:51:00
458
原创 JVM垃圾回收机制
当我们创建新的类是这个类会出现在新生代中也就是新的类,这块内存是比较大的,根据我们的经验可知,大部分的类都活不过GC,因此保留下来的部分比较少,并且经过GC后会将这些幸存下来的列复制到幸存区中,前面提到幸存区有两部分,在这两部分中也会进行GC这两部分会进行上面讲述的复制算法这两部分会循环的进行这一操作,直到可达性分析达到一定次数之后,会认为这些剩余的类是会长期幸存的,之后会将这些类拷贝到老年区,在老年区中也会进行GC但是GC的频率会减低,因为在老年区中的类默认是会长期幸存的,这样还可以节省一些资源。
2024-10-01 12:29:58
811
原创 JVM类加载过程
至于双亲委派模型为什么要这么做,那是因为程序员也不可能完全知道java标准库中有哪些类,类的名称是啥,因此很有可能程序员自己创建的类和标准库中的列有重名的情况,因此在程序中如果程序员自己定义的类替换了代码中的标准库中的类那么就会产生严重错误,造成严重的后果。这里的初始化确定的类对象中的成员最终的值,在准备过程中的初始化是为了防止由于内存空间的值不确定的情况下可能产生BUG因此才将内存空间的值才全赋值为0,而这里确定的是类对象中静态成员的最终的值,执行的是静态代码块。在JVM加载器中 输入:类的全限定名。
2024-09-29 20:27:28
831
原创 HTTPS加密流程
如果发生了中间人攻击这种情况是非常严重的,由于传输数据是需要借助非对称加密,所以在客户端发送数据前会先通过验证公钥的方式确认对方是否是服务器,再决定是否要传输数据,在这个过程中服务器会返回一个响应告诉客户端公钥是啥,但是这个响应被第三方(黑客)截获了,并且自己生成了一个公钥返回给客户端,此时客户端就以为,返回的这个响应是服务器发送的公钥,因此客户端就开始发送“对称密钥”(这个对称密钥使用过黑客自己生成的)。如果黑客(第三方)截获了证书篡改了数据,同时修改了数字签名使得解密出来的结果和之前的结果一直?
2024-09-25 16:07:24
985
原创 HTTP的基本格式
在首行的下面到第一个空行就是请求头,请求是许多键值对组成的,具有一定的规则,但是在这个请求格式中是没有body的,在请求中一般情况下当方法是GET时是没有正文(body)的,但是如果方法是POST则是有方法的。在这里我们对URL和URI进行简要的了解一下,由于资源有许多种类,因此我们需要通过一同规则找到这些资源所在的位置,因此便有了URL,其实URL和URI并没有本质的区别。同发送报文一样,首行之下和第一个空行之上是响应头,也是有键值对构成的,第一个空行一下则是响应报文的正文(body)。
2024-09-21 12:34:27
455
原创 数据链路层
数据中关于最小的46字节在这里我们就不过多讨论了,我们在这里只来讨论1500字节是怎么来的,这个空间大小是由MTU决定的,也就是和硬件直接相关的,不同的硬件MTU也有所不同,而在以太网中1500字节相当于1.5KB是非常小的,此处的MTC就会对上层协议产生直接影响,IP协议能拆包组包,实际上IP协议更多是为了应对MTU的限制,当一个IP数据报达到1500以上时,就会自动进行拆包了。类型这里是16进制IP数据报内就包含了从应用层,传输层,网络层传输先来的部分。
2024-09-17 14:22:13
303
原创 IP协议及相关特性
8位生存空间(TTL):一个数据包在网络中最多生存多长时间,如果一个IP数据报的目的IP写错了,写成了不存在的IP就会消耗很多的网络资源,TTL(值32,64,128.....)约定了传送达到的次数(指的是经过路由器转发的次数),如果发送一个IP数据报TTL就会-1(经过交换机,不减)一旦TTL减到了0,此时这个数据包就会被当前路由器直接丢弃~~。4位首部长度:同TCP协议IP协议的报头也是可以变长的,报头长度是0~15实际上报头的上的是乘4的当为15时报头长度就是60。IP协议负责地址管理和路由选择。
2024-09-17 11:18:24
596
原创 TCP 协议的相关特性
通信双方通过四次的网络通信是的建立的连接断开,它的过程也是十分明了的,,这里的四次挥手与三次握手的差别在于接收方返回的ACK和FIN这两个过程是分开的就说明这连个过程无法进行合并,这是因为ACK是在操作系统内核中完成的而FIN是在应用程序中完成的,两者的触发条件不同,这两个过程不在同一时机,因此两者是不能合并的,因为这两个过程的时机不同因此,在这两个过程中会存在时间间隔,如同代码中的socket.close(),就是接收方发送FIN的操作,而这个操作如何使用在哪里使用,是由程序员决定的。
2024-08-23 18:27:32
1041
原创 UDP 的报文结构和注意事项
UDP中,使用两个字节传输校验和并且UDP使用简单有效的方案CRC校验和(循环冗余检验),通过这种方式吧UDP数据报整个数据都进行遍历,分别取出每个字节在2个字节的变流量上进行累加由于整个数据可能有很多,因此很有可能会溢出,但是在这里的重点并不是是否会溢出而是数据是否发生改变,在客户端(发送方)传递数据是会首先计算一个校验和,服务器(接收方)也会计算校验和如果这两个校验和相等那么数据就没有发生改变反之则发生了改变(这也是理想情况,仍有一些概率及其低情况)。2,直接使用TCP。
2024-08-17 09:01:21
1187
原创 TCP回显服务器
客户端和服务器中的flush()方法都是为了解决printStream中的缓冲区问题,因为像这样的IO类型的类都是自带缓冲区的,这个缓冲区会将我们所发送来的请求进行累积,他并不会使我们没输入一个他就返回一个,而是达到一个量的时候在进行返回,因此我们使用flush()来解决这种方法,当然我们也可以使用OutputStream自带的方法进行回应。这里有有连接的是抽象的"连接”主要表达的是通信双方是否保存有对端的信息,如果有则是有连接的,反之则是无连接的。TCP 是有连接,可靠传输,面相字节流,全双工。
2024-08-11 10:14:09
471
原创 计算机网络的基本概念
端口号在网络通信中扮演着重要角色,使得多个应用和服务能够在同一设备上正常运行并进行有效的通信。正确管理和配置端口号是网络安全和性能的重要组成部分。网络协议是指在计算机网络中,不同设备之间通信时遵循的规则和标准。它们定义了数据如何被格式化、传输、处理和接收。网络协议是计算机和其他设备之间实现有效通信的基石,通过遵循一系列规则和标准,确保数据的准确传输和处理。熟悉常见的网络协议有助于理解网络的运作和解决相关问题。网络协议分层是将复杂的网络通信过程划分成多个层次,以便于设计、实现和管理。
2024-08-05 14:15:28
1272
1
原创 java中InputStream, OutputStream 的用法
文件操作内容有很多,比如打开文件,关闭文件在java中允许一种方法是为了防止我们打开过多的文件导致指定进程描述符表长度不够实用导致程序出现问题,因为每打开一个文件,都需要消耗制定进程描述符表上的一个项文件描述符表的长度是有限的(不同的系统不一样,也是可以配置的)。这种方法的结果同只有一个参数的方法作用效果除了变异量的差别其他的并无二异,方法是从0偏移量为0开始存储的所以,这里第一次直接将文本中的内容放到buf数组当中,第二次n等于-1循环停止,过程结束;2,文件内容操作,流对象。
2024-08-03 09:18:28
1042
原创 java IO、存储、硬盘、文件系统。
对于相对路径中的getPath()方法是按照标准相对路径表示的 这里的‘.’就是这个java文件所在目录文件的名字为test1.txt,getAbsoluteFile()和getCanonicalFile()方法唯一的区别就是getAbsoluteFile()取得的路径中比getCanonicalFile()中的路径多了一个‘.\’这个符号是可以省略的这位这里的‘.’就代表了相对路径的基准,在这里我们不难看出如果想要输出一个完整的不含任何修改地址我们可以使用 getCanonicalFile()方法。
2024-08-01 13:16:30
1073
原创 CAS和synchronized的优化过程
我们着重介绍一下“偏向锁”,偏向锁只是一种状态,它不属于锁,只是一种状态或者说姿只是进行一下标记,这种状态的好处就在于,当一个线程获取锁时,这个请求会被记录下来但是并不会立即上锁,如果后续有必要用到是才会进行上锁,这样的好处就在于可以减少线程中的竞争,提高性能。CAS 全程compare and swap 比较内存和寄存器中的内容如果相同则进行交换,比如内存和寄存器一进行比较发现值是相同的,此时将寄存器二的值赋值给内存,我们没有必要了解,寄存器二中的内容是什么这里只是单纯的交换。
2024-07-26 15:48:42
214
原创 java线程池
看到这个参数想必大家联想到了队列在线程池中也叫工作队列,也就是java中的“生产者消费者模型”, 就是一个阻塞队列,程序员使用的时候例如“submit”这样的方法,把要执行的任务设定到线程池里,线程池内部的工作线程负责执行这些任务。(Runnable接口本身的含义就是一段可以指向的任务),另外此处队列我们可以自行指定队列的容量和队列的类型。这两个一个是核心线程数一个是最大线程数,在java标准库中线程池中的线程分为两部分一个是核心线程另一个就是非核心线程 ,核心线程+非核心线程的最大值就是最大线程数。
2024-07-24 15:33:51
570
原创 java线程安全问题的原因和解决方案
进入到代码块中就会针对对象进行加锁此时如果其他加了同类锁的线程在执行加锁操作时就会停止运行称为锁竞争/锁冲突此时除非上一个加锁的对象解锁不然这个线程中的{}中内容就违法运行,出了代码块就会解锁(需要特别注意的是这里的锁对象必须是同一个才会产生锁竞争,如果两个线程同时加锁了但是不是相同的锁对象那么就不会发生锁竞争/锁冲突,也就意味着线程安全问题依旧存在,相当于没有进行任何操作)。例如,在一段代码中 ,线程A持有资源X并等待资源Y,而线程B持有资源Y并等待资源X,两个线程都无法继续执行下去,就会陷入死锁状态。
2024-07-20 14:33:41
498
原创 java线程的几种状态
1,NEW 表示当前Thread对象虽然有了,但是内核的线程还没用调用(还未调用过start)2,TERMINATED 当前Thread对象虽然还在但是内核的线程已经摧毁了(线程已经结束)5,TIMED_WAITING 有超时的时间等待(比如sleep或者join的带参版本)3,RUNNING 就绪状态,正在CPU上运行或随时可以去CPU上运行。6,WAITING 没有超时时间的阻塞状态(join/wait)下列三种均为阻塞状态,但是不方便展示代码。4,BLOCKED 因为锁竞争引起阻塞。
2024-07-18 21:28:45
206
原创 总结 Thread 类的基本用法
对于线程等待我们使用join()方法来进行实现,等待就是让其他线程等待这个线程或者是让这个线程被等待,主线程可以等待子线承,子线承也可以等待子线程,总的来说就是线程之间可以相互等待,有句话叫存在即合理,下面我们来介绍为什么要有线程等待和线程等待的使用场景,这意味着其他线程可以在休眠期间访问共享的资源,但是无法使用线程在休眠期间分配的内存。要想解决这个问题就需要用到线程等待了,使用规则为在哪一个线程中使用另一个线程调用join()方法那么要想执行这个线程就必须等待下一个线程运行结束才能执行。
2024-07-18 21:11:18
222
原创 Java中进程和线程的区别
它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。为了解决进程开销比较大的问题发明了"线程"(Thread),线程可以理解为更轻量的进程,也能解决并发编程的问题,但是创建和销毁的开销比进程低,因此多线程编程就成为了当下主流的并发编程方式。通过编写特殊的代码把多个CPU核心都利用起来这样的代码就称为“并发编程”,多进程编程就是一种典型的并发编程,虽然进程和以解决许多的问题,但是随着对效率要求越来越高,就希望有更好的方式来实现并发编程。
2024-07-11 16:06:55
269
原创 mysql事务详解
有三个事务ABC,首先事务A进行一个修改操作,A执行完毕的时候,提交数据,接下来B执行,事务B读取刚才A提交的数据,在B读取的过程中又来了一个事物C,C又对刚才A修改的数据再次做出了修改,此时对于B来说后续读到的结果就和第一次读到的结果是不一样的,这个过程就叫做“不可重复性”(体现的是事物B,一个事物里多次读取的结果不一样,如果有多个事务每个事务读到的结果不一样这种情况认为是正常的~~)。那么该如何解决这个问题呢?有一个事务A在读取数据,读的过程中,另一个事务B增添了/删除了一些其他的数据,此时站在。
2024-06-02 19:05:33
596
原创 Java中Stack的使用详解
向一个栈插入新元素的操作称为进栈或入栈,它将新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素的操作称为出栈或退栈,它将栈顶元素删除掉,使其下面的相邻元素成为新的栈顶元素。由于栈的插入和删除运算仅在栈顶一端进行,后进栈的元素必定先出栈,因此栈也被称为后进先出表(Last In First Out,简称LIFO)。输出结果都是10,因为在访问的时候我们并没有将栈顶元素进行移除,因此·我们可以无限次的访问栈顶元素(前提是栈顶得有元素)。,其特点在于仅允许在表的一端(即表尾)进行插入和删除操作。
2024-05-27 15:02:16
543
原创 MYSQL中的索引
注意:B-树和二叉数想必还是有很大优势的,虽然B-树中每个节点的比娇次数变多了但是硬盘IO变小了,B-树一次硬盘IO是将整个区间内的值都取出来,明显降低了硬盘IO的次数,因此B-树的主要目的不是改变比较次数,而是降低硬盘IO的次数。4,B+树所有的查询都是要落到叶子结点上完成的,任何一次查询,经历的IO次数和比较次数是差不多的,查询的开销稳定。索引的背后数据结构是B+树,在讲解B+树之前我们先来讲解B-树这样可以使我们更好的理解B+树。需要特别注意的是,所有的叶子结点构成了珍格格数据的全集。
2024-05-26 12:27:38
309
原创 HashMap和HashSet的详解
当向该结构中: 插入元素 根据待插入元素的关键码,以此函数计算出该元素的存储位置并按此位置进行存放 搜索元素 对元素的关键码进行同样的计算,把求得的函数值当做元素的存储位置,在结构中按此位置取元素比较,若 关键码相等,则搜索成功 该方式即为哈希(散列)方法,哈希方法中使用的转换函数称为哈希(散列)函数,构造出来的结构称为哈希表(Hash Table)(或者称散列表)顺序查找时间复杂度为O(N),平衡树中为树的高度,即O( ),搜索的效率取决于搜索过程中 元素的比较次数。但是哈希表结构也有缺陷:哈希冲突。
2024-05-25 10:39:13
252
原创 TreeMap及TreeSet详解
5. 实现Set接口的常用类有TreeSet和HashSet,还有一个LinkedHashSet,LinkedHashSet是在HashSet的基础。有这张图我们可以看出Set是继承Collection而Map没有继承任何的类,了解这一点对于后续的学习 是比较有帮助的。3. TreeSet的底层是使用Map来实现的,其使用key与Object的一个默认对象作为键值对插入到Map中的。6. Set中的Key不能修改,如果要修改,先将原来的删除掉,然后再重新插入。上维护了一个双向链表来记录元素的插入次序。
2024-05-19 08:33:57
924
原创 java优先级队列
概念 前面介绍过队列,队列是一种先进先出(FIFO)的数据结构,但有些情况下,操作的数据可能带有优先级,一般出队 列时,可能需要优先级高的元素先出队列,该中场景下,使用队列显然不合适,比如:在手机上玩游戏的时候,如 果有来电,那么系统应该优先处理打进来的电话;2. 如果parent的左孩子存在,即:child < size, 进行以下操作,直到parent的左孩子不存在 parent右孩子是否存在,存在找到左右孩子中最小的孩子,让child进行标 将parent与较小的孩子child比较,
2024-05-16 10:04:39
815
原创 java二叉树
二叉树的递归定义为:二叉树或者是一棵空树,或者是一棵由一个根节点和两棵互不相交的分别称作根的左子树和右子树所组成的非空树,左子树和右子树又同样都是一棵二叉树。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从0至n-1的结点一一对应时称之为完全二叉树。双亲结点或父结点:若一个结点含有子结点,则这个结点称为其子结点的父结点;孩子结点或子结点:一个结点含有的子树的根结点称为该结点的子结点;2. 若规定只有根结点的二叉树的深度为1,则深度为K的二叉树的最大结点数是。
2024-05-16 08:58:20
831
原创 JAVASE8中基本数据类型
JAVA与C不同的是布尔类型在JAVA中不是bool而是boolean这一点需要大家特别记忆,与C语言想必JAVA中多了byte,其实byte与short和其他整形数据类型想必只不过是所占空间的大小不同,对于其他的并无什么差别。那么就是高位补零也就是。在JAVA中如果我们想要灵活的使用部分的运算符那么我们必须来了解整形提升这个概念,它是在运算当中非常容易出错的地方,关于整形提升我们在之前的博客中进行过讲解,大家如果·有时间可以看一下之前的几篇博客。有什么作用,在未来的博客中我们会进行讲解的。
2024-04-25 11:07:55
311
1
原创 C语言文件操作
缓冲⽂件系统中,关键的概念是“⽂件类型指针”,简称“⽂件指针”。每个被使⽤的⽂件都在内存中开辟了⼀个相应的⽂件信息区,⽤来存放⽂件的相关信息(如⽂件的名 字,⽂件状态及⽂件当前的位置等)。我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出 操作各不相同,为了⽅便程序员对各种设备进⾏⽅便的操作,我们抽象出了流的概念,我们可以把流 想象成流淌着字符的河。在编写程序的时候,在打开⽂件的同时,都会返回⼀个FILE*的指针变量指向该⽂件,也相当于建⽴了 指针和⽂件的关系。
2024-03-28 17:58:30
1958
原创 C/C++整数和浮点数在内存中存储
IEEE 754 规定,在计算机内部保存M时,默认这个数的第⼀位总是1,因此可以被舍去,只保存后⾯的 xxxxxx部分。但是,我 们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存⼊内存时E的真实值必须再加上 ⼀个中间数,对于8位的E,这个中间数是127;整数的2进制表⽰⽅法有三种,即 原码、反码和补码 三种表⽰⽅法均有符号位和数值位两部分,符号位都是⽤0表⽰“正”,⽤1表⽰“负”,⽽数值位最 ⾼位的⼀位是被当做符号位,剩余的都是数值位。⼀个中间数,对于8位的E,这个中间数是127;
2024-03-17 08:24:12
927
原创 C/C++中strcpy,strcat,strstr以及strncpy,strncat,strncmp的使用
这两种参数形式没有什么差别,它的如要作用为在str1中查找是否有str2字符串,也就是查找str1中是否有str2的一部分,如果有则返回str1中与str2中相同的字符串的第一个字符的地址,这里需要特别注意的是strstr函数真能返回从左往右第一个str1中和str2中的第一个字符的的值,如果str1中有多个str2那么值返回str1中第一个str2的首元素地址。那么这个函数是怎么用的呢?strncmp:它的作用依旧是比价字符串的大小,但与strcmp不同的是它也是可以先限定前几个进行比较。
2024-03-14 17:20:56
1647
原创 C/C++指针详解
指针其实就是元素存放地址,更加形象的比喻:在酒店中如果你想要去注必须去付费不然不能住,在计算机也同样如此(但是不需要付费哦)每当我们使用一个变量或其他需要申请空间的时候计算机就会自动开辟一段空间也就相当于酒店中每一个房间都有一个固定的房间号,在对应的房间号内可以找到固定的人,同样在正确的内存空间内也可以找到对应的数据,如果你想找的数据不在这一空间那么无论如何也是找不到得。当然这两个解引用的意思是有一定的差异的,第一个*截取的是数组的首地址也就是arr1第二个则是截取arr1中的第二个元素。
2024-03-09 20:06:52
1707
原创 C/C++环形链表
环形链表的解决方法利用到了快慢指针,这个问题也就可以表示为solw慢指针走一步fast走两步形成一个循环如果这个链表是环形链表那么当solw和fast进入环内那么快指针fast和慢指针slow就一定会相遇,当快慢指正同时进入环内时这个问题就变成了快指针追赶慢指针的过程,假设在慢指针进入环内后与快指针的距离为N那么每循环一次就相当于相对距离减1,因此只要链表是环形链表那么快慢指针就一定会相遇,只要相遇了那么也就意味着 solw = fast此时就可证明该链表是环形链表。
2024-03-04 18:22:26
367
原创 C/C++单链表
想要实现这个想法我们必须找到尾节点和尾节点的上一个节点但是由于单链表是单项得我们无法使用某一个节点获知上一个节点或者下一个节点的地址因此我们需要在找到尾节点的同时找到上一个节点进而完成删除操作,在这里我们用到了pren 和 tail这两个指针这样当tail->next空时,pren 指向的就是指向尾节点的节点这是改变指向释放尾节点则尾删操作就算是完成了。如图当tall->next的指向为NULL时该节点就位尾节点,此时我们只需要将尾节点的指向改为指向我们创造的新节点NewNode就大功告成了。
2024-02-23 20:35:29
1043
1
原创 C++杨氏矩阵详解
在这个函数中我们可以清晰的看到行数的变化,如果找到数,那么就直接返回1,如果没找到待到循环停止后返回0在main函数中,判断是否查找到该值。杨氏矩阵的基本原理是 在杨氏矩阵中由于自上而下,自左而右都是递增的,所以我们只比较最右上角的值就可以进行判断是否符合我们想要找的数,如果小于我们找的数,那么列数不变行数加一,如果小于我们要找的数,那么行数不变列数加一,如果是我们要找的数则跳出循环。cout << " 请输入您想要查找的数" << endl;
2024-02-04 13:32:17
468
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人