2011-03-16 3 views
0

J'ai eu beaucoup de problèmes parce que j'ai oublié toutes les règles des pointeurs. J'ai appris sur les pointeurs il y a 3 ans et je ne les ai pas utilisés depuis. Je reçois une erreur de segmentation dans la ligne contents -> setPrevious(&node) dans la fonction add dans le fichier LinkedList.cpp. Je crois qu'il a quelque chose à faire soit en appelant la fonction setPrevious ou en passant le noeud comme un pointeur. Toute aide est la bienvenue. Merci!Erreur de segmentation à cause des pointeurs

LinkedList.h

#ifndef LINEARNODE_H 
#define LINEARNODE_H 

#include<iostream> 

using namespace std; 

class LinearNode 
{ 
    public: 
     //Constructor for the LinearNode class that takes no arguments 
     LinearNode(); 
     //Constructor for the LinearNode class that takes the element as an argument 
     LinearNode(int el); 
     //returns the next node in the set. 
     LinearNode* getNext(); 
     //returns the previous node in the set 
     LinearNode* getPrevious(); 
     //sets the next element in the set 
     void setNext(LinearNode* node); 
     //sets the previous element in the set 
     void setPrevious(LinearNode* node); 
     //sets the element of the node 
     void setElement(int el); 
     //gets the element of the node 
     int getElement(); 

    private: 
     LinearNode* next; 
     LinearNode* previous; 
     int element;   
};//ends the LinearNode class 

#endif 

LinkedList.cpp

#include<iostream> 
#include"LinearNode.h" 
#include"LinkedList.h" 

using namespace std; 

//linkedlist constructor for an empty linked list 
LinkedList::LinkedList() 
{ 
    count = 0; 
    contents = NULL; 
}//ends the constructor 

//adds an element to the front of the linked list 
void LinkedList::add(int element) 
{ 

    int found = 0, current = 0; 

    for (int index = 0; index < count; index++) 
    { 
     if (contents -> getElement() == element) 
      found = 1; 
     else  
     { 

      contents = contents -> getNext(); 
     }//ends the else statement 
    }//ends the while loop 

    if ((found == 0) && (count == 0)) 
    { 
     LinearNode node; 
     node.setElement(element); 
     contents = &node; 
     count++; 
print(); 
    }//ends the if statement 
    else 
    { 

     LinearNode node; 
     node.setElement(element); 
     node.setNext(contents); 
     contents -> setPrevious(&node); 
     contents = &node; 
     count++; 
//print(); 
cout << endl; 
    }//ends the found == 0 if statment 
}//ends the add function 

//this function removes one element from the linked list. 
int LinkedList::remove(int element) 
{ 
    int found = 0, result = 0; 
    LinearNode* previous; 
    LinearNode* current; 

    if (count == 0) 
     cout << "The list is empty" << endl; 
    else 
    { 
     if (contents -> getElement() == element) 
     { 
      result = contents -> getElement(); 
      contents = contents -> getNext(); 
     }//ends the contents.getElement() == element 
     else 
     { 
      previous = contents; 
      current = contents -> getNext(); 
      for (int index = 0; ((index < count) && (found == 0)); index++) 
       if (current -> getElement() == element) 
        found = 1; 
       else 
       { 
        previous = current; 
        current = current -> getNext(); 
       }//ends the else statement 

      if (found == 0) 
       cout << "The element is not in the list" << endl; 
      else 
      { 
       result = current -> getElement(); 
       previous -> setNext(current -> getNext()); 
      }//ends else statement 

     }//ends the else stamtement 

     count--; 
    }//ends the else statement of count == 0 
    return result; 
}//ends the remove function 


void LinkedList::print() 
{ 
    LinearNode* current; 
    current = contents; 

    for (int index = 0; index < count; index++) 
    { 
     cout << current -> getElement() << endl; 
     current = current -> getNext(); 
    }//ends the for loop 
}//ends Print function 

LinearNode.h

#ifndef LINEARNODE_H 
#define LINEARNODE_H 

#include<iostream> 

using namespace std; 

