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;
        }

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

  • 相关阅读:
    杂记
    [POI2015]PUS
    CF786B Legacy(线段树优化建图)
    SP11470 TTM
    [WC2010]重建计划
    [HNOI2014]世界树
    luogu P4842 城市旅行
    [SDOI2016]征途
    [APIO2014]序列分割
    上下界网络流构图证明
  • 原文地址:https://www.cnblogs.com/-glb/p/12345447.html
Copyright © 2011-2022 走看看