2016-10-13 4 views
-3

これは私が昨日投稿した問題の続きですが、解決したと思っていましたが、ループとその終了条件を繰り返す方法に遭遇しました。新しい質問スレッドがより適切かもしれないと感じました。最後のノードでリンクリストをクラッシュさせる

次のfreeAllListMembers()関数は、 "temp"を解放しようとしているのでループの最後の反復まで機能しているようですが、tempは既に解放されています。それはもう一度走っているから、私が試したことはすべて動作していないようです。いくつかの小さなヒューマンエラーを取り除くために与えられた例をクリーンアップ任意の洞察力

int main() { 

    struct node *head = NULL; 
    createList(&head); 

    //do stuff with list 

    freeAllListMembers(&head); 

    return 0; 
} 

int createList(struct node **head) { 
    struct node *newNode= NULL; 

    for(int I = 0; I < 100; I++) 
    { 
     struct node *node = (struct node*)malloc(sizeof(struct node)); 

     node->data = someData; 

     node->next = NULL; 

     //if we havent created an initial start node, create it 
     if (*head == NULL) 
     { 
      *head = node; 
     } 
     //otherwise, navigate to the end of the list to add a new node 
     else 
     { 
      newNode = *head; 
      while (newNode->next != NULL){ 
       newNode = newNode->next; 
      } 
      newNode->next = node; 
     } 
    } 
    return 0; 
} 

void freeAllListMembers(struct node **head){ 
    struct node *temp; 
    while (*head != NULL) { 
     temp = *head; 
     *head = (*head)->next; 
     free(temp); 
    } 
    return; 
} 
+1

た失われたことを推測することができます走りましたwhile(* head!= NULL) – merl

+1

@merl OPは*ポインタ*を実際のヘッドに渡していることに注意してください。 –

+0

'createList' someを記入してください。チェーンが正しく終了しない可能性があります – infixed

答えて

0

ため

おかげで、プログラムがOKコンパイルし、私はGDBにOKをステップ実行することができます。それがエラー

#include <malloc.h> 

#define someData 12345 

struct node 
{ 
     int data; 
     struct node* next; 
}; 

int createList(struct node **head) 
{ 
    struct node *newNode= NULL; 

    int i; 
    for(i = 0; i < 100; i++) 
    { 
     struct node *node = (struct node*)malloc(sizeof(struct node)); 

     node->data = someData; 

     node->next = NULL; 

     //if we havent created an initial start node, create it 
     if (*head == NULL) 
     { 
      *head = node; 
     } 
     //otherwise, navigate to the end of the list to add a new node 
     else 
     { 
      newNode = *head; 
      while (newNode->next != NULL){ 
       newNode = newNode->next; 
      } 
      newNode->next = node; 
     } 
    } 
    return 0; 
} 

void freeAllListMembers(struct node **head) 
{ 
    struct node *temp; 
    while (*head != NULL) { 
     temp = *head; 
     *head = (*head)->next; 
     free(temp); 
    } 
    return; 
} 


int main() 
{ 

    struct node *head = NULL; 
    createList(&head); 

    //do stuff with list 

    freeAllListMembers(&head); 

    return 0; 
} 

なしでコンパイルした後、それは基本的に私はあなたが私はあなたのループではなく、しばらく(ヘッド!= NULL)のようになるはずだと思うものは何でもあなたのバグは「抽象化」のプロセスに

+0

これを調べていただきありがとうございます。ええ、いくつかのものをコピーすると迷子になってしまいましたが、私はまだその問題を経験していました。私は解決策を見つけましたが、私にはそれは非常に非効率的で、私が本当に好きなものではないようです。これを動作させるためには、struct node * newNode = NULLを移動する必要があります。 createList()の先頭で初期化されていません。代入条件の直前にforループで初期化されるまで...これを改善するための提案は素晴らしいでしょう。ありがとう!与えられた例の 'newNode'の – skevthedev

+0

は実際にはリンクされたリストの終わりを見つけるためのリストポインタとしてのみ使われます。 'struct node * newNode = * head;'のようなelse節の中で宣言して、 'createList'の最初に宣言を落としました。 – infixed

+0

これは' newNode'と呼ばれることもありません。リンクされたリストの終わり。実際の新しいものは 'node'によって指し示されます。おそらく、抽象化されていないプログラムにはあいまいさがあり、 – infixed

関連する問題