CarlosWGama

Lista montada

Sep 18th, 2018
145
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <locale.h>
  4.  
  5. struct no {
  6.     int valor;
  7.     struct no *proximo;
  8. };
  9.  
  10.  
  11. //visualize linked list
  12.  
  13. struct lista {
  14.     struct no *inicio;
  15.     struct no *fim;
  16. };
  17.  
  18. void inserirInicio(struct lista *lista, int valor) {
  19.  
  20.     struct no *novoValor = malloc(sizeof(struct no));
  21.     novoValor->valor = valor;
  22.     novoValor->proximo = NULL;
  23.  
  24.     if (lista->inicio == NULL) {
  25.         lista->inicio = novoValor;
  26.         lista->fim = novoValor;
  27.     } else {
  28.         novoValor->proximo = lista->inicio;
  29.         lista->inicio = novoValor;
  30.     }
  31. }
  32.  
  33. void inserirFinal(struct lista *lista, int valor) {
  34.     struct no *novoNo = malloc(sizeof(struct no));
  35.     novoNo->valor = valor;
  36.     novoNo->proximo = NULL;
  37.  
  38.     if (lista->inicio == NULL) {
  39.         lista->inicio = novoNo;
  40.         lista->fim = novoNo;
  41.     } else {
  42.         lista->fim->proximo = novoNo;
  43.         lista->fim = novoNo;
  44.     }
  45. }
  46.  
  47. void removerValor(struct lista *lista, int valor) {
  48.  
  49.     struct no *aux;
  50.     struct no *auxAnterior = NULL;
  51.     aux = lista->inicio;
  52.  
  53.     //Percorre até o final da lista ou até o achar o valor
  54.     while (aux != NULL && aux->valor != valor) {
  55.         auxAnterior = aux;
  56.         aux = aux->proximo;
  57.     }
  58.  
  59.  
  60.     if (aux == NULL) { //Não achou
  61.         printf("Não achou\n");
  62.     } else {
  63.  
  64.         if (lista->inicio == lista->fim) {
  65.             //Só tem um elemento
  66.             lista->inicio = NULL;
  67.             lista->fim = NULL;
  68.  
  69.         } else if (lista->inicio == aux) {
  70.             //Remover o inicio da lista
  71.             lista->inicio = lista->inicio->proximo;
  72.             //lista->inicio = aux->proximo;
  73.         } else if (lista->fim == aux) {
  74.             //Remove o ultimo elemento da lista
  75.             lista->fim = auxAnterior;
  76.             lista->fim->proximo = NULL;
  77.  
  78.         } else {
  79.             //Remover do meio da lista
  80.             auxAnterior->proximo = aux->proximo;
  81.             aux->proximo = NULL;
  82.         }
  83.          free(aux); //Apaga espaço da memoria
  84.  
  85.     }
  86.  
  87.  
  88. }
  89.  
  90. void listar(struct lista *lista) {
  91.  
  92.     struct no*aux;
  93.     aux = lista->inicio;
  94.     while(aux != NULL) {
  95.         printf("%d\n", aux->valor);
  96.         aux = aux->proximo;
  97.     }
  98. }
  99.  
  100. int main() {
  101.     setlocale(LC_ALL, "");
  102.     struct lista *minhaLista = malloc(sizeof(struct lista));
  103.     minhaLista->inicio = NULL;
  104.     minhaLista->fim = NULL;
  105.  
  106.     inserirInicio(minhaLista, 10);
  107.     inserirInicio(minhaLista, 5);
  108.     inserirFinal(minhaLista, 18);
  109.     inserirFinal(minhaLista, 9);
  110.     inserirInicio(minhaLista, 8);
  111.     inserirInicio(minhaLista, 54);
  112.     inserirFinal(minhaLista, 1);
  113.     inserirInicio(minhaLista, 32);
  114.     inserirFinal(minhaLista, 22);
  115.     removerValor(minhaLista, 5);
  116.     removerValor(minhaLista, 32);
  117.     removerValor(minhaLista, 22);
  118.     removerValor(minhaLista, 100);
  119.     listar(minhaLista);
  120.  
  121.     return 0;
  122. }
RAW Paste Data