insert names neatly into a list, I’m not aware of this

Asked

Viewed 61 times

0

//function of inserting there; there only does it with the 3 first names, the others it does not order

Aluno *cad(Aluno *aluno)
{
  Aluno *aux;
  while(1)
  {
    aux = aluno;
    if(aux->prox == NULL)
    {
        Aluno *criar = novo();
        if(criar == NULL)
        {
            break;
        }
        if(strcmp(aux->nome, criar->nome) > 0)
        {
            criar->prox = aux;
            aux = criar;
        }
        else
        {
            aux->prox = criar;
        }
    }
    else
    {
        Aluno *criar = novo();
        if(criar == NULL)
        {
            break;
        }
        Aluno *aux2;
        Aluno *aux3 = aux;
        while(aux3->prox != NULL)
        {
            printf("1\n");
            aux2 = aux3->prox;
            if(strcmp(criar->nome, aux3->nome) > 0)
            {
                printf("entrei no if\n");
                criar->prox = aux2;
                aux3->prox = criar;
                break;
            }
            aux3 = aux3->prox;
        }
        if(aux3->prox == NULL)
        {
            aux3->prox = criar;
        }
    }
    aluno = aux;
}
  return aluno;
}

1 answer

2


I’m guessing there’s a function Aluno* criar().

Try this here:

#include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0

Aluno* criar(); // prototipo da funcao ja existente

Aluno* inserir(Aluno* alunoAInserir, Aluno* lista)
{
    Aluno* a = lista;
    Aluno* anteA = a;
    int cmpAnterior = 9;
    int cmpAtual;
    int inserido = FALSE;

    if (a == NULL)
    {
        a = lista = criar();
        return inserir(alunoAInserir, lista);
    }

    for (; a != NULL; anteA = a, a = a->prox)
    {
        if ((cmpAtual = strcmp(alunoAInserir->nome, a->nome)) != cmpAnterior)
        {
            if (cmpAnterior != 9)
            {
                if (cmpAtual < 0)
                {
                    // Insere a esquerda.
                    alunoAInserir->prox = anteA->prox /*que e o proprio a*/;
                    anteA->prox = alunoAInserir;
                }
                else if (cmpAtual == 0)
                {
                    // Insere a direita.
                    alunoAInserir->prox = a->prox;
                    a->prox = alunoAInserir;
                }

                if (cmpAtual <= 0)
                {
                    inserido = TRUE;
                    break;
                }
            }
            else if (cmpAnterior == 9 && cmpAtual < 0)
            {
                // Insere na cabeca da lista.
                Aluno* tmp = lista;
                lista = alunoAInserir;
                alunoAInserir->prox = tmp;

                inserido = TRUE;

                break;
            }

            cmpAnterior = cmpAtual;
        }
    }

    if (!inserido)
    {
        // Insere no fim da lista.
        anteA->prox = alunoAInserir;
        alunoAInserir->prox = NULL;
    }

    return lista;
}

Use of function:

Aluno* lista = inserir(alunoAInserir, NULL);
  • 1

    thanks friend, helped me mt!

  • What is cmpAtual and Previous?

  • It goes like this: if the list contains { Antonia, Antonio, Bonifacio, Jose } and the item to be included is Joao, the comparisons will give { +1, +1, +1, -1 }. The logic of the program is prepared to treat only those cases where the relative comparison between elements of the list changes, among other exceptions.

Browser other questions tagged

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