2011-07-30 7 views
0

この関数は、リンクされたリストの特定のノードをとり、最後のノードにします。リンクノードのノードを最後のノードにする機能はありますか?

void lastNode(struct list *node) 
{ 
    struct list* temp = node->next; 
    node->next = NULL; 
    struct list* temp2; 
    while(temp) 
    { 

     temp2 = temp->next; 
     printf("%p \n",temp); 
     free(temp); 
     temp = temp2; 
    } 

} 

int main() 
{ 
    struct list d={4,NULL}; 
    struct list c={3,&d}; 
    struct list b={2,&c}; 
    struct list a={1,&b}; 


    struct list *node = &a; 

    lastNode(&b); 

    while(node) 
    { 
     printf("%d \n",node->d); 
     node=node->next; 
    } 
    return 0; 
} 

が、それはノードを解放してくれエラーを与えています。

+0

どのようなエラー...?それは好きです - "それは働いていない、助けて"または "医者、私の体の一部が痛い、私に普遍的な薬を与える、それはそれを修正する" .. –

+0

@Kiril http://codepad.org/QC8b0uHUセグメンテーションフォルトループ – Furqan

+0

これは別のものです:) –

答えて

1

をあなたの完全なコードを見て:それはへの法的ではありません

struct list c={3,&d}; 
struct list b={2,&c}; 

lastNode(&b); 

freetempmallocを使用して割り当てられていないためです。

struct list* temp = node->next; /* temp is now &c. You can't free it. */ 
while(temp) 
{ 
    /* ... */ 
    free(temp); /* Tries to free &c which is on the stack. */ 
} 
+0

ノードがmallocを使用して割り当てられたとしても、tempはリストを反復処理するためにのみ使用され、ノードを「所有」しません。 –

1

更新:これは、フリー関数の呼び出し元が提供される前に書かれたものです。これを見ると、スタックアドレスにfreeと呼ぶことはできません。しかし、私のオリジナルの答えは


私はfreeバグが突然私に飛び出し表示されていない...以下、より優れたリストの削除を行う方法について保存されますが、....それはこのアプローチのように思えます渡されたnodeが最初のノードである場合にのみ機能します。最初のもの以外のノードであれば、前のものへのポインタが必要です。prev->next = node->nextを設定することができます。

実際には、これについてもっと考えてみてください。あなたがしているのは、ノードをとり、それを最後のものにしているのであれば、どうして何かfreeが必要ですか?このコードは、リスト全体をtempから解放するようです。想定してい

void free_all_at_node(struct list **list, struct list *node_to_free) 
{ 
    struct list *n = *list, *prev = NULL; 

    // Search for node_to_free, updating prev to indicate the last node we saw. 
    // 
    while (n && n != node_to_free) 
    { 
     prev = n; 
     n = n->next; 
    } 

    // Check to see if we found it... 
    // 
    if (n == node_to_free) 
    { 
     // Do we have a previous node? 
     // 
     if (prev) 
     { 
     // Yes, update next pointer... 
     // 
     prev->next = NULL; 
     } 
     else 
     { 
     // This is the start of the list. Update the head... 
     // 
     *list = NULL; 
     } 

     // Now free stuff... 
     // 
     while (n) 
     { 
     struct list *next = n->next; 
     free(n); 
     n = next; 
     } 
    } 
} 

あなたはnode_to_freeを解放する最初のノードになりたい、それがリストの先頭を与えられたため、したがって、我々は、検索:それはあなたの意図であるならば、私はより多くのこのようなものをお勧めします。もう1つの選択肢は、最初のノードを解放するためにの前に呼び出し元にノードを指定させることです。 (それはあなたのコードが実際にこれを実行しようとしているように見えます...)私はこのようにそれを行うことを好むかもしれません:

void free_after_node(struct list *n) 
{ 
    // If the node is NULL or has no next node, there is nothing to do. 
    // 
    if (n && n->next) 
    { 
     // Start at the node after the first, since we want to keep the first 
     // one around. 
     // 
     n = n->next; 

     // Now free... 
     // 
     while (n) 
     { 
     struct list *next = n->next; 
     free(n); 
     n = next; 
     } 
    } 
} 
+0

はい、私が望むものは、tempから全リストを解放することです。 – Furqan

関連する問題