2014-08-30 56 views
-1

我卡在這裏。 你能幫我嗎? 我似乎無法實現此功能「freeThis」。 我想釋放鏈接列表中的節點。清除鏈接結構中的每個節點

結構

struct node { 
    unsigned x; 
    double y; 
    struct node *next; 
}; 
typedef struct node Nodes, *This; 

宣言的功能

void freeThis(This *); 

功能

void freeThis(This *head) 
{ 
    This * tmp; 

    while (head != NULL) 
    { 
     tmp = head; 

     *head = *head->next; /*error is here I think */ 

     free(tmp); 
    } 

} 

UPDATE的執行!

當聲明如下

void freeNodes(Nodes *); 
這樣

void freeNodes(Nodes *a) 

    { 
     free(a); 
     printf(「sucess」); 
    } 

實現我會怎麼使用這個功能

的功能?

是否這樣?

freeNodes(*tmp); 
+2

簡答:不要typedef。 typedef僅用於混淆你。(直到你知道更好) – wildplasser 2014-08-30 23:27:34

回答

1

This爲指針類型:typedef struct node Nodes, *This;

注意,你並不需要一個指向指針,一個指針是不夠的,所以改變:

void freeThis(This *head) /* head is a pointer to pointer */ 
{ 
    This * tmp; 

void freeThis(This head) 
{ 
    This tmp; 

and

*head = *head->next; 

head = head->next; 
+0

'(* head)=(* head) - > next;'這工作,但我碰到另一個問題 – billybob 2014-08-30 23:05:05

+0

@billybob我懷疑它的工作。在語義上,它是不合理的。釋放鏈接列表的習慣方法不是取代**節點**本身,而只取代指針(想想看,原因很明顯)。另外,不要將指針隱藏在typedef後面。完全擺脫'This',並使用'Node *'。 – 2014-08-31 10:00:31

1

沒錯,問題就在這裏:

*head = *head->next; 

這是因爲運算符優先級。 - >先評估後再評估*。

嘗試

*head = (*head)->next; 

的更新:

如果您已聲明溫度爲

Nodes * temp 

然後調用函數

freeNodes(temp) 
+0

是的,這是有效的。 – billybob 2014-08-30 23:14:21

+0

你能幫我解決「更新」問題嗎? – billybob 2014-08-30 23:14:56

+0

你是如何申報臨時工的? – Arpit 2014-08-30 23:16:31

0

你也可以試試這個.. 。

void freeThis(Nodes **head) 
    { 
    Nodes *tmp; 

    while (*head) 
    { 
     tmp = *head;/*first node to be delete*/ 
     *head = *head->next;/*2nd node is updated as headpointer*/ 
     free(tmp);/* freeing first node & here you can call your freeNodes function...*/ 
    } 

}