2016-05-19 64 views
0

我需要做一個函數,它會刪除c中鏈表的前n個節點並返回刪除的節點數。如果列表小於n,它應該變空。 另外,我不能使用遞歸。C - 鏈接列表:free()函數正在刪除我的頭節點;我如何正確使用free()?

現在的代碼,它的工作原理,但我沒有釋放「刪除」節點的內存。如果我取消應該釋放內存的一部分,我得到codeboard.io此錯誤:

Input: 5 + [ 61 62 63 64 65 66 ] 
Output: expected 5 + [ 66 ] 
     obtained 5 + [19333664 ] 

這個隨機數似乎是,它在內存中訪問「垃圾」。 如何正確釋放我不再使用的節點?裏面listas.h

代碼:

typedef struct lligada { 
    int valor; 
    struct lligada *prox; 
} *LInt; 

LInt newLInt (int, LInt); 

int drop (int, LInt *); 

內listas.c

#include <stdlib.h> 
#include "listas.h" 

int drop (int n, LInt *l){ 
    int count = 0; 
    LInt *aux; 
    while(n>0 && (*l)!=NULL){ 
      n--; 
      count++; 
      //aux = &((*l)); 
      *l = (*l)->prox; 
      //free(*aux); 
    } 
return count; 
} 
代碼

Codeboard鏈接鍛鍊:https://codeboard.io/projects/16259

+1

我在寫回答時忽略了'l'是一個雙指針的事實。對不起。通常建議使用普通指針而不是多級指針。 – jboockmann

+0

好的,明白了。我想我現在明白了! –

+0

強烈建議:不要通過'typedef'隱藏'指針'。相反,使用typedef爲結構提供一個'short'名稱,然後在聲明該結構的實例時,將其作爲指針。 – user3629249

回答

1

注意LInt它定義爲一個指針struct lligada。因此,drop函數的l參數是一個指向到struct lligada的指針。我們稱LInt變量l指向list_head

因此,該行:

aux = &((*l)); 

中實際上是分配給auxlist_head和地址不是struct lligadalist_head點。

因此,該解決方案將是確定auxLInt然後執行:

aux = *l; 
*l = (*l)->prox; 
free(aux); 

希望有所幫助。

1

我得出了類似的解決這一jboockmann通過不做一個雙指針,但作爲我在他的解決方案下的援助我不明白爲什麼這是錯的。

int drop (int n, LInt *l){ 
    int count = 0; 
    LInt aux; 
    while(n>0 && (*l)!=NULL){ 
      n--; 
      count++; 
      aux = *l; 
      *l = (*l)->prox; 
      free(aux); 
     } 
    return count; 
}