Listas encadeadas

Como listas é um assunto relativamente complicado para quem nunca viu nada parecido, decidi colocar algumas funções de manipulação de lista unidirecional. Segue abaixo as funções com nomes auto descritivos.

typedef struct tlista
{
        int n;
        tlista *prox;
};


//INSERE UM NOVO NÓ NO INICIO DA LISTA:

tlista *lu_insereinicio(tlista *plst, int pn)
{
       tlista *aux;
       aux = (tlista*)malloc(sizeof(tlista));
       aux -> n = pn;
       aux -> prox = plst;
       return aux;
}


//EXIBE A LISTA

void lu_exibelista(tlista *plst)
{
     tlista *aux = plst;
     if (aux == NULL)
        printf("Lista vazia\n");
     else
         
         while (aux != NULL) // ou utilizar o for (aux=plst; aux != null; aux = aux -> prox)
         {
               printf("%d, ", aux -> n);
               aux = aux -> prox;
         }
}


//GERA UMA LISTA COM NUMEROS RANDOMICOS


tlista *gerarlista (tlista *pl)
{
    srand(time(NULL));
    int n;
    printf ("Digite a quantidade dos numeros: ");
    scanf ("%d", &n);
    for (int i=0; i<n; i++)
    {
        pl= lu_insereinicio (pl, rand ());
    }
    return (pl); 
}


//PROCURA UM NO EM UMA LISTA

int lu_pesquisa(tlista *plst, int pn)
{
    tlista *aux = plst;
    while (aux != NULL)
    {
          if (aux -> n == pn)
             return (1);
          
          aux = aux -> prox;
    }
    return (0);
}


//INSERE UM NÓ NO FINAL DA LISTA


tlista *lu_inserefinal(tlista *plst, int pn)
{
     tlista *aux, *ant = NULL;
     aux = plst;
     
     while (aux != NULL)
     {
           ant = aux;
           aux = aux -> prox;
     }
     
     if (ant != NULL)
     {
        aux = (tlista*)malloc(sizeof(tlista));
        aux  -> n = pn;
        aux -> prox = NULL;
        ant -> prox = aux;
     }
     else
         plst = lu_insereinicio(plst,pn);
     return (plst);
}


//MUITO IMPORTANTE, LIMPA A LISTA APÓS USO

tlista *lu_limpatudo (tlista *pl)
{
    tlista *aux;
    while (pl!= NULL)
    {
        aux= pl->prox;
        free (pl);
        pl= aux;
    }
    return (NULL);
}


/*INSERE NÓ NO MEIO DA LISTA (NOTE QUE UTILIZANDO
SEMPRE ESTA FUNÇÃO, A LISTA SERÁ GERADA
ORGANIZADA, DE ACORDO COM O PARAMETRO QUE DESEJAR*/

tlista *lu_inseremeio (tlista *pl, int pn)
{
    tlista *aux, *ant= NULL, *novo;
    aux= pl;
    if (pl==NULL||pl->n >= pn)
    {
        pl= lu_insereinicio (pl, pn);
    }
    else
    {
        while (aux != NULL && aux->n < pn)
        {
            ant= aux;
            aux= aux->prox;
        }
        novo= (tlista*)malloc(sizeof(tlista));
        novo->n= pn;
        ant->prox= novo;
        novo->prox= aux;
    }
    return (pl);
}
Anúncios

Um comentário sobre “Listas encadeadas

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s