user2073188
user2073188

Reputation: 1

Linked List Segmentation Fault

Why does this cause a SegFault Error? I've tried to run a backtrace with gdb, but it has given me no help. Any help would be appreciated, I've been pulling my hair out over this for hours.

my node.h

#ifndef NODE_H
#define NODE_H

#include <string>
using namespace std;

class Node
{
  public:

    Node(const string, const int) ;
   ~Node() { }
    void setNext(Node *);//setter for the next variable
    Node * getNext();// getter for the next variable
    string getKey();// getter for the key variable
    int getDistance();   // getter for the dist variable

  private:
    Node *next;
    int dist;
    string key;
};

#endif

My Node.cpp

#include "node.h"
#include <string>

Node::Node(string k, int d){
    key = k;
    dist = d;
}

void Node::setNext(Node * n){
    next = n;
}

Node * Node::getNext(){
    return next;
}

string Node::getKey(){
return key;
}

int Node::getDistance(){
    return dist;
}

My list.h

#ifndef LIST_H
#define LIST_H

#include "node.h"

class SLL
{
    public:
        SLL();
        ~SLL() { }
               void Insert (string searchKey, int distance);
               bool Delete (string searchKey);
               void Print();
               int Search(string searchKey);

    private:
        int count;
        Node *head;
    Node *iterator;
    Node *temp;
};

#endif

my List.cpp

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

SLL::SLL():head(0){}

void SLL::Insert(string searchKey, int distance){
Node * temp = new Node(searchKey, distance);

if(head == 0){
    head = temp;
}
else{
    temp->setNext(head);
    head = temp;
}
}

bool SLL::Delete(string searchKey){
 if(head == 0){
cout << "An attempt was made to delete a node from an empty list" << endl;
 }
 else{
Node* iterator = head;
Node* last = 0;

while(iterator != 0){
   if (iterator->getKey() == searchKey){
    break;
   }
   else{
    last = iterator;
    iterator = iterator->getNext();
   }
}
if (iterator == 0){
    return false;
}
else{
    if(head == iterator){
        head = head->getNext();

    }
    else {
        last->setNext(iterator->getNext());
    }
    delete iterator;



    }

    }
 }

void SLL:: Print(){
iterator = head;
while(iterator != 0){   
    cout << iterator->getKey()  << "-" << iterator->getDistance() << endl;
    iterator = iterator->getNext();
 }

}

int SLL::Search(string searchKey){

 }

My main.cpp

#include "list.h"
#include "node.h"
#include <iostream>

using namespace std;

int main(int argc, char* argv[]) {
    SLL * sll; 

    sll->Insert("test", 1);
    sll->Insert("test2", 2);
    sll->Delete("test");
    sll->Print();
}

Upvotes: 0

Views: 460

Answers (2)

Sylvain Defresne
Sylvain Defresne

Reputation: 44593

In your main function, the pointer to SSL is not initialised, but you dereference it. This is undefined behaviour. In your particular case, this is causing a segmentation violation. Try changing you code to create a SSL object, either on the stack:

int main(int argc, char* argv[]) {
    SLL sll;

    sll.Insert("test", 1);
    // ...
}

or the heap:

int main(int argc, char* argv[]) {
    SLL * sll = new SLL();

    sll->Insert("test", 1);
    // ...
}

BTW, you are never using the temp, iterator, ... fields of the SLL class, never initialise them. In your implementation, you define local variables that hide them, so I'd suggest removing the fields or initialising them in the constructor.

Upvotes: 1

us2012
us2012

Reputation: 16263

Hint: Segfault happens here:

int main(int argc, char* argv[]) {
    SLL * sll; 

    sll->Insert("test", 1); // BIG segfault here.
    ...

(No full answers as this looks like homework.)

Upvotes: 3

Related Questions