我試圖為我的作業實作這個簡單的鏈表專案。當我嘗試實作該removeByKey功能時,我遇到了一個問題,即當它找到要洗掉的密鑰時,它會完全斷開串列的其余部分。
這是課程:
class LancElem
{
private:
int key;
LancElem* next;
public:
LancElem(){next = nullptr;}
LancElem(int keyy, LancElem* nextt){key = keyy;next = nextt;}
LancElem* getNext(){return next;}
int getKey(){return key;}
void setNext(LancElem* nextt){next = nextt; }
void setKey(int keyy){key = keyy;}
};
洗掉功能:
void removeByKey(LancElem& head, int key){
LancElem* n = head.getNext();
while(n->getNext()!=nullptr){
if(n->getNext()->getKey()==key){
n->setNext(n->getNext()->getNext());
delete n->getNext();
break;
}
n=n->getNext();
}
}
當我嘗試洗掉最大的元素時:
原始鏈表:4 1 9 8 2 7 3 6 3
預期輸出:4 1 8 2 7 3 6 3
實際輸出:4 1 0
問題可能是我將當前元素連接到下一個->下一個元素,但我不知道為什么我的實作不好。
uj5u.com熱心網友回復:
問你自己:
n->next行后是什么n->setNext(n->getNext()->getNext());?該行delete n->getNext();洗掉了什么?
您不想delete剛剛更新next但要洗掉要洗掉的元素:
auto to_be_deleted = n->getNext();
n->setNext(to_be_deleted->getNext());
delete to_be_deleted;
uj5u.com熱心網友回復:
您的串列似乎有一個沒有值的虛擬頭節點。
由于使用運算式,該函式removeByKey可以在回傳空指標時呼叫未定義的行為head.getNext()n->getNext()
LancElem* n = head.getNext();
while(n->getNext()!=nullptr){
也在 if 陳述句中
if(n->getNext()->getKey()==key){
n->setNext(n->getNext()->getNext());
delete n->getNext();
break;
}
next由于先前使用函式分配了資料成員,您正在嘗試洗掉要洗掉的節點之后的節點setNext。
n->setNext(n->getNext()->getNext());
delete n->getNext();
請注意,由于您使用了兩次呼叫,您的函式無法洗掉虛擬頭節點之后的節點getNext()
LancElem* n = head.getNext(); // the first call of getNext
while(n->getNext()!=nullptr){
if(n->getNext()->getKey()==key){ // the second call of getNext.
//...
該函式可以定義為
void removeByKey( LancElem &head, int key )
{
if ( head.getNext() != nullptr )
{
if ( head.getNext()->getKey() == key )
{
LancElem *current = head.getNext();
head.setNext( head.getNext()->getNext() );
delete current;
}
else
{
LancElem *n = head.getNext();
while( n->getNext() != nullptr && n->getNext()->getKey() != key )
{
n = n->getNext();
}
if ( n->getNext() != nullptr )
{
LancElem *current = n->getNext();
n->setNext( n->getNext()->getNext() );
delete current;
}
}
}
}
現在嘗試使用此函式洗掉串列中值為 4 的第一個節點以及您當前擁有的函式并比較它們的結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/440088.html
下一篇:如何解決顫振類代碼中的這個錯誤
