
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