[問題] C在linked list中assign node的問題?

看板Programming作者 (SPC)時間1周前 (2025/01/13 15:56), 1周前編輯推噓5(5022)
留言27則, 3人參與, 1周前最新討論串1/1
大家好,最近在實作linked list 最下面是程式的節錄 AddAtHead是想將node新增在linked list的開頭 在AddAtHead中的註解是compile會過答案正確的程式,它的下面三行是我有問題的部分 它們的錯誤輸出範例是如果我有一個linked list是2->7,想在前面加一個1的node 此時會變成1->7而不是1->2->7 印(obj->val,obj->next->val)和(tem->val,tem->next->val)出來都是(1,7) 我一開始想將obj指向linkedlist的頭所以用obj=tem; 我以為的錯誤會是obj和tem變成迴圈的linked list或是都變成1->2,結果是1->7,百思 不得其解 所以想問大家知道這個運算obj=tem;中發生了什麼事? 為什麼只要像註解一樣避開obj=tem;就可以? 謝謝大家 typedef struct linklist{ int val; struct linklist *next; } MyLinkedList; void AddAtHead(MyLinkedList* obj, int val) { MyLinkedList* tem = malloc(sizeof(MyLinkedList)); // tem->val=obj->val; // tem->next=obj->next; // obj->val=val; // obj->next=tem; tem->val=val; tem->next=obj; obj=tem; } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 101.9.131.1 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Programming/M.1736755011.A.775.html

01/13 16:52, 1周前 , 1F
嗯,我覺得你需要畫圖幫助理解
01/13 16:52, 1F
有畫過,但我的問題應該是不知道那行運算實際做了什麼?以及為什麼會輸出那樣? ※ 編輯: vhunter (101.9.131.1 臺灣), 01/13/2025 18:30:52

01/13 21:15, 1周前 , 2F
你註解做的事情實際上是把新建的node放在
01/13 21:15, 2F

01/13 21:15, 1周前 , 3F
第二個,把值改成原本的頭,把原本頭的值
01/13 21:15, 3F

01/13 21:15, 1周前 , 4F
改成新值。而你想直接加到開頭的話,就應
01/13 21:15, 4F

01/13 21:15, 1周前 , 5F
該傳入pointer of pointer,把原本caller
01/13 21:15, 5F

01/13 21:15, 1周前 , 6F
擁有的obj pointer改成新建的node。
01/13 21:15, 6F
是,我註解這樣寫可以過,因為我需要obj最後指向第一元素,我也理解中間的過程。我 只是不知道沒有註解的部分錯在哪裡?和不了解中間的機制 ※ 編輯: vhunter (101.9.131.1 臺灣), 01/13/2025 21:27:02

01/13 21:27, 1周前 , 7F
obj變數指到的是head node,function call
01/13 21:27, 7F

01/13 21:27, 1周前 , 8F
er也應該有一個pointer指到head node,這
01/13 21:27, 8F

01/13 21:27, 1周前 , 9F
邊先假設叫headptr,而你在function中只能
01/13 21:27, 9F

01/13 21:27, 1周前 , 10F
透過obj修改head node,無法影響到外面的h
01/13 21:27, 10F

01/13 21:27, 1周前 , 11F
eadptr,如果要修改headptr,就應該傳一個
01/13 21:27, 11F

01/13 21:27, 1周前 , 12F
指到headptr的pointer,把headptr改成指向
01/13 21:27, 12F

01/13 21:27, 1周前 , 13F
tem。
01/13 21:27, 13F
應該不是,沒有註解的部分我在leetcode練習上編譯之後是正確的,中間我有印出來看也 是對的。因為傳遞的是指標結構,我想應該是call by address ,在function中的修改應 該會直接反應在global。問題感覺不在這裡? ※ 編輯: vhunter (101.9.131.1 臺灣), 01/13/2025 23:28:40

01/14 00:00, 1周前 , 14F
換成rust就是 mut obj:&mut Node
01/14 00:00, 14F

01/14 00:36, 1周前 , 15F
有比較完整的程式碼嗎?我拿你的function
01/14 00:36, 15F

01/14 00:37, 1周前 , 16F
測試,跑不出你的結果。
01/14 00:37, 16F

01/14 00:39, 1周前 , 17F
這是leetcode的題目,它的主程式沒有放出來,我也只是寫function出來而已,題 目是leetcode的707.Design Linked List 如果主程式我自己寫的話是這樣 https://onecompiler.com/c/435zq7nr9 結果和內文的錯誤一樣

01/14 13:07, 1周前 , 18F
欸,我拿便利貼模擬一下應該不會這樣啊
01/14 13:07, 18F

01/14 13:07, 1周前 , 19F
,7 的item 也沒被重新分配,奇怪了
01/14 13:07, 19F
不知道,我也覺得很奇怪QQ ※ 編輯: vhunter (101.9.131.1 臺灣), 01/14/2025 14:02:50 ※ 編輯: vhunter (101.9.131.1 臺灣), 01/14/2025 14:26:14 ※ 編輯: vhunter (101.9.131.1 臺灣), 01/14/2025 14:31:32 ※ 編輯: vhunter (101.9.131.1 臺灣), 01/14/2025 14:35:03

01/14 19:44, 1周前 , 20F
你的main funtion的obj變數一直都是指在7
01/14 19:44, 20F

01/14 19:44, 1周前 , 21F
的那個node,只是因為你是在add function
01/14 19:44, 21F

01/14 19:44, 1周前 , 22F
中印list,所以才會好像有加進list的錯覺
01/14 19:44, 22F

01/14 19:44, 1周前 , 23F
,實際上在main的obj看到的一直只有一個no
01/14 19:44, 23F

01/14 19:44, 1周前 , 24F
de,也就是一開始create的node。第一次加
01/14 19:44, 24F

01/14 19:44, 1周前 , 25F
入7會成功,是因為add function是把第一個
01/14 19:44, 25F

01/14 19:44, 1周前 , 26F
node的value改成7,後面的add對main來說是
01/14 19:44, 26F

01/14 19:44, 1周前 , 27F
無作用的
01/14 19:44, 27F
我試過幾次之後發現tem MyLinkedList* tem = (MyLinkedList* )malloc(sizeof(MyLinkedList)); 改成 MyLinkedList* tem; 這樣就好的話就可以正常移動指標,因為我只需要一個指向node的指標就好而不是需要一個node 如果需要新增node則是不能移動obj,所以leetcode上很多答案都是obj指向next是第一元素head,而不是讓obj直接當head 應該是這樣,感謝大家的回答!! ※ 編輯: vhunter (101.9.131.1 臺灣), 01/15/2025 00:32:59
文章代碼(AID): #1dXCT3Tr (Programming)