鏈表的插入問題

來源:互聯網
上載者:User

標籤:

BUG:今天我寫了一個很SB的代碼,這個問題其實我早己注意到,在以前寫這樣的代碼的時候,我也留了個心眼,但可能是很長時間不寫這些東西導致新問題的產生。其實這個問題我以前也寫過筆記,現在再寫一下加深印象。先附代碼:
  1. #ifndef LIST_INSERTREMOVEPRINT_H
  2. #define LIST_INSERTREMOVEPRINT_H
  3. #include<iostream>
  4. struct ListNode{
  5. int val;
  6. struct ListNode *nxt;
  7. };
  8. void addListNode(struct ListNode*list,int value){
  9. struct ListNode *nodeInsert=(struct ListNode*)(malloc(sizeof(struct ListNode)));
  10. nodeInsert->val=value;
  11. nodeInsert->nxt=NULL;
  12. if(list==NULL){
  13. list=nodeInsert;
  14. return ;
  15. }
  16. struct ListNode *iter=list;
  17. while(iter->nxt!=NULL){
  18. iter=iter->nxt;
  19. }
  20. iter->nxt=nodeInsert;
  21. }
  22. #end
其實熟悉的人一看就知道問題出在哪了!!!!!高亮部分就說明了這個問題。犯這個錯誤的原因在於對指標的傳遞不太明白。
  1. void addListNode(struct ListNode*list,int value)
在這個函數中有兩個形參,一個是鏈表節點的指標類型,別一個是int 型囉。對於這個鏈表節點指標,我們傳入的是什麼呢?當然,傳入的是一個地址嘛,因為它是指標。嗯,我們是如何傳遞這個指標的呢,傳值嘛!!!!!!!。你傳遞地址還是傳值啊,只是這個值是”地址“而己嘛。既然明白這點,那麼問題來了,你在函數體內改這
  1. list=nodeInsert
你這個是什麼意思啊?,,,把這個nodeInsert地址付值給list ?也就是你有這麼個函數
  1. void test(int a,int value){
  2. int c;
  3. a=c;
  4. }
你這是什麼意思? 你還真想通過在函數體內的a=c 來改變實參值嗎? 滾你媽的。
  1. iter->nxt=nodeInsert;
這個就更扯蛋了,你還是在改變形參中的值,這個肯定不行啦。
如何解決這個BUG      1,  如果要通過形參改變實參,對於這個地址的傳值問題,可以通過 "*" -----解引用運算子。
       也就是我們通過這個解引用這個形參,這樣找到形參地址對應的空間,在記憶體裡面改變這個實三的值。       2,傳入指標的指標,再用解引用運算子。       反正得解引用才能通過形參改實參!!!!!!      


來自為知筆記(Wiz)

鏈表的插入問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.