2013-08-27 10 views
6

リンクリストからノードを削除するにはどうすればよいですか?Cリンクリストからノードを削除する

は、ここに私のコードです:

void RemoveNode(Node * node, Node ** head) { 
    if (strcmp(node->state, (*(*head)->next).state) == 0) { 
     Node * temp = *head; 
     *head = (*head)->next; 
     free(temp); 
     return; 
    } 

    Node * current = (*head)->next; 
    Node * previous = *head; 
    while (current != NULL && previous != NULL) { 
     if (strcmp(node->state, (*current->next).state) == 0) { 
      Node * temp = current; 
      previous->next = current->next; 
      free(temp); 
      return; 
     } 
     current = current->next; 
     previous = previous->next; 
    } 
    return; 
} 

しかし、私は取得ワンセグ障害を保ちます。

私は何か愚かなことをしているように感じる....任意のアイデアですか?

+1

なぜ '以前= previous-> next'代わりに電流を再割り当てする前に、ちょうど'以前= current'の? –

+0

また、セグメンテーションフォルトが発生した場合は、デバッガでプログラムを実行してください。問題が発生した場所で停止し、コールスタックと変数を調べます。少なくとも、コールスタックを含めるように質問を編集し、提供されたコードのどこでクラッシュが発生するかを指摘してください。 –

+0

また、常に '(* head) - > next'ポインタを持っていますか?リストが空の場合はどうなりますか?リストにノードが1つしかない場合はどうなりますか? –

答えて

5

私の推測:

void RemoveNode(Node * node, Node ** head) { 
    if (strcmp(node->state, ((*head)->state) == 0) { 
     Node * temp = *head; 
     *head = (*head)->next; 
     free(temp); 
     return; 
    } 

    Node * current = (*head)->next; 
    Node * previous = *head; 
    while (current != NULL && previous != NULL) { 
     if (strcmp(node->state, current->state) == 0) { 
      Node * temp = current; 
      previous->next = current->next; 
      free(temp); 
      return; 
     } 
     previous = current; 
     current = current->next; 
    } 
    return; 
} 
+4

あなたが変更したことを指摘した方がより役に立ちます。 –

+0

'next'の値で比較を現在の値に変更し、whileループの前の更新を変更しました。 – Jiminion

+0

ありがとう、これはまさにそれでした! – Travv92

2

私は「二重のポインタ」の必要性を回避するために、あなたは再帰でこれをやってみることをお勧めします。それは非常にロジックを簡素化します。 This linkには、これを再帰的に行うという非常に優れた説明と実装があります。これは、空のリンクリストからノードを削除しようとすると、特に動作します。

Node *ListDelete(Node *currP, State value) 
{ 
    /* See if we are at end of list. */ 
    if (currP == NULL) 
    return NULL; 

    /* 
    * Check to see if current node is one 
    * to be deleted. 
    */ 
    if (currP->state == value) { 
    Node *tempNextP; 

    /* Save the next pointer in the node. */ 
    tempNextP = currP->next; 

    /* Deallocate the node. */ 
    free(currP); 

    /* 
    * Return the NEW pointer to where we 
    * were called from. I.e., the pointer 
    * the previous call will use to "skip 
    * over" the removed node. 
    */ 
    return tempNextP; 
    } 

    /* 
    * -------------- RECURSION------------------- 
    * Check the rest of the list, fixing the next 
    * pointer in case the next node is the one 
    * removed. 
    */ 
    currP->next = ListDelete(currP->next, value); 


    /* 
    * Return the pointer to where we were called 
    * from. Since we did not remove this node it 
    * will be the same. 
    */ 
    return currP; 
} 
関連する問題