2016-05-27 20 views
0

リンクされたリストを完全に破壊するにはどうすればいいですか?たとえば、リンクされたリストを作成してプリントリスト機能を呼び出すと、リストに何も表示されないので、何も起こりません。リストにノードを追加すると、ノードが正常に印刷されます。しかし、私のリストを破壊してリストを印刷しようとすると、何も印刷しないと思っていますが、私は失敗しています。 *私のリンクリストの先頭には、ダミーノードすぎリンクされたリストを破壊する適切な方法はありますか?

void destroyList(listNode *List) 
{ 
    listNode *temp = malloc(sizeof(listNode)); 
    temp = List->next; 
    while (List != NULL) 
    { 
     temp = List; 
     List = List->next; 
     free(temp);    
    } 
} 

void printList(listNode * List) 
{ 
    List = List->next; 

    while (List != NULL) 
    { 
     printf("%d\n",List->val);   
     List = List->next;  
    } 
} 
+1

は、なぜあなたは1を破壊しようとしているlistNodeを割り当てるでしょうか? –

答えて

2

あなたはまだあなたが行うことはできませんfree D」ポインタのチェーンを降りしようとしているので、あなたがセグメンテーションフォルトしています。最初に->nextNULLに設定するだけでよいです。

void destroyList(listNode *List) 
{ 
    listNode *temp; // removed malloc, it's not necessary. 
    listNode *originalHead = List; 
    temp = List->next; 
    while (List != NULL) 
    { 
     temp = List; 
     List = List->next; 
     free(temp);    
    } 

    originalHead->next = NULL; 
} 
+1

ckruczekからのコメント後、これをコメントとして追加しています。また、ダミーポインタをリストの位置で削除しています。それはあなたが欲しいものですか?たぶんあなたの印刷方法は常にダミーを表示することになっていて、ダミーなしでリストを印刷しようとするとsegfaultが得られます。リストの制約を最初に決める必要があります。 – Cristi

0

destroyListを呼び出した後、リストポインタをNULLに設定します。それは合格値であるため、リストポインタのアドレスをdestroyListに渡す必要があります。だから、私はこのようにそれを行うだろう:

void destroyList(listNode **List) { 
    listNode *temp1, *temp2; 
    if (!List) { 
    return; 
    } 
    temp1 = *List; 
    while (temp1) { 
    temp2 = temp1->next; 
    free(temp1); 
    temp1 = temp2 
    } 
    free(*List); 
} 

は、その後、あなたがこのようにそれを呼び出す:

listNode *foo; 

// some code 

destroyList(&foo); 
関連する問題