關於鏈表算法需要註意的空指針異常
阿新 • • 發佈:2018-02-03
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> 2int 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; //如果查找成功返回其邏輯序號,否則返回015 }
然後我編譯,鏈接一下,都沒有報錯,可是在運行過程中就會出錯無法繼續運行,這就是運行時錯誤
看看,根本不知道是何錯,於是我調試了一下,發現問題的根本在於上面源碼的一二三標記處的次序。
這個函數忽略了空指針異常報錯,如果當指針p指向鏈表L的尾節點時,此時進入while循環,經過語句②,p==NULL了,然後執行③就會包空指針異常
問題找到了,解決起來就會容易得多,下面我舉出一種解決代碼(其實還有很多)
1 template<typename T> 2 int FindLast(LinkListClass<T>& L, T e) 3 { 4int 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 }
怎麽樣,問題雖小,但是需要註意啊!平時編程一定要註意這些邊界值問題,尤其是涉及到指針的算法。
關於鏈表算法需要註意的空指針異常