C++ 删除双链接列表中小于给定值的值

C++ 删除双链接列表中小于给定值的值,c++,linked-list,C++,Linked List,我正在写一个模拟音乐播放列表的代码。我的一个功能应该删除给定年份之前的所有歌曲。但我在让代码正常工作时遇到了一些问题。该函数不会删除节点,当我在运行该函数后使用函数打印列表时,它是完全不变的。有人能帮忙吗 作用 void deleteLessThanYear(int y) { Node* current = head; //position current at head if( head == NULL) { cout << "No n

我正在写一个模拟音乐播放列表的代码。我的一个功能应该删除给定年份之前的所有歌曲。但我在让代码正常工作时遇到了一些问题。该函数不会删除节点,当我在运行该函数后使用函数打印列表时,它是完全不变的。有人能帮忙吗

作用

void deleteLessThanYear(int y)
{
     Node* current = head; //position current at head

      if( head == NULL)
      { cout << "No nodes in list" << endl << endl;}

      while(current->getYear() > y)
      {
        current = current->getNext();
        if (current->getYear() <= y)
        { 
          Node* currentPrev = current->getPrev();
          Node* currentNext = current->getNext();

          currentPrev->setNext(currentNext);
          currentNext->setPrev(currentPrev);
          delete current; 
        }
      }
void deleteLessThanYear(整数y)
{
Node*current=head;//将当前位置放在head
if(head==NULL)
{coutgetnext();
如果(当前->getYear()getPrev();
节点*currentNext=current->getNext();
currentPrev->setNext(currentNext);
currentNext->setPrev(当前Prev);
删除当前文件;
}
}
.main函数调用

cout << endl;
cout << "------------------------------" << endl;
cout << "DELETE LESS THAN YEAR" << endl;
playlist->deleteLessThanYear(2005);
playlist->printList();

cout查找要删除的节点时,您没有正确遍历列表。如果列表为空,则代码将崩溃。如果循环遇到的节点不早于指定年份,则循环过早结束。删除节点时,代码没有正确考虑该节点位于前面或后面的可能性名单的第一部分

请尝试以下方法:

void deleteLessThanYear(整数y)
{
Node*current=head;//将当前位置放在head
如果(!头)
{
cout getPrev();
如果(currentPrev)currentPrev->setNext(currentNext);
如果(currentNext)currentNext->setPrev(currentPrev);
如果(当前==水头)水头=当前下一步;
删除当前文件;
}
当前=当前下一步;
}
while(当前);
}

您的实现中有几个错误:

  • if(head==NULL)
    条件中没有
    return;
    语句。如果在达到此条件后不返回,则会运行
    current->getYear()
    ,导致
  • while(current->getYear()>y)
    条件中不检查
    current!=NULL
    条件。如果列表的所有值都大于
    y
    ,则您将遍历整个列表,从而到达末尾,即
    NULL
    指针,这将再次导致
    分段错误
  • 如果
    head
    具有年值
    y
    ,因此仅删除下一个节点,但您提到要删除“所有”歌曲,该怎么办?您需要遍历完整列表并删除所有具有年值y的节点 while(head!=NULL&&head->getYear()>y){ head=head->getNext(); } if(head==NULL) { coutgetnext(); currentPrev->setNext(currentNext); //您需要在此处检查currentNext是否存在 如果(currentNext!=NULL){ currentNext->setPrev(当前Prev); } current=currentprov; } 当前=当前->获取下一步(); } }
  • 这似乎是最好的解决方法,通过在调试器中单步执行代码,查看执行流何时不再与预期流匹配。(保持列表简短以便调试。)
    void deleteLessThanYear(int y)
    {
        // Handling the case if head has year > y
        while(head != NULL && head->getYear() > y){
            head = head->getNext();
        }
    
        if( head == NULL)
        {
            cout << "No nodes in list" << endl << endl;
            return; // return
        }else{
            head->setPrev(NULL);
        }
    
        Node* current = head; //position current at modified head
    
        while(current != NULL){
            if(current->getYear() <= y){
                Node* currentPrev = current->getPrev();
                Node* currentNext = current->getNext();
                currentPrev->setNext(currentNext);
                // You need to check here if currentNext exists or not
                if(currentNext != NULL){
                    currentNext->setPrev(currentPrev);
                }
                current = currentPrev;
            }
            current = current->getNext();
        }
    }