2017-08-04 13 views
0

初心者の質問。私はこの機能を持っています。前のノードを解放した後にノードを追加するときにプログラムがクラッシュする。

void removeNodes(Node *start) 
{ 
    Node *temp; 
    int counter = 0; 

    while(start) 
    { 
     temp = start; 
     start = start->next; 

     free(temp); 
     counter++; 
    } 

    printf("%d node/s has been removed\n\n", counter); 
} 

私のmain()では、私には選択肢があります。

  1. 私はオプションで、私が作成したノードを解放することを決めたまでは何の問題は、ループの最初のセットではありませんでしたすべてのノード
  2. 出口プログラム

を削除

  • ノードを追加します。問題はここから始まります。それらを解放した後、別のノードセットを追加したいのですが、最初のノードに再び入ると、プログラムがクラッシュします。まず、をmain()にリセットしてNULLにリセットしました。しかし、それはまだプログラムを壊している。

    私が読んでいる本には、なぜこれが起こっているのか説明がありません。または彼らはそれを持っているかもしれないが、彼らは最後のページにあります。私は340/632ページにいる)=。..初心者ここ。多分私は他のベテランにとってとてもシンプルなものを見逃しているだけかもしれません。 Plsは私を助ける。 tnx ..

    そして、これは私のmain()機能の単なるサンプルです。私はすべてを含んでいませんでした。

    Node *start = NULL; 
        int choice; 
        int pos = 1; 
        int data; 
        int node_qty = 0; 
    
        while(1) 
        { 
         printf("1. Add node\n2. Delete all nodes\n3. Quit "); 
         scanf(" %d", &choice); 
    
         if(choice == 1) 
         { 
          if(!node_qty) 
          { 
           printf("Enter the value of the first node: "); 
           scanf(" %d", &data); 
          } 
          else 
          { 
           printf("Enter a value: "); 
           scanf(" %d", &data); 
    
           do 
           { 
            printf("Enter the position: "); 
            scanf(" %d", &pos); 
    
            if(pos > node_qty + 1) 
            { 
             printf("Invalid input. Current node quantity: %d\n", node_qty); 
             printf("\n\n\n\n\n\n\n\n\n"); 
             system("PAUSE"); 
             system("cls"); 
            } 
           }while(pos < 1 || pos > node_qty + 1); 
          } 
    
          insertNode(&start, pos, data); 
    
          printf("\n\n\n\n\n\n\n\n\n"); 
          system("PAUSE"); 
          system("cls"); 
    
          node_qty++; 
         } 
         else if(choice == 2) 
         { 
          removeNodes(start); 
    
          //reset 
          start = NULL; 
          node_qty = 0; 
    
          printf("\n\n\n\n\n\n\n\n\n"); 
          system("PAUSE"); 
          system("cls"); 
         } 
         else if(choice == 3) 
         { 
          printf("Program ends"); 
          break; 
         } 
        } 
    
        //then after all of that, I am making sure that it will free the nodes 
        removeNodes(start); //I don't think the problem is here. 
    

    これは、あなたが右のあなたのプログラム内のすべてのノードを削除した後に新しいノードを作成する場合、それはNULLあるときは、startにアクセスしている

    void insertNode(Node **start, int pos, int data) 
    { 
        Node *temp1 = malloc(sizeof(Node)); 
        temp1->data = data; 
    
        Node *temp2 = *start; 
    
        if(pos == 1) 
        { 
         temp1->next = *start; 
         *start = temp1; 
        } 
        else 
        { 
         for(int i = 0; i < pos - 2; i++) 
         { 
          temp2 = temp2->next; 
         } 
    
         temp1->next = temp2->next; 
         temp2->next = temp1; 
        } 
    } 
    
    //and for checking, here's my print function 
    void printNode(Node *start) 
    { 
        while(start) 
        { 
         printf("%d ", start->data); 
    
         start = start->next; 
        } 
    
        printf("\n\n"); 
    } 
    
  • +1

    残りのコードを掲載する必要があります。私はあなたがリストを入力するいくつかの問題があると思う。 –

    +0

    おそらく問題は他の場所であり、適切に形成されたリンクリストではありません。それとも別のものかもしれません。おそらく、オプションを処理するコードを表示する必要がありますか? – lurker

    +0

    完全な最小限の例を投稿してください。 –

    答えて

    0

    私のノード追加機能です。 がinsertNode()である場合、の->演算子が使用されないようにする方法があります。

    あなたは右の新しいノードをあるtemp1を作成した後に

    if(*start == NULL) 
    { 
        *start = temp1; 
        return; 
    } 
    

    を追加することができます。 リストが空の場合は、最初の位置のみを挿入できるので、posの値は無関係です。


    もう一つは、PeterJが指摘したように、あなたがリストの最後に追加した新しいノードのnextinsertNode()機能でNULLがなされていないです。
    printNode()機能を使用してリストをトラバースしているときに、最後に到達したことを通知することはできません。

    tempinsertNode()に作成した直後にtemp1->next = NULL;を追加してください。

    関連する問題