2012-11-13 1 views
1

Je souhaite insérer un noeud dans une liste doublement chaînée. Je suis passé dans la position, le nouveau coefficient du polynôme et sa puissance. Je n'ai pas d'erreurs de compilation, mais j'obtiens une erreur Segmentation dans linux (g ++) et un emplacement d'écriture de violation d'accès lorsque je l'exécute avec Visual Studio.Erreur de segmentation || Violation d'accès Emplacement d'écriture

Exception non gérée à 0x00bd20ba dans Program.exe: 0xC0000005: Emplacement d'écriture de violation d'accès 0xcdcdcdd9.

void Polynomial::insert(Term *pos, double newCoefficient, int power) 
{ 
    Term *newTerm = new Term; // create a new node to insert 

    // Link the new node to previous and next, given the position 
    newTerm->prev = pos->prev; 
    newTerm->next = pos; 
    newTerm->prev->next = newTerm; // Here's where I'm getting the error 
    newTerm->next->prev = newTerm; 

    // change the coefficient and power 
    newTerm->coefficient = newCoefficient; 
    newTerm->power = power; 
} 

Qu'est-ce que je fais mal et comment puis-je résoudre ce problème?

+0

L'adresse '0xcdcdcdd9' a ​​une adresse de débogage écrite partout. valider vos entrées avant de les déréférencer (ou de les affecter d'ailleurs). – WhozCraig

Répondre

1

Eh bien, si pos est le premier nœud, alors pos->prev doit être NULL. Dans ce cas, la déclaration newTerm->prev->next = newTerm; tomberait en panne, car il n'y a rien de tel que NULL->next!

Vous devez vérifier explicitement si pos est le premier noeud de la liste et placer newNode en conséquence.

// Link the new node to previous and next, given the position 
newTerm->prev = pos->prev; 
newTerm->next = pos; 
if(pos->prev) newTerm->prev->next = newTerm; 
newTerm->next->prev = newTerm; 
+0

Merci. J'ai totalement oublié ça. –

1

pos->prev est susceptible d'être NULL ou non initialisée. Vous devez valider vos entrées avant de les utiliser ...

0

Veuillez vérifier si le programme peut être le premier noeud de la liste dans l'exécution du programme. Si tel est le cas, cela provoquera une erreur de segmentation lorsque vous accéderez à un membre du pointeur NULL. Toujours considérer les cas extrêmes lorsque vous programmez et assurez-vous que vous avez mis les conditions requises pour eux.

0

Je me demande pourquoi vous implémentez une liste doublement liée par vous-même. Vous pouvez définir un struct ou class qui contient coefficient et power membres et l'utiliser comme type de valeur de std::list. Cela vous donnera beaucoup d'opérations de liste (telles que l'insertion et la suppression d'éléments) gratuitement. En bonus, std::list est fourni avec des itérateurs appropriés (au lieu des pointeurs de position) à utiliser dans les algorithmes standard. Comme le reste de votre classe Polynomial est manquant (c'est une classe, pas seulement un espace de nom, n'est-ce pas?) Il est difficile de fournir une aide plus concrète.

0

Une erreur de segmentation se produit généralement lorsque vous essayez de déréférencer un pointeur NULL.

Il est recommandé d'utiliser des vérifications NULL lorsque vous manipulez des pointeurs. Dans ce cas, il semble que POS-> prev soit NULL, ce qui provoque l'erreur de segmentation.

Questions connexes