2013-08-27 20 views
6

Bağlantılı bir listeden bir düğümü kaldırmaktan nasıl yararlanabilirim?C Bağlantılı listeden düğümü kaldır

İşte benim kodudur:

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; 
} 

Ama elde seg hataları tutun.

Aptalca bir şey yapıyorum gibi hissediyorum .... Herhangi bir fikir?

+1

Neden "önceki = önceki" yerine "önceki = geçerli" yerine "önceki" geçerli yeniden atamadan önce? –

+0

Ayrıca, bölümleme hataları alıyorsanız, programınızı bir hata ayıklayıcısında çalıştırın. Sorunun olduğu yerde duracak ve calltack ve değişkenleri incelemenize izin ver. En azından sorunuzu, calltack'ı içerecek şekilde düzenlemelisiniz ve sağlanan kodda kilitlenmenin nerede gerçekleştiğine dikkat etmelisiniz. –

+0

Ayrıca, her zaman * geçerli bir * (* kafa) -> sonraki 'işaretçiniz var mı? Liste boşsa ne olur? Listede sadece bir düğüm varsa ne olur? –

cevap

5

Benim tahminim:

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

Ne değiştirdiğinizi belirttiyseniz daha yararlı olur. –

+0

'next' değeriyle karşılaştırmayı sadece mevcut değere değiştirdim ve while döngüsündeki önceki güncellemeyi değiştirdim. – Jiminion

+0

Teşekkürler, bu tam olarak buydu! – Travv92

2

Ben bir "çifte pointer" ihtiyacını önlemek amacıyla, özyineleme ile bunu denemenizi öneriyoruz. Mantığı son derece basitleştirecektir. This link, bu yinelemeli çalışmanın çok iyi bir açıklamasına ve uygulanmasına sahiptir. Boş bir bağlantılı listeden bir düğümü kaldırmaya çalışırsanız, bu özellikle çalışır.

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; 
}