C語言連結串列列印

時間 2022-03-12 19:55:29

1樓:匿名使用者

那要看你的adddata()是怎麼構造的。

如果你一定要用程式裡這種方式呼叫,那就把head的指標傳到adddata裡,即adddata(&head) 假設adddata本身沒問題,且裡面記憶體在堆裡分配,是放在這個函式裡用malloc之類分配的,裡面所有對head的操作都用(*head)來表示。這樣,display出來就是連結串列裡的值了。

否則,你把head=null傳到函式裡,在呼叫的時候,函式自己會另外生成一個棧,這個棧把參數列複製了一份,及臨時變數,環境等等都放在裡,把head複製了一份,你adddata裡所有的操作都是針對這個複本來操作的,假設你在adddata裡呼叫display是沒有問題的。

但如果在函式外面呼叫,也就是函式返回時候再display, 那這個函式adddata的棧已經銷燬,那個複本head已經不再存在。即使存在,這個複本由於你指向了malloc了新記憶體,已經和外面那個原始head指向的地址不是一個了。外面原始head還是null.

所以列印不出來,while(head!=null)一直不成立,迴圈進不去。只能執行迴圈外的語句,也就是列印"no data".

這就是指標的詭異之處,和普通變數的呼叫傳遞機制是不同的。在你的函式裡,由於外面的head一直沒機會被賦予adddata裡新定義的記憶體,導致這部分記憶體在adddata退出後無法使用,也無法**,產生記憶體洩露。

2樓:穩住大神

因為你的頭結點是null!

所以沒有進while迴圈!

void display (link *head)printf ("no data!\n");}

3樓:匿名使用者

link *head=null; 這裡定義了個連結串列指標

adddata (head); 這裡傳的是指標本身的值null 這樣子函式中adddata()無論怎麼修改形參的值,都不會改變實參head的值! 因此,建議修改adddata()為 link *adddata( void ) , 呼叫這裡寫成:head=adddata() ;就好了!

c語言 單向連結串列如何排序,C語言 單向連結串列如何排序?

問明 void link order stu p head stu pb,pf,temp pf p head if p head null 連結串列為空printf needn t order.n return if p head next null 連結串列有1個節點 printf only on...

c語言連結串列 連結串列裡p next是怎麼指向下結點?它是

希伯來爵 struct node n1,n2 定義兩個節點n1.next n2 n1和n2連線起來n2.next null n2的下個節點為空struct node n3 增加一個節點n2.next n3 n2和n3連線起來n3.next null n3的下個節點為空這樣你明白了嗎 p next其實...

C語言中連結串列與佇列有很麼區別,C語言佇列,連結串列分別怎麼用?

樓主你好。連結串列是一種資料結構,而佇列是一種抽象的概念,就像棧一樣。船是一個比較抽象的概念,具體實現有木船 鐵船等等。佇列好比是船,連結串列好比是造船的材料。佇列可以用連結串列實現,也可以用動態陣列實現,這個抽象的概念可以用各種具體的資料結構實現。sqqueue的第一個元素elemtype ele...