数据结构(王卓)(4)附:链表的销毁与清空

news2024/12/24 2:42:05

销毁

Status 销毁单链表(LinkList L)
{
    LinkList p;
    while (L)
    {
        p =L;
        L->next;
        delete p;
    }
    return OK;
}

运行逻辑:
(1):设定一个指针,让指针指向链表的头指针L

(2):让头指针等于头指针里面指向下一结点的结点内部指针next

(保存了头指针.next(L.next),即下一个结点的地址)

此时L的值为下一个结点的地址

(3):删除这个我们设定的指针

这个我们设定的指针此时就是链表中的第一个结点的地址(头指针)

这一操作在我们的记录里删除了头结点的地址

与此同时里面存储的变量自然也没有内存空间存储了(该内容的内存空间区域都没了你还存啥)自然也就一同(一起)被释放,于是这个整一节点都被清除

然后再进入下一轮(头指针记为当前之后的第一个节点的地址,然后再释放这一结点,逐个清除)

......

最终:

L指向下一指针a(n);

删除结点a(n-1);

指针p指向a(n);

p指向a(n).next=^(空);

删除

结点a(n);

另外,如果我们在输入的时候,输入一个链表Lnode类型进去:

Status 销毁单链表(LinkList& L)
{
    //判断链表是否为空
    if (链表是否为空(L))
    {
        cerr << "empty List!" << endl;
        return false;
    }
    while (L)//链表还未到达尾端
    {
         Lnode* temp;
        temp = *&L;
        L = L->next;
        delete temp;
    }
    return true;
}

或者:

Status 销毁单链表(LinkList& L)
{
    //判断链表是否为空
    if (链表是否为空(L))
    {
        cerr << "empty List!" << endl;
        return false;
    }
    while (L)//链表还未到达尾端
    {
        auto temp = L->next;//将头指针指向下一个结点
        delete L;
        L = temp;
    }
    return true;
}

清空(只销毁内容)

project 1:(其实只是对销毁链表的生搬硬套的照抄,并且里面还缺少了while语句的循环)

Status 清空链表(Lnode *&L)
{
    if (链表是否为空(L))
        cerr << "链表为空" << endl;
    auto temp = *&L;
    L = L->next;
    delete (*temp);
}

project 2:

Status 清空链表(LinkList L)
{
    if (链表是否为空(L))
        cerr << "链表为空" << endl;
    while (L)
    {
        auto temp = L;
        delete L->data;
        L = L->next;
    }

}

结果他说清空链表是指清空中间的所有结点,但是保留头结点(也包括头指针)(为空)

而不是清空链表中每一结点存储的数据内容,remake:

project 3:

Status 清空链表(LinkList L)
{
    if (链表是否为空(L))
        cerr << "链表为空" << endl;
    while (L)
    {
        auto temp = L->next;
        delete L;
        L = temp;
    }
}

整个程序运行的流程逻辑链路还是没有完成闭环

project 4: 

Status 清空链表(LinkList L)
{
    if (链表是否为空(L))
        cerr << "链表为空" << endl;
    while (L)
    {
        auto temp = L->next;
        L = temp;
        L = L->next;
        delete temp;
    }
}

注意:在这里,我们不能再用L来指向第二个节点的地址,因为如果这样(使)用:

第一轮:

(1):temp指向第一个结点

(2):L指向第一个结点

(3):L指向第二个节点

(4):删除第一个节点

第二轮:
(1):temp指向第三个节点

(2):L指向第三个节点

(3):L指向第四个结点

(4):删除第3个节点

......

这样一来,第二个节点就没删掉;

而且,因为一次跳两个,倒数第二个就未必给你跳(没机会了,后面没有了))

project 5: 

Status 清空链表(LinkList L)
{
    if (链表是否为空(L))
        cerr << "链表为空" << endl;
    while (L)
    {
        auto temp1 = L->next;
        auto temp2 = temp1->next;
        delete temp1;
        temp1=temp2;
    }
}

但是我们编到这里我们肯定也知道,如果这样的话这个程序他就是一直在用L赋值

这样到后面肯定是不行的,所以继续改进:

project 6: 

Status 清空链表(LinkList L)
{
    if (链表是否为空(L))
        cerr << "链表为空" << endl;
    auto temp1 = L->next;
    while (temp1)
    {
        auto temp2 = temp1->next;
        delete temp1;
        temp1=temp2;
    }
}

