典型问题分析3—LinkList中遍历操作与删除操作混合使用

LinkList中遍历操作与删除操作混合使用

删除成功后,list.current()返回什么值?

#include <iostream>
#include "LinkList.h"

using namespace std;
using namespace DTLib;

int main()
{
    LinkList<int> list;

    for(int i=0; i<5; i++)
    {
        list.insert(i);
    }

    for(list.move(0); !list.end(); list.next())
    {
        if(list.current() == 3)
        {
            list.remove(list.find(list.current()));
            cout << list.current() <<endl;
        }
    }
  
    return 0;

}

打印结果:

这显然是一个随机值,那为什么会出现这种情况呢?

3所对应的堆内存已经被释放了,但是p指针却没有变化,还是指向原来内存。所以才会打印那个奇怪的值。

修改remove函数如下:

bool remove(int i)
    {
        bool ret = ((0<=i) && (i<m_length));

        if(ret)
        {
           Node* current = position(i);
           Node* toDel = current->next;

           if(m_current == toDel)
           {
                m_current = toDel->next;
           }
           current->next = toDel->next;

           m_length--;

           destroy(toDel);

          //  m_length--;
        }

        return ret;
    }

本篇文章想要说明,当删除链表中的一个元素时,不要忘记当前的指针也要移动哦。否则就会造成上面出现的现象。

原文地址:https://www.cnblogs.com/-glb/p/12345447.html

时间: 2024-11-05 14:47:49

典型问题分析3—LinkList中遍历操作与删除操作混合使用的相关文章

典型问题分析4—StaticLinkList中数据元素删除时的效率问题

StaticLinkList中数据元素删除时的效率问题 void destroy(Node* pn) { SNode* space = reinterpret_cast<SNode*>(m_space); SNode* psn = dynamic_cast<SNode*>(pn);//从父类指针,转换为子类指针,直接调用dynameic_cast for(int i=0; i<N; i++) { if(psn == (space + i)) { m_used[i] = 0;

vue中的列表项删除操作

<script> Vue({ data: { orders: [] }, created() { $.get( { url: 'orders', dataType: 'json' }) .then( data => { this.orders = data; }); }, methods: { delete(index) { // 用索引删除 this.orders.splice(index, 1); }, deleteByID(id) { this.orders.splice(this

12 hdfs常用文件、目录拷贝操作、删除操作

package com.da.hbase.tool.utils; import com.da.hbase.tool.common.Const; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.h

PostgreSQL连接python,postgresql在python 连接,创建表,创建表内容,插入操作,选择操作,更新操作,删除操作。

安装 PostgreSQL可以用Python psycopg2模块集成. sycopg2是Python编程语言的PostgreSQL数据库的适配器. 其程序代码少,速度快,稳定.不需要单独安装这个模块,因为它默认情况下被运往随着Python版本在2.5.x一起的.如果不把它安装在机器上,然后可以使用yum命令安装它,如下所示: $yum install python-psycopg2 要使用psycopg2的模块,首先必须创建一个Connection对象,它表示数据库然后再可以选择创建游标对象,

十二、典型问题分析

问题1:创建异常对象时的空指针问题 创建一个空指针异常对象,意味着这会调用父类的构造函数Exception(0),然后调用init(0, NULL,0),然后调用m_message = strdup(0), /* Duplicate S, returning an identical malloc'd string. */ char * __strdup (const char *s) { size_t len = strlen (s) + 1; void *new = malloc (len)

二叉查找树中元素的删除操作

关于二叉查找树的建立,插入,遍历(记住二叉查找树的中序遍历是所有元素由大到小排序结果)等操作,博主“C小加”写的很详细了,我主要补充二叉树的删除操作.删除操作主要难在对左右子节点都非空的节点的删除操作,这里可以找到该节点右节点中的最小值,即右子节点中的最左子树.找到后和需要删除的节点交换data等数据,然后删除这个最小子节点.实现代码如下,只需对需要删除节点的右子节点遍历一次: template<class T> void BST<T>::Deletepri(TreeNode<

数据结构开发(20):树中结点的查找、插入、清除与删除操作

0.目录 1.树中结点的查找操作 2.树中结点的插入操作 3.树中结点的清除操作 4.树中结点的删除操作 5.小结 1.树中结点的查找操作 查找的方式: 基于数据元素值的查找 GTreeNode<T>* find(const T& value) const 基于结点的查找 GTreeNode<T>* find(TreeNode<T>* node) const 树中数据元素和结点的查找: 基于数据元素值的查找: 定义功能:find(node, value) 在 n

红黑树(3) - 删除操作

在本系列的前面两篇文章中,已经介绍了红黑树以及其插入操作.具体可参考下面两个链接: 红黑树(1) - 介绍 红黑树(2) - 插入操作 1.删除操作介绍 类似于插入操作,红黑树进行删除节点时,也使用重新着色以及旋转这两种方式,来维护它的属性.在插入操作中,我们主要是依靠检测叔节点的颜色来决定哪种场景.在删除操作中,我们使用检测兄弟的颜色,来决定是哪种场景. 在插入操作中,最常见的违反红黑树属性的一种情况是存在两个连续的红色节点.而在删除操作中,常见的情况是,当删除节点是黑色时,会影响从根节点到叶

ASP.NET MVC3 实例(六) 增加、修改和删除操作(二)

http://www.jquery001.com/asp.net-mvc3-instance-add-update-delete2.html 上篇我们在 ASP.NET MVC3 中实现了添加操作,由于时间关系没有完成修改.删除操作,我们新建了一个名为"Contact"的 Controller,并实现了添加方法,下边就让我们在此基础上来完成 ASP.NET MVC3 中的修改和删除操作. 首先,我们在 Contact 控制器类中添加一个名为 View()的方法,用来从 Contact