zoukankan      html  css  js  c++  java
  • 典型问题分析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;
        }

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

  • 相关阅读:
    MySQL_基础_TCL事务控制语言
    MySQL_基础_DDL数据定义语言
    MySQL_基础_DQL数据查询语言
    MySQL_基础_DML数据操纵语言
    MySQL_基础_存储过程和函数
    MySQL_基础_变量
    linux 常用命令
    灵活QinQ示例
    RRPP 演示实例
    ERPS实例演示
  • 原文地址:https://www.cnblogs.com/-glb/p/12345447.html
Copyright © 2011-2022 走看看