Baixe o app para aproveitar ainda mais
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; }
Compartilhar