SIGSEGV (Segmentation fault) Проблема в C ++

Я делаю бинарное дерево поисков, проблема титула происходит, когда я пробую вводить второй элемент, кратко одинокий он позволяет мне вводить первого.

Здесь - введенный код:

void Arbol::insertar(Alumno a, Nodo *aux){
    Nodo *nuevo = new Nodo(a);
    Nodo *pos;
    if(!buscarCoincidencia(a,raiz)){
        if(raiz==nullptr){
            raiz=nuevo;
        }
        else{
            pos=buscarLugar(a,raiz);
            if(a.getMatricula()<pos->getAlumno().getMatricula()){
                pos->setIzq(nuevo);
            }
            else{
                pos->setDer(nuevo);
            }
        }
    }
    else{
        cout << "Elemento repetido, imposible introducir nuevamente." << endl;
    }
}

Nodo* Arbol::buscarLugar(Alumno a, Nodo *aux) {
    if(a.getMatricula()<aux->getAlumno().getMatricula()){
        if(aux->getIzq()== nullptr){
            return aux;
        }
        else {
            buscarLugar(a, aux->getIzq());
        }
    }
    else {
        if (aux->getDer() == nullptr) {
            return aux;
        } else {
            buscarLugar(a, aux->getIzq());
        }
    }
}

bool Arbol::buscarCoincidencia(Alumno a,Nodo *arbol) {
    if(arbol== nullptr){
        return false;
    }
    else if(arbol->getAlumno().getMatricula()==a.getMatricula()){
        return true;
    }
    else{
        buscarCoincidencia(a,arbol->getIzq());
        buscarCoincidencia(a,arbol->getDer());
    }
}
2
задан 19.03.2019, 08:54
1 ответ

В тебе funciГіn buscarLugar не все маршруты ejecuciГіn возвращают стоимость, это вызывает, что после того, как сохраняет информацию, возвращенную одним из этих маршрутов, Г©ste был незнакомой стоимостью, которая в des-referenciarlo, вызывает ошибку доступа у памяти.


Каждый раз, когда funciГіn он перемещает ее из-за них lГ-neas помеченные, ты ничего не возвращаешь:

Nodo* Arbol::buscarLugar(Alumno a, Nodo *aux) {
    if (a.getMatricula() < aux->getAlumno().getMatricula()) {
        if (aux->getIzq() == nullptr) {
            return aux;
        }
        else {
            buscarLugar(a, aux->getIzq());
\\          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ <--- No devuelve dato
        }
    }
    else {
        if (aux->getDer() == nullptr) {
            return aux;
        } else {
            buscarLugar(a, aux->getIzq());
\\          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ <--- No devuelve dato
        }
    }
}

, введя, сначала ты ищешь dГіnde сохранять информацию:

pos=buscarLugar(a,raiz);

, Если призыв к buscarLugar перемещает из-за одной из точек, в которых ты ничего не возвращаешь, pos tendrГЎ неопределенная стоимость, которая бьет козырем des-referenciarlo:

if (a.getMatricula() < pos->getAlumno().getMatricula()){
//                        ~~ <-- Des-referencia
    pos->setIzq(nuevo);
//     ~~ <-- Des-referencia
}
else{
    pos->setDer(nuevo);
//     ~~ <-- Des-referencia
}

Ввиду отсутствия видения ее implementaciГіn Nodo, я думаю, что твои указатели левой стороны и правой стороны не инициализируются в nullptr, и ты cГіdigo из buscarLugar он выходит из-за точек, в которых возврат не остается инициализировавшим.

Другая вещь, которые нужно иметь в виду: У

Ты cГіdigo есть другие проблемы, чем deberГ-схвати проверять:

  • mГ©todo у insertar есть бегство памяти, если стоимость, которую нужно вводить уже, существует.
  • mГ©todo insertar получает указатель в Nodo, которые он не использует.
  • Она funciГіn buscarCoincidencia tambiГ©n заканчивается, не возвращая данных в точке Ваш ejecuciГіn.
1
ответ дан 02.12.2019, 05:28
  • 1
    Большое спасибо, я верю в то, что aú n я должен улучшаться слишком много! – Jesús Alexis Ramírez Navor 21.03.2019, 14:30