Buscar

exemplo de Lista dinamica em linguagem C

Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
typedef struct no{
 int num;//Variável que guarda a informação
 struct no *prox;//Referência para o próximo nó
}No;
typedef struct lista{
 No* inicio;//Referência para a primeira posição da lista
 No* fim;//Referência para a última posição da lista
 int tamanho;//Variavel para controle do tamanho
}Lista;
//Função para inicialização da lista. Aloca memória e inicializa as variáveis
//Retorna uma lista vazia
Lista* criar_lista(){
 Lista* nova = (Lista*)malloc(sizeof(Lista));
 if(nova == NULL){
 exit(1);
 }
 nova->inicio = nova->fim = NULL;
 nova->tamanho = 0;
 return nova;
}
//Função para criar um nó. Retorna um nó
No* novo_no(int dado){
 No* novo = (No*)malloc(sizeof(No));//Cria um nó alocando memória dinamicamente
 novo->num = dado;//Armazena um valor na variável num
 return novo;//Retorna o novo nó criado
}
//Verifica se a lista está vazia
int lista_vazia(Lista* lista){
 return lista->inicio == NULL;
}
//Insere um valor na primeira posição da lista
void inserir_inicio(Lista* lista, int num){
 No* novo = novo_no(num);//Cria um novo nó
 if(lista_vazia(lista)){//Verifica se a lista está vazia. Caso esteja a última e primeira posição apontarão o mesmo nó
 novo->prox = NULL;
 lista->inicio = lista->fim = novo;
 }else{
 novo->prox = lista->inicio;//O novo nó referencia o inicio
 lista->inicio = novo;//Inicio passa a ser o novo nó criado
 }
 -+ lista->tamanho++;
}
//Insere um valor na última posição da lista
void inserir_fim(Lista* lista, int num){
 No* novo = novo_no(num);//Cria um novo nó alocando memória dinamicamente
 if(lista_vazia(lista)){//Verifica se a lista está vazia.
 novo->prox = NULL;
 lista->fim = lista->inicio = novo;//Se a pilha estiver vazia o novo nó passa a ser o fim e inicio
 }else{
 lista->fim->prox = novo;//O novo nó passa a ser o elemento seguinte ao atual fim
 novo->prox = NULL;
 lista->fim = novo;//Lista fim passa a ser o novo nó
 }
 lista->tamanho++;
}
//Insere um valor em qualquer posição da lista
void inserir_meio(Lista* lista, int num, int posicao){
 No* aux = lista->inicio;//Variável auxiliar para percorrer os elementos da lista e a inicializa com o primeiro elemento
 No* novo = novo_no(num);//Criar um novo nó
 int i;
 if(posicao <= 0 || posicao > (lista->tamanho+1)){//Verifica se o usuário informou uma posição válida
 printf("\nPosição maior ou menor do que é permitido.");
 }else{
 if(posicao == (lista->tamanho+1)){//Verifica se o valor é a última posição a ser adicionada
 inserir_fim(lista,num);//Caso seja o último valor adiciona o elemento no fim
 }else{
 if(posicao == 1){//Verifica se a posição informada é a inicial caso seja insere o valor no inicio
 inserir_inicio(lista,num);
 }else{
 for(i=2; i<posicao; i++){//Laço para percorrer os elementos da lista
 aux = aux->prox;
 }
 novo->prox = aux->prox;//O elemento seguinte ao novo nó passa a ser o próximo elemento referente a variável aux
 aux->prox = novo;//O próximo elemento após a variável aux passa a ser o novo nó
 lista->tamanho++;
 }
 }
 }
}
//Função de remoção do primeiro elemento da fila
void remover_inicio(Lista* lista){
 No* inicio = lista->inicio;//Varável auxiliar que vai armazena o endereço da primeira posição da fila
 if(lista_vazia(lista)){
 printf("\nLista vazia!\n");
 }else{
 printf("\nElemento %d removido.",inicio->num);//Mostra o elemento removido
 lista->inicio = inicio->prox;//A segunda posição da lista passa a ser a primeira
 free(inicio);//Libera o espaço de memória da variável que armazenava o conteúdo da primeira posição
 lista->tamanho--;
 }
}
//Função de remoção do último elemento da fila
void remover_fim(Lista* lista){
 No* aux;//Variável para auxiliar na remoção
 if(lista_vazia(lista)){
 printf("\nLista vazia!\n");
 }else{
 for(aux=lista->inicio; aux->prox!=lista->fim; aux=aux->prox);//Laço para percorrer a lista até achar a penúltima posição
 aux->prox = NULL;
 printf("\nElemento %d removido.",lista->fim->num);//Mostra o valor removido
 free(lista->fim);//Liberação da memória do elemento que era o último
 lista->fim = aux;//fim passa a ser o penúltimo elemento
 lista->tamanho--;
 }
}
//Função que mostra todos os elementos da lista
void mostrar_lista(Lista* lista){
 No* aux;//Variável auxiliar que vai percorrer toda a lista
 int i = 1;
 if(lista_vazia(lista)){
 printf("\nLista vazia!\n");
 }else{
 for(aux = lista->inicio; aux != NULL; aux = aux->prox){//Laço para percorrer a fila e mostrar os elementos
 printf("\n%dº elemento - %d",i,aux->num);
 i++;
 }
 }
}
//Função que remove todos os elementos armazenados na lista
void esvaziar_lista(Lista* lista){
 No* aux;//Variável auxiiar para percorrrer e liberar todos os elementos da lista
 if(lista_vazia(lista)){//Se a lista estiver vazia retorna uma mensagem
 printf("\nLista vazia!\n");
 }else{
 for(aux = lista->inicio; aux != NULL; aux = lista->inicio){//Laço para percorrer a lista
 lista->inicio = aux->prox;//O inicio da fila passar a ser o elemento seguinte
 free(aux);//Libera o espaço do elemento anterior
 }
 lista->inicio = lista->fim = NULL;//Reinicializa a lista
 lista->tamanho = 0;
 printf("\nLista esvaziada!\n");
 }
}
int main(){
 int opc, num, posicao;
 setlocale(LC_ALL,"portuguese");
 Lista* lista = criar_lista();
 //Menu de opções
 while(1){
 system("cls");
 printf("\tMENU DE OPÇÕES");
 printf("\n1 - Inserir no inicio da lista");
 printf("\n2 - Inserir no meio da lista");
 printf("\n3 - Inserir no fim da lista");
 printf("\n4 - Remover do inicio da lista");
 printf("\n5 - Remover do fim da lista");
 printf("\n6 - Mostrar toda a lista");
 printf("\n7 - Esvaziar a lista");
 printf("\n8 - Tamanho da lista");
 printf("\n0 - Sair\n");
 printf("\nInsira a opção desejada: ");
 scanf("%d",&opc);
 if(opc == 1){
 printf("\nInsira o valor que deseja armazenar: ");
 scanf("%d",&num);
 inserir_inicio(lista,num);
 }
 if(opc == 2){
 printf("\nInsira a posição que deseja armazenar: ");
 scanf("%d",&posicao);
 printf("\nInsira o valor que deseja armazenar: ");
 scanf("%d",&num);
 inserir_meio(lista,num,posicao);
 }
 if(opc == 3){
 printf("\nInsira o valor que deseja armazenar: ");
 scanf("%d",&num);
 inserir_fim(lista,num);
 }
 if(opc == 4){
 remover_inicio(lista);
 }
 if(opc == 5){
 remover_fim(lista);
 }
 if(opc == 6){
 mostrar_lista(lista);
 }
 if(opc == 7){
 esvaziar_lista(lista);
 }
 if(opc == 8){
 printf("\nTamanho da lista - %d -",lista->tamanho);
 }
 if(opc == 0){
 exit(0);
 }
 printf("\n\n");
 system("pause");
 }
 return 0;
}

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Outros materiais