#C - Lista Encadeada


Para compreender o que é uma Lista, vamos utilizar a imagem abaixo:


Como podem ver, assim como Pilha e Fila a Lista tem uma variável que irá conter os dados e um ponteiro apontando para a próxima posição.

Para começar a fazer uma lista deve-se utiliza:.
-Código:
# include <stdio.h>
# include <conio.h>
# include <stdlib.h>
# include <string.h>
# include <malloc.h>

struct elemento {
  int dados; // Variável que vai conter os valores.
  struct elemento *prox; // Ponteiro que aponta para o próximo item.
};

int li_liberada=0; // Variável que irá dizer se já existe lista criada.

typedef struct elemento *Lista; // Definimos um novo apelido para elemento.

Depois de criar a codificação inicial, devemos crias as funções de nossa Lista.

----- Funções -----

Cria_Lista - Função que inicializa a Lista.
-Código:
Lista* cria_Lista(int liberada){
  if (liberada != 0){
  puts("Ja existe uma Lista criada");
    getche();
    return NULL;  
  }else{
      Lista *li = (Lista*) malloc (sizeof(Lista));  // Reserva espaço de memória para a lista.
      if (li == NULL){
       puts("Nao foi possivel criar a lista por falta de espaço");
 } else{
          *li = NULL;
          printf("\nLista Criada apontando para %p", li);
          li_liberada = 1; // Determina que a lista existe.
      }
      getche();
      return li;
   }
}

Libera_Lista - Função que libera os itens da lista.
-Código:
int libera_Lista(Lista *li){
  if (li != NULL){
     elemento *no; // Cria o ponteiro Nó.
     while ((*li) != NULL){ // Enquanto Nó não for nulo.
         no = *li; // Nó aponta para Lista.
         *li = (*li)->prox; //Lista aponta para prox.
         free(no); // Libera Nó.
     }
     li = NULL; // Lista se torna Nula.
     free(li); // Liberamos a lista.
     li_liberada = 0; // Indicamos que não existe lista criada.
     return 1;
  }else{
     return 0;
  }
}

Tamanho_Lista - Função que conta e informa o tamanho atual da Lista.
-Código:
int tamanho_Lista(Lista *li){
  if (li == NULL)
     return 0;
  if (*li == NULL)
     return -1;    
  int cont = 0;
  elemento *no = *li;
  while(no != NULL){ // Caso o Nó não for nulo.
    cont++; // Aumenta contador.
    no = no->prox; // Nó aponta para o próximo.
  }
  return cont;
}

Lista_Vazia - Função que informa se a Lista está Vazia.
-Código:
int lista_vazia(Lista *li){ // Verifica se a lista está vazia.
  if (li == NULL)
     return 1;
  if (*li == NULL)
     return 2;
  return 0;
}

Insere_Lista_Inicio - Função que insere um valor no inicio da Lista.
-Código:
int insere_Lista_inicio(Lista *li, int al){ // Recebe Lista e Variável al.
  if (li == NULL)
     return 0;
  elemento *no = (elemento*) malloc (sizeof(elemento)); // Aloca espaço para o Nó.
  if (no == NULL)
     return 2;
  no->dados = al; // Nó - Dados aponta para Al.
  no->prox = (*li); // Nó - prox aponta para lista.
  *li = no; // Lista recebe Nó.
  return 1;
}

Insere_Lista_Final - Função que insere um valor no final da Lista.
-Código:
int insere_Lista_final(Lista *li, int al){ // Recebe Lista e Variável Al.
  if (li == NULL)
     return 0;
  elemento *no = (elemento*) malloc (sizeof(elemento)); // Aloca espaço para Nó.
  if (no == NULL)
     return 2;
  no->dados = al; // Nó - Dados recebe Al.
  no->prox = NULL; // Nó - Prox recebe Nulo.
  if ((*li) == NULL){
     *li = no;
  }else{
     elemento *aux = *li; // Ponteiro auxiliar recebe lista.
     while (aux->prox != NULL){
         aux = aux->prox;
     }
     aux->prox = no; // Auxiliar - Prox rececebe Nó.
  }
  return 1;
}

Insere_Lista_Ordenada - Função que ordena a lista.
-Código:
int insere_Lista_ordenada(Lista *li, int al){
  if (li == NULL)
     return 0;
  elemento *no = (elemento*) malloc (sizeof(elemento)); // Aloca espaço na memória.
  if (no == NULL)
     return 2;
  no->dados = al;
  if (lista_vazia(li)){ // Lista vazia.
     no->prox = (*li); // Nó Prox aponta para lista.
     *li = no; // Lista recebe nó.
     return 1;
  }else{
     elemento *ant, *atual = *li;
     while (atual != NULL && atual->dados < al){ // Enquanto atual for nulo e dados forem menores que al.
         ant = atual; // anterior recebe atual.
         atual = atual->prox; // atual recebe proxima posição.
     }
     if (atual == *li){ // Caso atual seja igual a lista.
         no->prox = (*li); // Próximo nó recebe conteúdo da lista.
         *li = no; // lista recebe nó.
     }else{
         no->prox = ant->prox; // Próximo Nó recebe Próximo Ant.
         ant->prox = no; // Próximo Ant recebe Nó.
     }
  }
  return 1;
}

