1樓:匿名使用者
從你**中看出,p1是用來在迴圈中不斷接收新建的結構地址的,p2是個中介,用於不斷將新建立的結構連線起來。
在迴圈之外,先建立一塊結構記憶體空間,p1和p2都指向同一個地址,只是為了初始化,其實對p1賦值為了防止指向無效空間,沒其他意義,進入迴圈體p1會不斷被更改重新整理。初始化時第一塊結構中的next是未知的。
n為計數器,用於標識第一次迴圈:
當n==1時,將p1的地址賦值給head,其實此處用p2效果一樣,都是將迴圈外建立的結構賦值給head,作為頭節點,因為n==1的情況只會發生一次,而第一次迴圈時p1==p2。條件分支之後,執行p2=p1,此語句為了將上次迴圈中儲存在p1中新建的記憶體空間地址賦值給p2備份,用於下一個迴圈連線節點的,對於第一次的確是重複賦值了,但是這樣寫可以減少**量,否則還要加個條件就沒必要了。
當n!=1時,即非第一次迴圈時,先將上一次p1指向的地址(最後一次建立的記憶體塊)連線到p2指向的結構中的next,使得新建的結構與上一個結構連線起來,然後將p1賦值給p2,即更新p2,接力棒一樣傳遞到下個迴圈,隨後建立新結構給p1,並要求輸入資料,然後再次迴圈。
好了,現在你應該明白,p1->next始終是無效的,從第二次迴圈開始,由於n!=1,所以會執行p2->next=p1,而p1是前一次迴圈建立的新節點,p2就是前一次迴圈的p1,就是這時候賦值的,從而將前後兩個節點連線起來的。
因此你可以看出,這個程式有bug的,最終總有一塊記憶體洩露,不僅僅p1的next,而在於新建的記憶體塊,在p1->num==0時,退出函式,這塊記憶體塊沒被連線到最後節點,也沒被釋放。
2樓:仙戈雅
是這樣的:當首次進入while迴圈體後,n等於1的,此時head指向p1,然後p2也同時指向p1,待第二次迴圈時,n不等於1,此時p1(當前結點)作為上次的結點(p2)的後繼,這裡對應p2->next=p1;
然後p2=p1,這句**的意思是讓當前結點作為最後結點,直到輸入num為0為止,最重要的這行還起到防止掉鏈的作用,即把後面的結點串聯起來。
星座問題求解答,關於星座的問題,求解答
摩羯座和天蠍座配嗎?配對評分 90 非常理想的一對 星座比重 56 44 解析 十回 二星座也有四大天王答,分別是土象的萬王之王 摩羯 火象的地王 獅子,與白羊座的 孩子王 水象的陰王 天蠍。這四大天王相遇時,難免火氣都大一些 不過其中摩羯與蠍子的速配程度,遠遠超過其它兩大天王的組合。您們倆的共通點...
c語言如圖求解答,C語言中的問題如圖,求解答
你的b字串宣告成了指標,而後面賦值的內容則儲存在程式的常量區,是不允許修改的。要解決這個問題,把b的宣告改成陣列形式char b 這樣,b的意義是字元型陣列,資料被要求放在棧中,是可寫的記憶體地址,這樣就不會出錯了。char a i am a teacher char b you are stude...
請教一下c語言的連結串列問題,請教關於C語言 單連結串列的問題
建立一個連結串列有兩種方式,第一種,尾插入法,因為是按順序插入,遍歷連結串列他是順序的 第二種,頭插入法 這種插入可以將資料逆序儲存,其實,遍歷連結串列的時候他是逆序的 根據 這個應該是建立連結串列的頭插入法 p next head next head是頭結點,head next是指向下一個結點,當...