1. 程式人生 > >關於鏈表算法需要註意的空指針異常

關於鏈表算法需要註意的空指針異常

inf temp pos http 否則 mage 就是 alt 進入

在學習數據結構時,相信不少筆友們會被指針這個知識點困住,小小的一個設計到指針的算法可能會耗費你很多時間才可能完善,歸咎到底就是沒有註意到空指針的發生。本人在下面舉個栗子:

已知一個帶頭節點的單鏈表L,其節點如下定義:

1 template <typename T>
2 struct LinkList{
3 T data;
4 LinkList<T> * head;
5 }

現在設計一個算法,查找最後一個值為e的節點的邏輯結構:
呵呵,看著挺簡單的吧,只需要遍歷一遍鏈表即可查找到結果,下面附上我的原始代碼:

 1 template <typename T>
 2
int FindLast(LinkListClass<T> L,T e) 3 { 4 LinkList<T> * p=L.head; 5 int position=0,i=0; 6 while(p!=NULL) ① 7 { 8 p=p->next; ② 9 i++; 10 if (p->data==e) ③ 11 position=i; 12 } 13 14 return position; //如果查找成功返回其邏輯序號,否則返回0
15 }

然後我編譯,鏈接一下,都沒有報錯,可是在運行過程中就會出錯無法繼續運行,這就是運行時錯誤

技術分享圖片

看看,根本不知道是何錯,於是我調試了一下,發現問題的根本在於上面源碼的一二三標記處的次序。

這個函數忽略了空指針異常報錯,如果當指針p指向鏈表L的尾節點時,此時進入while循環,經過語句②,p==NULL了,然後執行③就會包空指針異常

問題找到了,解決起來就會容易得多,下面我舉出一種解決代碼(其實還有很多)

 1 template<typename T>
 2 int FindLast(LinkListClass<T>& L, T e)
 3 {
 4
int position = 0; 5 int i = 1; 6 LinkList<T> * p = L.head->next; 7 while (p != NULL) 8 { 9 if (p->data == e) 10 position = i; 11 i++; 12 p = p->next; 13 } 14 return position; 15 }


怎麽樣,問題雖小,但是需要註意啊!平時編程一定要註意這些邊界值問題,尤其是涉及到指針的算法。

關於鏈表算法需要註意的空指針異常