2012-08-08 31 views
0
static void just_traverse(sll **head_ref) { 
    sll *first = *head_ref; 
    sll *second = (*head_ref)->next; 

    if(second == NULL) { 
      return; 
    } 

    just_traverse(&(second)); 
    *head_ref = second; 
    printf("%d \t",second->payload); 
} 

在上面的代碼中,如果我刪除* head_ref = second;然而我得到的輸出相對於堆棧如果我把這一行* head_ref = second;它總是打印最後一個元素{4,3,2,1},然後總是打印1?任何人都可以解釋爲什麼?關於程序堆棧執行的鏈接列表程序流程

+0

你到底想達到什麼目的?如果你只是遍歷爲什麼你通過**而不是sll *? sll的定義是什麼? – 2012-08-08 19:21:30

+0

此代碼是遞歸反向鏈表的一部分list.can任何人請告訴我爲什麼「第二個」指針永遠不會改變 – 2012-08-08 19:36:47

+0

如果您確實需要反轉而不是僅以相反的順序輸出值。我在答案中發佈了一些你需要做的改變。 – 2012-08-08 20:15:56

回答

0

如果您的列表包含{4,3,2,1},那麼您的輸出應該是1 1 1的權利。

這是因爲聲明*head_ref = second;。在第3次調用函數just_traversehead_ref將指向2second將指向1。現在您正在更新**head_ref1。現在您正在打印second。因此,輸出將是價值1

,然後它會返回第二個呼叫,這裏head_ref3second1(不2監守我們所有的3更新)。現在開始分配1來打印並打印second。再次,它將只打印值1

,然後它會返回到第一個呼叫,這裏head_ref4second1(不3因爲我們在第二個呼叫更新)。現在開始分配1來打印並打印second。再次,它將只打印值1

所以輸出將三1

1 1 1 
+0

感謝您的回答,但我有問題「然後它會返回到第二個電話,這裏head_ref是2,第二個是1(不是2因爲我們在第3次全部更新)。」但在第三次調用中,我們更新了* head_ref而不是第二次,即* head_ref = second;那麼爲什麼「second」的值不會改變 – 2012-08-09 03:11:34

+0

@ error_404:在第三次調用中,您更新了** head_ref,這在第二次調用中只是「second」。因爲從第2次來電通過傳遞'second'的地址所以打電話給第3次電話。如果喜歡,也可以提出答案。 – rashok 2012-08-09 03:24:46

0
  1. 您可能會嘗試調試以找出錯誤地設置指針的原因。

  2. 可能性就應該是以下

    just_traverse(&(第二)); second-> next = first; first-> next = NULL;

0

我想你想弄得太複雜 - 這不是測試,但至少是一個單向鏈表上做遞歸反向走一個簡單的模式:

static void just_traverse(sll *head_ref) { 
    if (head_ref == NULL) { 
      return; 
    } 

    just_traverse(head_ref -> next); 

    printf("%d \t",head_ref->payload); 
}