最后别忘了,我们要的是一个空的头结点,并且在完成操作后,我们还需要返回一个操作成功执行的信号: 

project 7: 最终成品版本

Status 清空链表(LinkList L)
{
    if (链表是否为空(L))
        cerr << "链表为空" << endl;
    auto temp1 = L->next;
    while (temp1)
    {
        auto temp2 = temp1->next;
        delete temp1;
        temp1=temp2;
    }
    L->next = NULL;
    return true;
}

最后:

temp1指向a(n-1),temp2指向a(n);

删除 a(n-1);

temp1指向a(n);

while(1)(通过)

temp2指向a(n).next=^(空);

删除 a(n);

temp1也指向a(n).next=^(空);

清空L->next;

结束;

问题:

为什么(我们何必)还要再去设立一个新的变量temp2,我们直接去使用头结点L记录后面的地址不就完了吗?何必这么多此一举?

Status 清空链表(LinkList L)
{
    if (链表是否为空(L))
        cerr << "链表为空" << endl;
    auto temp1 = L->next;
    while (temp1)
    {
        L = temp1->next;
        delete temp1;
        temp1=L;
    }
    L->next = NULL;
    return true;
}

temp1指向a(n-1),L指向a(n);

删除 a(n-1);

temp1指向a(n);

while(1)(通过)

L指向a(n).next=^(空);

删除 a(n);

temp1也指向a(n).next=^(空);

清空L->next;

结束;

最后头指针不是也被保留了并且清空了吗???为什么弹幕里说不可以,说这样就把第一个节点也销毁了???头指针L和头结点依然存在啊,只不过是内容和指向被清空而已啊?? 

原因:

头指针其实还需要指向头结点,如果用头指针L代替temp2的话,最后L也置为空

也就是说这样的话, 最后我们的头指针L就没办法指向我们的头结点了,不符合题目给出的规定要求

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

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

相关文章

Session和Cookie

回顾 1.Servlet API 2.HttpServlet DoXXX处理哪种Http方法会调用到对应的方法 init/destroy/service—>servlet的生命周期 3.HttpServletRequest Http请求 get系列方法 协议名&#xff08;版本号&#xff09; url query string header query String/body HttpServletRespon…

【配准和融合相互作用,交互】

RFNet: Unsupervised Network for Mutually Reinforcing Multi-modal Image Registration and Fusion &#xff08;RFNet&#xff1a;一种互增强的多模态图像配准与融合的无监督网络&#xff09; 本文提出了一种在相互增强的框架RFNet中实现多模态图像配准与融合的新方法。我们…

第八章 集成学习

8.1 个体与集成 集成学习通过构建并结合多个学习器来完成学习任务&#xff0c;有时也被称为多分类系统、基于委员会的学习等。 下图显示出集成学习的一般结构&#xff1a;先产生一组个体学习器&#xff0c;再用某种策略将它们结合起来。个体学习器通常由一个现有的学习算法从训…

Redis实战——分布式锁

目录 1 一人一单并发安全问题 2 分布式锁的原理和实现 2.1 什么是分布式锁&#xff1f; 2.2 分布式锁的实现 1 一人一单并发安全问题 之前一人一单的业务使用的悲观锁&#xff0c;在分布式系统下&#xff0c;是无法生效的。 理想的情况下是这样的&#xff1a;一个线程成功…

计算机中数的表示和运算

定点数 编程时需要确定小数点位置难以表示两个大小相差较大的数存储空间利用率低 这种用二进制来表示十进制的编码方式&#xff0c;叫作BCD 编码&#xff08;Binary-Coded Decimal&#xff09;。 浮点数 小数点的位置可以左右移动的数 规格化浮点数: IEEE 754规格化的尾数…

基于Java+Swing+Mysql实现《黄金矿工》游戏

基于JavaSwingMysq实现《黄金矿工》游戏一、系统介绍二、功能展示三、其他系统一、系统介绍 《黄金矿工》游戏是一个经典的抓金子小游戏&#xff0c;它可以锻炼人的反应能力。。该游戏中&#xff0c;可以通过“挖矿”获得积分&#xff0c;游戏道具&#xff1a;有3瓶药水&#…

cubeIDE开发, 如何结合FreeRTOS开发STM32程序

