2013-12-22 63 views
0

我嘗試使用下面的代碼分配指針anathor改變其值

void deleteMatchNode(node **list, int match) 
{ 
    node **temp = list; 
    node **prev = NULL; 
    while (*temp != NULL) 
     { 
      if ((*temp)->member == match) 
       { 
        printf ("match found\n"); 
        break; 
       } 
      prev = temp; 
      temp = &(*temp) ->next; 
     } 
    printf("gg1 %p %p\n", *temp, *prev); 
    (*prev)->next = (*temp)-> next; 
    printf("gg %p %p\n", *temp, *prev); 
    printList(*list); 
    //free(*temp); 
} 

但分配給從鏈表中刪除一個節點(*溫度) - >旁邊(*上一個) - >接下來是改變* temp的值,有人可以指出錯誤。 printList按預期工作,但一旦在* temp上調用free,列表就會被破壞。

+1

請格式化您的代碼。 –

+0

'temp'指向'list',所以它們是等價的。如果你在一箇中做某件事,那麼你在另一件事中做。 –

回答

0

我並不完全瞭解您的代碼,但我認爲在您的代碼中: (*prev)->next等於*temp正因爲如此,當您釋放temp時,鏈接列表被破壞。
我建議你使用這個:

void deleteMatchNode(node **list, int match) 
{ 
    node *temp = *list; 
    node *prev = NULL; 
    while (temp != NULL) 
     { 
      if (temp->member == match) 
       { 
        printf ("match found\n"); 
        break; 
       } 
      prev = temp; 
      temp = temp ->next; 
     } 
    printf("gg1 %p %p\n", temp, prev); 
    if(temp == *list){ 
      *list = temp->next; 
    }else{ 
      prev->next = temp->next; 
    } 
    printf("gg %p %p\n", temp, prev); 
    printList(*list); 

    free(temp); 
} 
+0

您需要額外的間接級別,否則您無法刪除列表中的第一個節點。 – Barmar

+0

你剛纔所做的修改,添加'if(temp == list)...',並不能解決這個問題。你正在更新本地變量list,但不是調用者的指針。他仍然會有一個指向現在釋放的節點的指針。 – Barmar

1

我想在你的代碼的間距是誤導性的。

prev = temp; 
temp = &(*temp) ->next; 

這是一樣的:

prev = temp; 
temp = &((*temp)->next); 

鑑於以前的分配你可能會創作的這個爲:

temp = &((*prev)->next); 

所以temp(*prev)->next所以自然分配給(*prev)->next改變值爲*temp,因爲它們是指向同一對象的兩種方式。

你可能想只保存一個指向節點從列表中刪除後釋放:

Node *save = *temp; 
(*prev)->next = (*temp)->next; 
free(save); 

有針對您需要檢查NULL指針將possiblities的。如果循環在第一次迭代時退出,則prev將爲空,如果由於*temp爲空而導致循環退出,那麼自然*temp爲空。你需要考慮這兩種情況。

0

當您離開while循環時,*tempNULL。因此,(*temp)->next不是有效的指針。

+0

除非循環已經通過'break'語句退出。 –