Ошибка сегментации связанного списка

Почему это вызывает ошибку SegFault? Я пытался запустить трассировку с помощью GDB, но это не помогло мне.
Буду признателен за любую помощь, я тяну волосы за это часами.

мой 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

Мой 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;
}

Мой список

#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

мой 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){

}

Мой 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();
}

0

Решение

Подсказка: Segfault происходит здесь:

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

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

(Полных ответов нет, так как это выглядит как домашнее задание.)

3

Другие решения

В вашей основной функции указатель на SSL не инициализируется, но вы разыменовываете его. Это неопределенное поведение. В вашем конкретном случае это вызывает нарушение сегментации. Попробуйте изменить код, чтобы создать SSL объект, либо в стеке:

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

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

или куча:

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

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

Кстати, вы никогда не используете temp, iterator… поля SLL класс, никогда не инициализируйте их. В вашей реализации вы определяете локальные переменные, которые их скрывают, поэтому я бы предложил удалить поля или инициализировать их в конструкторе.

1

По вопросам рекламы [email protected]