[問題] C在linked list中assign node的問題?
大家好,最近在實作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
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
01/13 21:15, 5F
→
01/13 21:15,
1周前
, 6F
01/13 21:15, 6F
是,我註解這樣寫可以過,因為我需要obj最後指向第一元素,我也理解中間的過程。我
只是不知道沒有註解的部分錯在哪裡?和不了解中間的機制
※ 編輯: vhunter (101.9.131.1 臺灣), 01/13/2025 21:27:02
推
01/13 21:27,
1周前
, 7F
01/13 21:27, 7F
→
01/13 21:27,
1周前
, 8F
01/13 21:27, 8F
→
01/13 21:27,
1周前
, 9F
01/13 21:27, 9F
→
01/13 21:27,
1周前
, 10F
01/13 21:27, 10F
→
01/13 21:27,
1周前
, 11F
01/13 21:27, 11F
→
01/13 21:27,
1周前
, 12F
01/13 21:27, 12F
→
01/13 21:27,
1周前
, 13F
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
01/14 00:00, 14F
推
01/14 00:36,
1周前
, 15F
01/14 00:36, 15F
→
01/14 00:37,
1周前
, 16F
01/14 00:37, 16F
→
01/14 00:39,
1周前
, 17F
01/14 00:39, 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
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
01/14 19:44, 20F
→
01/14 19:44,
1周前
, 21F
01/14 19:44, 21F
→
01/14 19:44,
1周前
, 22F
01/14 19:44, 22F
→
01/14 19:44,
1周前
, 23F
01/14 19:44, 23F
→
01/14 19:44,
1周前
, 24F
01/14 19:44, 24F
→
01/14 19:44,
1周前
, 25F
01/14 19:44, 25F
→
01/14 19:44,
1周前
, 26F
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