-4

我正在使用C++進行數據結構課程,我們應該實現一個簡單的單鏈表結構。訪問空指針來檢查C++中的鏈表是否爲空

我有所有其他的方法,但當我檢查列表是否爲空時,它實際上,程序崩潰,導致分段錯誤。

當列表是空的,我的鏈表結構應該是這樣的:

HEAD - > NULL

而如果它不是空的,它應該是這樣的:

HEAD - > ...... - > NULL

我isListEmpty()看起來像:

bool singleList::isListEmpty(void) { 
    return (head->next == NULL); 
} 

我敢肯定,當我嘗試訪問一個空指針時轉儲核心,但我不知道在哪裏。任何建議我應該看什麼?

謝謝。

- 編輯 -

對不起,我還不夠清楚。

我敢肯定頭本身是不是一個空指針,因爲在檢查,如果我的代碼工作,我喜歡的東西的工作:

list.list_insert_front(guy1); 
list.list_insert_front(guy2); 
list.list_remove(guy1); 
list.list_remove(guy2); 
list.isListEmpty(); //This line causes segmentation fault. 
+5

您是否考慮過'head'可能是NULL的可能性?無論如何,要麼學着使用調試器,要麼給我們提供[mcve]。 – YSC

+0

你確定'head'不是'nullptr'的空列表嗎?這意味着默認的構造函數(可能構造一個空列表)創建一個「頭」。也許你打算檢查'head'是否爲空列表的'nullptr'。 –

+0

您的插入和刪除函數調用並不能確保'head'不爲空,您可能會添加或刪除函數內部的錯誤鏈接。將你的函數改爲'head == null'來測試它。 – Confuzing

回答

0

大部分的時間,在一個空列表headnull ,而不是它的next

看看兩次初始化,並決定是否需要檢查head或它的nextnull性。

+0

感謝您的回答。但是我們被告知要這樣實現它,這樣一個名爲「head」的元素將永遠存在,並且它將指向鏈表的第一個元素。 –

+0

@정진하你可以擁有一個總是存在的頭部,但是如果沒有第一個元素,那麼'head'是'NULL' – user463035818

+0

@ tobi303哇,我真是太愚蠢了,謝謝。我還在學習使用gdb,我想這應該可以幫助我減少這些問題。非常感謝! –

0

Head是保持列表的第一個節點的軌道的指針。如果列表爲空,則頭應該指向空值。

當您嘗試訪問head-> next時,間接檢查是否存在第一個節點(第二個節點)的下一個。

要查找列表是否爲空,您需要檢查頭是否爲NULL。

bool singleList::isListEmpty(void) { 
    return (head == NULL); 
} 
+0

頭部不必是列表中的項目,可以簡單地用於跟蹤列表,取決於如何編程。雖然我同意他需要檢查頭是否爲空。 – Confuzing

+0

是的,頭只是一個定位點。在最簡單的實現中,它只是一個跟蹤指針。我們也可以實現一個頭節點,它永遠不會爲NULL,並保存關於列表的元數據(如大小,節點數,訪問時間等)和指向第一個數據節點的指針。 – nyemul

0

據我所知,即使你應該有一個單獨的頭節點,它將在每次列表爲空時爲空。

如果列表不爲空,它只會指向列表的第一個節點。

例如:

LIST:A-> B->Ç - > ...-> Z->空 在這種情況下你的頭將指向A.(相反的HEAD將是例如A.頭= A)

LIST:null(head = null)

+0

如果頭節點是獨立的,那麼通常它不應該是空的,至少在我的經驗中是這樣。它可以是一個單獨的類,其中包含有關列表的數據或未使用的列表項,它們只是指向下一個列表的開始。 Null意味着它只是指向第一個項目的指針,而不是單獨的頭節點。 – Confuzing