链表分段错误

Linked List Segmentation Fault

本文关键字:错误 分段 链表      更新时间:2023-10-16

为什么会导致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;
}

我的列表.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

我的列表.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){
 }

我的主.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();
}

提示:此处发生分段故障:

int main(int argc, char* argv[]) {
    SLL * sll; 
    sll->Insert("test", 1); // BIG segfault here.
    ...

(没有完整的答案,因为这看起来像是家庭作业。)

在您的主函数中,指向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);
    // ...
}

顺便说一句,你永远不会使用tempiterator。。。SLL类的字段,永远不要初始化它们。在您的实现中,您定义了隐藏它们的局部变量,所以我建议删除字段或在构造函数中初始化它们。