Randomizing Crashing Program

0

I'm working with Lists in C ++ and while doing the following code to implement a list:

#include <iostream>

using namespace std;

class NO{

    int idade;
    string nome;
    NO *no;

    public:

        void setDados(int, string);
        int getidade();
        string getnome();
        void setNext(NO*);
        NO* getNext();  
        ~NO(){};        

};

class Lista{

    NO *inicio;

    int quant_el;

    public:     

        Lista(){

            quant_el = 0;
            inicio->setNext(NULL);          

        }

        void inserir(int, string);  
        void pesquisar(NO); 
        void remover(int);
        void listar();      

};


void NO :: setDados(int idade, string nome)
{
    this->idade = idade;
    this->nome = nome;
}

int NO :: getidade()
{
    return idade;
}

string NO :: getnome()
{
    return nome;
}

void NO :: setNext(NO *no)
{
    this->no = no;
}

NO* NO :: getNext()
{
    return no;
}

void Lista :: inserir(int idade, string nome)
{
    NO *aux;
    aux = inicio;

    NO *novo = new NO();

    novo->setDados(idade, nome);
    novo->setNext(NULL);

    if(quant_el == 0)
    {
        inicio->setNext(novo);
        quant_el++;
    }
    else
    {
        while( (aux->getNext()) != NULL )
        {
            aux = aux->getNext();
        }
        aux->setNext(novo);
        quant_el++;
    }
    cout << "Foi inserido '" << idade << " " << nome << "'" << endl;
}

void Lista :: pesquisar(NO obj)
{
    NO *aux;

    int i;
    int cont = 1;
    int cont1 = 0;

    aux = inicio;

    if(quant_el == 0)
    {
        cout << "Não há nenhum dado na sua Lista." << endl;
    }
    else
    {
        for(i = 0; i < quant_el; i++)
        {
            cont++;
            if(((aux->getNext())->getidade() == obj.getidade()) && ((aux->getNext()->getnome() == obj.getnome())))
            {
                cont1++;
                break;
            }
            aux = aux->getNext();
        }
        if(cont1 == 0)
        {
            cout << "O dado não foi encontrado." << endl;
        }
        else
        {
            cout << "Dado encontrado na posição " << cont - 1 << endl;
        }
    }
}

void Lista :: remover(int pos)
{
    int i;

    NO *aux, *aux1;
    aux = inicio;
    aux1 = aux->getNext();

    if(pos > quant_el)
    {
        if(quant_el == 0)
        {
            cout << "Sua lista está vazia, não há elementos para remover." << endl;
        }
        else
        {
            cout << "Posição inválida, sua lista possui menos elementos." << endl;
        }
    }
    else
    {
        for(i = 0; i < pos - 1; i++)
        {
            aux = aux1;
            aux1 = aux1->getNext();
        }
        aux->setNext(aux1->getNext());

        quant_el --;
        cout << "Dado " << i + 1  << " removido: " << endl << aux1->getidade() << " " << aux1->getnome() << endl << endl;
        delete aux1;
    }
}


void Lista :: listar()
{

    int i;

    NO *aux;

    aux = inicio;

    if(quant_el == 0)
    {
        cout << "Sua lista está vazia, não há elementos para mostrar." << endl;
    }
    else
    {
        for(i = 1; i <= quant_el; i++)
        {
            cout << i << " Dado:" << endl;
            cout << aux->getNext()->getnome() << endl << aux->getNext()->getidade() << endl << endl;

            aux = aux->getNext();
        }
    }
}


int main()
{
    setlocale(LC_ALL, "");

    Lista lista1;

    NO loiola, rangel, humb;

    loiola.setDados(18, "Loiola");
    rangel.setDados(29, "Eustáquio");
    humb.setDados(23, "Humberto");

    lista1.inserir(18, "Filipe");
    lista1.inserir(29, "Eustáquio");
    lista1.inserir(10000, "Raul Seixas");
    lista1.inserir(18, "Leticia");
    lista1.inserir(18, "Mayra");
    //lista1.inserir(23, "Humberto"); Se um nó a mais for inserido, o programa crasha


    lista1.pesquisar(loiola);   
    lista1.pesquisar(rangel);
    //lista1.pesquisar(loiola); Se um nó a mais for pesquisado, o programa crasha.

    lista1.remover(2);

    lista1.remover(3);

    lista1.remover(1);

    lista1.listar();

    lista1.listar(
    );

    return 0;
}

You can also visit link

The program started crashing out of nowhere, searching more than 2 nodes or inserting more than 5. There are no compilation errors, the program simply crashes.

Would anyone know what the problem was?

Thanks in advance.

    
asked by anonymous 03.02.2018 / 00:07

1 answer

0

You need to get things right in your code:

  • In the list builder you are doing setNext over No inicio that was not even instantiated:

    Lista() {
        quant_el = 0;
        inicio->setNext(NULL); //<-- aqui
    }
    

    Once you've just built the list, you'd better not build the startup node until you add a node. So I just need to remove the statement that I marked.

  • Still referring to initial cases, in your inserir method when you do not have elements yet and according to the solution I gave in the previous point you can not use pointer inicio .

    if(quant_el == 0)
    {
        inicio->setNext(novo); //<---aqui
        quant_el++;
    }
    

    Because quant_el is 0 inicio has not yet been allocated. Just swap for:

    if(quant_el == 0)
    {
        inicio = novo;
        quant_el++;
    }
    

    So the first node will be inicio . The quant_el++; increment is being done both in if and in else and so you can simplify by taking them out and following them.

  • In the search you are using the front node to make the comparisons because it calls with ->getNext() :

    if(((aux->getNext())->getidade() == obj.getidade()) && ((aux->getNext()->getnome() == obj.getnome())))
    //---------^------------------------------------------------------^
    

    This causes the front node, which is NULL , to crash with segmentation fault in the last test. Simplify in parentheses and test with the node itself:

    if(aux->getidade() == obj.getidade() && aux->getnome() == obj.getnome()) {
    
  • In the listar method, it fell into the same problem of showing the front element instead of the current element:

    cout << aux->getNext()->getnome() << endl << aux->getNext()->getidade() << endl << endl;
    //-------------^-------------------------------------^
    

    It fixes easily by removing only the ->getNext() .

    I also draw attention to the construct that starts at 1 and ends equal to quant_el :

    for(i = 1; i <= quant_el; i++)
    //------^-----^
    

    Normally starts at 0 and runs while it is smaller, something very common for arrays. The way it did has a tendency to cause problems, but as in this particular case this value is only used to show on the screen ends up having no impact.

See the code with these changes all running on Ideone

    
03.02.2018 / 12:28