Bubble not changing list values

Asked

Viewed 42 times

0

When I run the first consultList() data is shown in the console, however, after executing the bubbleSort() the query does not display the data.

Follow the code below:

#include <iostream>

#define TAM 10 // Define constante para o tamanho do vetor de dados

/*
 * Nesta questão foi escolhido trabalhar com Lista pois
 */

using namespace std;


struct Aluno {
    int RU;
    string nome;
    string email;
};

struct Lista {
    Aluno dados[TAM];
    int ult;
};

Aluno criaAluno(int RU, string nome, string email) {
    Aluno aluno;
    aluno.nome = nome;
    aluno.email = email;
    aluno.RU = RU;
    return aluno;
}

void iniciarLista(Lista *lista) {
    lista->ult = -1;
}

bool listaCheia(Lista *lista) {
    return lista->ult == TAM - 1;
}

void consultarLista(Lista *lista) {
    for (int i = 0; i <= lista->ult; ++i) {
        cout << "Ru: " << lista->dados[i].RU << endl;
        cout << "Nome: " << lista->dados[i].nome << endl;
        cout << "Email: " << lista->dados[i].email << endl << endl;
    }
}

void insereNoFim(Lista *lista, Aluno aluno) {
    if (listaCheia(lista)) {
        cout << "Lista cheia!" << endl;
        return;
    }

    lista->ult++;
    lista->dados[lista->ult] = aluno;
}

void insereDadosNaLista(Lista *lista) {
    insereNoFim(lista, criaAluno(2524388, "Artur asd", "[email protected]"));
    insereNoFim(lista, criaAluno(1, "Lorem", "[email protected]"));
    insereNoFim(lista, criaAluno(2, "Ipsum Dassi", "[email protected]"));
    insereNoFim(lista, criaAluno(3, "Artorios", "[email protected]"));
    insereNoFim(lista, criaAluno(4, "Marcos", "[email protected]"));
    insereNoFim(lista, criaAluno(5, "Antonio", "[email protected]"));
    insereNoFim(lista, criaAluno(6, "Marcus", "[email protected]"));
    insereNoFim(lista, criaAluno(7, "Felipe", "[email protected]"));
    insereNoFim(lista, criaAluno(8, "Daniele", "[email protected]"));
    insereNoFim(lista, criaAluno(9, "Soulja", "[email protected]"));
}

void buubleSort(Lista *lista) {
    for (int i = 0; i <= lista->ult; ++i) {
        for (int j = 0; j <= lista->ult; ++j) {
            Aluno atual = lista->dados[j];
            Aluno prox = lista->dados[j + 1];

            if (atual.RU > prox.RU) {
                lista->dados[j] = prox;
                lista->dados[j + 1] = atual;
            }
        }
    }


}

int main() {
    Lista alunos;

    iniciarLista(&alunos);
    insereDadosNaLista(&alunos);
    consultarLista(&alunos); //Quando executado aqui, os valores aparecem
    buubleSort(&alunos);
    consultarLista(&alunos); //Aqui não

    cout << alunos.dados[1].nome << endl;

    return 0;
}
  • 1

    In buubleSort(), function writes outside the array boundaries Lista *lista->dados when j = 9. The problem could be fixed if you replace the line for (int j = 0; j <= aux.ult; ++j) for for (int j = 0; j < aux.ult; ++j). But it seems to me that this function has more problems than this since you do not apply the ordering directly on the varivell Lista* lista, but in the copy Lista aux.

1 answer

1


Your bubbleSort has some problems:

  1. It attempts to access invalid data vector indexes:
    Aluno prox = aux.dados[j + 1]; //Quando j = 9, j+1=10 (índice inválido)

Here you should make j range from 0 to Ult-1

for (int j = 0; j <= (aux.ult - 1); ++j)
  1. You forgot to use the index i.

  2. He is not ordering his original list, but a copy of it:

Lista aux = *lista;

This line creates a new object aux by copying your original list. Therefore, you do the whole Sort in the copy while the original object remains changed. To change the original list, you should use pointer syntax using the object lista received as a parameter.

  • I had copied and pasted here to the previous code, had created aux for testing. But the first two items helped me, thank you!!

Browser other questions tagged

You are not signed in. Login or sign up in order to post.