Ошибка сегментации с указателями - PullRequest
0 голосов
/ 17 марта 2011

Я получаю ошибку сегментации из-за операции присваивания в LinearNode.cpp строки, которая читает previous = node в функции setPrevious. Предыдущий объявлен как LinearNode* previous; Я мог бы действительно использовать некоторую помощь, потому что я не использовал указатели в течение 3 лет и не могу вспомнить много. Спасибо!

LinearNode.cpp

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

using namespace std;

//Constructor for LinearNode, sets next and element to initialized states
LinearNode::LinearNode()
{
    next = NULL;
    previous = 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)
{
cout << "next" << node -> getElement() << endl;
    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

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 = new LinearNode;
        node -> setElement(element);
        contents = node;
        count++;
print();
    }//ends the if statement
    else
    {

        LinearNode* node = new LinearNode ;
        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

Ответы [ 2 ]

3 голосов
/ 17 марта 2011

Вы изменяете contents, который, как мне кажется, должен указывать на заголовок вашего списка.

contents = contents -> getNext();

Когда вы выполняете итерацию до тех пор, пока contents не станет нулевым (в add()), а затем вызовете все, что считает, что contents не равно нулю, потому что count>0 у вас сбой.

Первый вызов add(): счетчик равен 0, вы создаете LinearNode * и правильно устанавливаете contents.

Второй вызов add(): число равно 1, вы сканируете, выполняя contents = contents->getNext() - заканчивая contents==null. Затем вы, так как (found == 0) и (count != 0) создаете новый узел, и вызываете contents->setPrevious()

0 голосов
/ 17 марта 2011

Я не уверен, отвечает ли это на ваш вопрос, но я заметил место, где указатель может быть нулевым, что может привести к segfault:

//sets previous for the node
void LinearNode::setPrevious(LinearNode* node)
{
cout << "next" << node -> getElement() << endl;
    previous = node;
}//ends the setPrevious function

Вы не проверяете, является ли node фактически нулевым или недействительным, что может быть. Разыменование нулевого или неправильного указателя может привести к сбою.

...