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