一、STM32CubeIDE使用内置的FreeRTOS 不同于STM32CubeIDE使用像RTThread这些第三方物联网系统&#xff0c;STM32CubeIDE在安装时就已经在MiddleWare中间件一栏直接支持了FreeRTOS操作系统。 既然STM32CubeIDE已经把FreeRTOS深度整合到了自家的系统中&#xff0c;所以移植及使用…

深度学习中的正则化——L1、L2 和 Dropout

正则化是一组技术&#xff0c;可以防止神经网络中的过度拟合&#xff0c;从而在面对来自问题域的全新数据时提高深度学习模型的准确性。 在本文中&#xff0c;我们将介绍最流行的正则化技术&#xff0c;称为 L1、L2 和 dropout。 文章目录1. 回顾&#xff1a;过拟合2.什么是正则…

【并发编程】AQS ReentrantLock 底层实现原理

一、概述 synchronized上锁机制是通过对象头来实现的&#xff0c;通过锁升级的过程来完成加锁。&#xff08;https://blog.csdn.net/zhangting19921121/article/details/106002751&#xff09; 但是synchronized锁升级的过程犹如一个黑盒&#xff0c;我们无法掌控。因此&…

常见的损失函数

1. 损失函数、代价函数与目标函数 损失函数&#xff08;Loss Function&#xff09;&#xff1a;是定义在单个样本上的&#xff0c;是指一个样本的误差。   代价函数&#xff08;Cost Function&#xff09;&#xff1a;是定义在整个训练集上的&#xff0c;是所有样本误差的平均…

07_openstack之安全组与浮动IP

目录 一、环境准备 二、浮动IP 1、浮动IP介绍 2、创建和分配浮动IP 三、安全组 1、安全组介绍 2、创建安全组 3、给云主机绑定安全组 一、环境准备 部署openstack私有云环境&#xff1a;02_openstack私有云部署_桂安俊kylinOS的博客-CSDN博客 创建项目和用户&#xf…

Mac电脑系统降级至10.15 Catalina(2020末代intel)

目录起因前期准备降级系统步骤&#xff08;联网&#xff09;选定开机阶段需要按的快捷键进入简化的macOS激活锁页面macOS实用工具页面抹除磁盘安装降级系统Catalina关于从U盘重装系统相关参考博客起因 这部分碎碎念可以不看> < 20年7月买mac是为了找工作&#xff0c;找到…

[附源码]计算机毕业设计校园商铺Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]计算机毕业设计药品仓库及预警管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

libcef.dll文件丢失怎么办?丢失对电脑有什么影响?

提到电脑中的系统文件可能大家都是不太了解的&#xff0c;毕竟平时使用电脑的时候也接触不到那些复杂的文件&#xff0c;最多大家只会使用电脑上面的各种功能&#xff0c;不过虽然接触不到但是大家也要适当的了解一下&#xff0c;就比如libcef.dll文件丢失了就会造成电脑系统出…

Word2Vec详解

Word2Vec 基本思想&#xff1a;通过训练将每一个词映射成一个固定长度的向量&#xff0c;所有向量构成一个词向量空间&#xff0c;每一个向量&#xff08;单词)可以看作是向量空间中的一个点&#xff0c;意思越相近的单词距离越近。 如何把词转换为向量&#xff1f; 通常情况…

用Python做个学生管理系统,这不简简单单

前言 最近因为疫情&#xff0c;各大高校都开始放假了&#xff0c;要不就是回家上网课 我朋友的老师真有趣&#xff0c;硬是要我朋友做个学生管理系统打包成exe文件发给他&#xff0c;才能回家 这不就找上我来了&#xff0c;我写完就顺便发篇文章咯 准备工作 环境准备 Pyth…

Java基于springboot+vue的保健用品销售购物商城系统 前后端分离

随着人们生活水平的提高&#xff0c;人们对日常的保健工作也越来越重视&#xff0c;如何拥有一个更加健康的体魄成为当下很多人的一个追求&#xff0c;尤其是我国当下人口老龄化验证&#xff0c;老人因为身体机能的下降所以也要经常补充一些蛋白核矿物质。当下的年轻人也因为生…

【Java】ArrayList扩容规则

文章目录初始大小扩容规则总结初始大小 ArrayList的初始大小由你选定的构造函数决定&#xff0c;如果你使用无参构造函数&#xff0c;那么初始大小为0&#xff0c;是一个空数组。 而如果你选用有参数的构造函数&#xff0c;那么初始大小为你输入的大小 因此如果问你ArrayLis…

[附源码]计算机毕业设计基于springboot的4s店车辆管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…