2011-06-18 3 views
2

L'extrait de code suivant ne fonctionne pas correctement.fonction de suppression de la liste chaînée

void deleteNode(list **start, int pos) { 
    int currentPosition=0; 
    list *currentNode; 
    list *nodToDelete; 

    currentNode = *start; 
    if (currentNode == NULL) { 
     printf("Empty List\n"); 
    } else if (pos == 0) { 
     nodToDelete = *start; 
     *start = nodToDelete->next; 
     free(nodToDelete); 
    } else { 
     while (currentNode->next != NULL) { 
      if (currentPosition >= pos -1) { 
       break; 
      } 
      currentPosition++; 
      currentNode = currentNode->next; 
     } 
     if (currentPosition < pos -1 || currentNode->next == NULL) { 
      printf("No node at given position exists\n"); 
     } else { 
      nodToDelete = currentNode->next; 
      currentNode = nodToDelete->next; 
      free(nodToDelete); 
      nodToDelete = NULL; 
     } 
    } 
} 

void displayList(list *node) { 
    if (node == NULL) { 
     printf("Empty List"); 
    } 

    while (node != NULL) { 
     printf("%d\t", node->data); 
     node = node->next; 
    } 
    printf("\n"); 
} 

int main() 
{ 
    list *start, *node; 
    start = NULL; 

    insertNode(&start, 2); 
    insertNode(&start, 3); 
    insertNode(&start, 4); 
    insertNode(&start, 1); 
    insertNode(&start, 5); 

    deleteNode(&start, 3); 

    displayList(start); 
} 

Lorsqu'il est exécuté la sortie est

Avant d'effacer 2 3 4 1 5
Après la suppression 2 3 4 0 5

Il est censé supprimer 1 mais il est insérait 0 à sa place.

+0

Votre code est incomplet; veuillez montrer la définition de 'list'. – zwol

+0

Nous avons vraiment besoin de plus de code. – dcousens

+1

Ne devrait pas currentNode = nodToDelete-> next être currentNode-> next = nodToDelete-> next; – Ben

Répondre

1

Une fois que vous avez trouvé le noeud que vous voulez retirer de la liste, vous devez le retirer. =)

...

nodToDelete = currentNode->next; 
currentNode->next = nodToDelete->next; 
free(nodToDelete); 

...

+0

merci pour la solution donc finalement il s'est avéré être un bug de niveau 0, que je ne pouvais pas comprendre – user804195

2

Voici quelque chose qui pourrait fonctionner - Remplacer

currentNode = nodToDelete->next; 

avec

currentNode->next = nodToDelete->next; 

Vous essentiellement besoin de t Il noeud avant le nodetodelete pour avoir son prochain point au noeud que nodetodelete utilisé pour pointer vers

1

Outre le problème avec currentNode->next = nodToDelete->next; et les positions négatives vous mélangez votre interface utilisateur et votre logique. Autant que possible, vous devriez séparer les deux. Envoyer quelque chose à l'interface utilisateur est un moyen de signaler des progrès; si l'interface utilisateur est une ligne de commande, un navigateur ou un haut-parleur. Dans deleteNode, une liste vide ou une position hors limites n'est pas une progression. Séquentiellement, les deux sont les mêmes que le succès - vous avez terminé. Si vous voulez que l'erreur soit signalée, cela devrait être fait là où cela peut mener à une séquence séparée ... c'est-à-dire l'appelant. De plus, en mélangeant ui, vous introduisez une dépendance et un échec inutiles (et s'il y a un bogue dans printf, votre fonction va planter quand ce n'est pas le cas). Si votre fonction renvoie un résultat défini, l'appelant peut décider si/comment signaler ce résultat, y compris le succès (votre fonction ne le fait pas actuellement, et l'appelant n'a aucun moyen de faire la différence entre le succès ou l'échec).

Questions connexes