Remove_Lista_Inicio - Função que Remove o item que está no inicio da Lista.
-Código:
int remove_Lista_inicio(Lista *li){ // Remove o inicio da lista.
  if (li == NULL)
     return 0;
  if ((*li) == NULL)
     return 2;
  printf("%p", li);
  getche();
  elemento *no = *li; // Nó recebe Lista.
  *li = no->prox; // Lista aponta para Nó. E agora se torna o inicio.
  free(no); // Libera Nó.
  return 1;
}

Remove_Lista_Final - Função que remove o item que está no Final da Lista.
-Código:
int remove_Lista_final(Lista *li){ // Remove final da lista.
  if (li == NULL)
     return 0;
  if ((*li) == NULL)
     return 2;
  printf("%p", li);
  getche();
  elemento *ant, *no = *li; // Cria 2 ponteiros, Nó recebe Lista.
  while(no->prox != NULL){ // Emquanto o Proximo Nó não for nulo.
     ant = no; // Anterior aponta para Nó.
     no = no->prox; // Nó aponta para o próximo nó.
  }
  if (no == (*li)){ // Caso nó seja igual a lista.
     *li = no->prox; // Lista aponta para Próximo Nó.
  }else{
     ant->prox = no->prox; //Senão Próximo Anterior aponta para Próximo Nó.
  }
  free(no); //Liberamos o Nó.
  return 1;
}

Remove_Lista_Matricula - Função que remove o item Matricula da Lista.
-Código:
int remove_Lista_matricula(Lista *li, int mat){ // Recebe lista e matricula.
  if (li == NULL)
     return 0;
  elemento *ant, *no = *li; // Criar 2 ponteiros e Nó recebe Lista.
  while(no !=NULL && no->dados != mat){ // Enquanto Nó for diferente de Nulo e Dados for diferente de Matricula.
      ant = no; // Anterior aponta para nó.
      no = no->prox;  
  }
  if (no == NULL)
     return 2;  // Não encontrado.
  printf("%p", li);
  getche();
  if (no == *li){  // Inicio da lista.
     *li = no->prox; // Lista recebe próximo nó.
  }else{
     ant->prox = no->prox; // Próximo Anterior aponta para Próximo Nó.
  }
  free(no); // Liberamos o Nó.
  return 1;
}

Conulta_Lista_Posição - Função que consulta a posição de um item na Lista.
-Código:
int consulta_Lista_posicao(Lista *li, int pos, int al){ // Recebe Lista, Posição e Al.
  if (li == NULL || pos <=0) // Caso lista for igual a nula ou posição menor que 0.
     return 0;
  elemento *no = *li; // Nó recebe Lista.
  int i = 1; // Definimos int i como 1.
  while(no != NULL && i < pos){ // enquanto Nó for diferente de nulo e i for menor que posição.
     no = no->prox; // Nó aponta para Próximo Nó.
     i++; // I aumenta valor.
  }
  if (no == NULL){ // Caso Nó for nulo.
     return 0;
  }else{
     al = no->dados; // Al aponta para os Dados do Nó.
     printf("\n%i", al);
     getche();
  }
  return 1;
}

Consulta_Lista_Matricula - Função que consulta uma Matricula dentro da Lista.
-Código:
int consulta_Lista_matricula(Lista *li, int mat, int al){ // Recebe Lista, Matricula, Al.
  if (li == NULL) // Caso lista for nula.
     return 0;
  elemento *no = *li; // Nó recebe lista.
  while(no != NULL && no->dados != mat){ // Enquanto Nó for Nulo e Dados forem diferentes de Matricula.
     no = no->prox; // Nó aponta para o Próximo Nó.
  }
  if (no == NULL){  // Caso Nó seja Nulo.
     return 0;
  }else{
     al = no->dados; // Al aponta para Dados do Nó.
     printf("\n%i", al);
     getche();
  }
  return 1;
}

Agora que já fizemos todas as funções necessárias podemos começar a brincar com essa lista, porém antes é preciso criar o código principal. Irei colocar abaixo um código principal com as variáveis básicas para a Lista funcionar.

-Código:
int main(){
  Lista *li = NULL;  // Armazena o topo da Lista
  int z=0, x, Final;      // Retorno das funções
  int dados;
  return 0;
}

Basicamente é isto, agora você pode pegar as funções acima e ir fazendo a sua Lista de acordo com sua necessidade. Irei deixar um video aqui abordando o mesmo assunto, caso queiram assistir para entender melhor:



Referência (acessado em 27/08;2016): http://web.unipar.br/~piffer/2Serie(Estrutura)/3bim/12_Exemplo-Lista-dinamica.cpp


Nenhum comentário:

Postar um comentário