→ j5128709: 猜測 x->link=q; 往回指了,p就拿不到下一個了 01/14 00:06
推 Schottky: 你誤會 p=s 的 = 是 copy,其實只是 assign pointer 01/14 00:56
→ Schottky: 所以把 x 的 link 指向 q 時,p 的 link 也一樣指向 q了 01/14 00:58
→ harryooooooo: x p q初始化之後又馬上被assign不就都leak了嗎... 01/14 11:00
→ Schottky: 樓上說得完全沒錯,不過那不是出槌的直接原因 01/14 13:34
→ Schottky: 所以我和一樓才沒有講,但現在想想既然看見就應該要講.. 01/14 13:36
感謝各位耐心解說!
我又把reverse function重新寫過,在副程式內試著偷print出來結果是沒問題的。
但是現在發現問題點是在我回傳到main會回傳失敗,僅剩最後一個node指向null
看起來我回傳的功能寫得有問題...
int main()
{
node *t=new node();
t->link=NULL;
t->data=1;
for(int i=2;i<4;i++)
{
node *y=new node();
y->data=i;
y->link=t;
t=y;
}
print_list(t);
reverse_list(t); //reverse完成應該把list head回傳到t
printf("Reverse the list t:\n");
print_list(t); //但是會發現只印了最後一個node指向null
return 0;
}
void reverse_list(node *s)
{
node *prev=new node();
node *curr=new node();
node *temp=new node();
curr=s;//curr初始化為list頭
prev=NULL; //prev初始化成new list的bottom=null
while(curr!=NULL)
{
temp=curr->link; //temp儲存下一個node位址
curr->link=prev; //目前的node指回上一個node prev
prev=curr; //prev前進到目前的node
curr=temp; //目前node前進到temp存的位址
}
s=prev;
printf("Reverse the list prev偷印看看:\n");
print_list(s); \\在副程式結束前先偷印印看list head確認結果無誤
}
OUTPUT:
Original list t:
address=0xabbc60 data=3 nextpoint=0xabbc40
address=0xabbc40 data=2 nextpoint=0xabbc20
address=0xabbc20 data=1 nextpoint=(nil)
Reverse the list prev偷印看看:
address=0xabbc20 data=1 nextpoint=0xabbc40
address=0xabbc40 data=2 nextpoint=0xabbc60
address=0xabbc60 data=3 nextpoint=(nil)
Reverse the list t: //回傳失敗了
address=0xabbc60 data=3 nextpoint=(nil)
※ 編輯: Moderator (36.226.156.95 臺灣), 01/14/2020 18:02:16
推 Schottky: 回傳用 return 的呀,不要 assign 參數 s 01/14 18:26
→ Schottky: 參數是傳 s 的值進來而已,不是直接讓你存取 main 的 s 01/14 18:27
→ Moderator: 解決了 我的return type還通通寫錯 感謝熱心指導!! ^^ 01/14 19:40
推 ko27tye: 看一下call by value的解釋吧 s是copy傳進function的 01/14 19:46
→ Moderator: OK Thanks!! 01/14 23:21
推 alpq: void 不會有回傳值 要用void 就設global variable吧 01/22 11:56