所以我是資料結構的新手,我正在嘗試使用鏈表。我做了一個Node類,有一個int key、int del和Node* next。 當我試圖通過給洗掉函式(Del)一個鍵來洗掉節點時,它對頭部節點或串列中存在的任何節點都能完美作業,但當我給一個不存在于串列中的鍵時,它回傳了一個分段故障。
void Node: :Del(int k) //此處k是給定的搜索鍵
{
Node *curr = head; //ptr that traverses the list。
Node *temp = NULL; //指標跟蹤curr后面的節點,存盤curr后面一個位置的節點值。
while (curr->key != k && curr != NULL)
{
temp = curr;
curr = curr->下一個。
}
if (curr == NULL) // if key not found (not working properly)
{
return。
}
else if (curr == head) // if head contains the key
{
head = curr->next;
delete curr;
return。
}
else if (curr->key == k) // if key exists in the node.
{
temp->next = curr->next。
delete curr;
}
}
int main()
{
節點n1。
n1.Insert(1, 1) 。
n1.Insert(2, 2) 。
n1.Insert(3, 3) 。
n1.Insert(4, 4) 。
n1.Insert(5, 5) 。
n1.Del(7)。
n1.print()。
輸出:
1 1
2 2
3 3
4 4
5 5
zsh:分段故障
我有一個條件,在遍歷之后 if( curr == NULL ){ return;}意思是它一直搜索到最后,沒有找到鍵并退出回圈(按照我的理解),而是它回傳分段故障。
uj5u.com熱心網友回復:
在這一行(curr->key != k && curr != NULL)你應該先檢查curr是否為空,在訪問curr之前檢查它的鍵值,所以它應該是(curr != NULL && curr->key != k)
。解釋一下。 當節點不存在時--我看到在你的代碼中你假設節點的鍵是唯一的--所以你仍然回圈鏈接串列直到curr變成空,并且while條件檢查最后一次,在這個時候curr是空的,所以它訪問一個NULL指標,導致你的分離故障。但如果你首先檢查curr是否為空,編譯器將AND條件視為假,然后繼續檢查后面的狀態,你就安全了。
uj5u.com熱心網友回復:
這一行有問題:
while (curr->key != k && curr != NULL)
第二個條件,即curr != NULL,是不相關的。它應該被顛倒過來:
while (curr != NULL && curr-> key != k)
這樣,如果curr是NULL,第二個條件將不會被評估(這被稱為短路評估)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/321887.html
標籤:
下一篇:使用strcpy后不列印字串