class LinearNode 
{ 
    public: 
     //Constructor for the LinearNode class that takes no arguments 
     LinearNode(); 
     //Constructor for the LinearNode class that takes the element as an argument 
     LinearNode(int el); 
     //returns the next node in the set. 
     LinearNode* getNext(); 
     //returns the previous node in the set 
     LinearNode* getPrevious(); 
     //sets the next element in the set 
     void setNext(LinearNode* node); 
     //sets the previous element in the set 
     void setPrevious(LinearNode* node); 
     //sets the element of the node 
     void setElement(int el); 
     //gets the element of the node 
     int getElement(); 

    private: 
     LinearNode* next; 
     LinearNode* previous; 
     int element;   
};//ends the LinearNode class 

#endif 

LinearNode.cpp

#include<iostream> 
#include"LinearNode.h" 

using namespace std; 

//Constructor for LinearNode, sets next and element to initialized states 
LinearNode::LinearNode() 
{ 
    next = NULL; 
    element = 0; 
}//ends LinearNode default constructor 

//Constructor for LinearNode takes an element as argument. 
LinearNode::LinearNode(int el) 
{ 
    next = NULL; 
    previous = NULL; 
    element = el; 
}//ends LinearNode constructor 

//returns the next element in the structure 
LinearNode* LinearNode::getNext() 
{ 
    return next; 
}//ends getNext function 

//returns previous element in structure 
LinearNode* LinearNode::getPrevious() 
{ 
    return previous; 
}//ends getPrevious function 

//sets the next variable for the node 
void LinearNode::setNext(LinearNode* node) 
{ 
    next = node; 

}//ends the setNext function 

//sets previous for the node 
void LinearNode::setPrevious(LinearNode* node) 
{ 
    previous = node; 
}//ends the setPrevious function 

//returns element of the node 
int LinearNode::getElement() 
{ 
    return element; 
}//ends the getelement function 

//sets the element of the node 
void LinearNode::setElement(int el) 
{ 
    element = el; 
}//ends the setElement function 
+0

Vous avez copié Linearnode.h deux fois, et nous ne pouvons pas voir LinkedList.h ici. –

Répondre

1
LinearNode node; 
    node.setElement(element); 
    contents = &node; 
    count++; 

Cela crée un LinearNode sur la pile, fait le point contents à ce nœud, laisse le champ à l'adresse suivante } - qui invalide node - et contents par la suite pointe à invali d données.

Vous devez repenser votre classe entière - une liste chaînée nécessite un stockage en tas, donc vous devez utiliser new et delete

Il y a plusieurs autres erreurs dans votre source, mais vous devez fixer d'abord cette idée fausse de base, puis Revenez avec une question mise à jour si nécessaire.

Certains des autres erreurs:

  • Le manque de constructeurs de copie, les opérateurs d'affectation et Destructeurs
  • Aucune vérification pour null avant pointeurs déréférencement
  • réglage ne sont pas tous les pointeurs sur null dans les constructeurs
+0

okay je l'ai corrigé pour que son noeud LinearNode * = nouveau LinearNode mais je reçois toujours un défaut de segmentation. Il se produit lorsque previous = noeud dans le fichier LinearNode.cpp – tpar44

0

Le problème est que vous n'allouez pas de nœud dans le tas, seulement sur la pile.

Dans le ajouter fonction

LinearNode node; 
node.setElement(element); 
contents = &node; 
count++; 

devrait être:

LinearNode* node = new LinearNode; 
node->setElement(element); 
contents = node; 
count++; 
+0

Les pointeurs RAW sont les jouets du diable. Évitez à tout prix. –

+0

c'est pourquoi j'utilise python la plupart du temps – fabrizioM

0

Il y a beaucoup de code à rechercher pour chaque petit problème, mais une mauvaise chose qui saute est dans LinkedList :: add(). Là, vous déclarez "node" sur la pile, puis définissez un pointeur pour pointer dessus. Lorsque add() renvoie, cet objet pointé devient trash - le destructeur est appelé. C'est le genre de chose qui mène rapidement aux segfaults.