shouldz

Estrutura de Dados - Lista Simplesmente Encadeada I/R

Sep 26th, 2019
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.77 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. /*
  5. /@autor: Shouldz
  6. /@Linguagem: C
  7. /@Descrição: [Estrutura de Dados] Lista Simplesmente Encadeada com inserir, remover, concatenar e merge funcionais.
  8. */
  9.  
  10. typedef struct no{
  11.     int valor;
  12.     struct no *proximo;
  13. }no;
  14.  
  15. no *criar_no(int valor){
  16.     no *criar_no = malloc(sizeof(no));
  17.     criar_no -> valor = valor;
  18.     criar_no -> proximo = NULL;
  19.     return criar_no;
  20. }
  21.  
  22. no *concatenar(no *lista, no *lista2){
  23.     no *auxiliar = lista;
  24.     while(auxiliar -> proximo != NULL){
  25.         auxiliar = auxiliar -> proximo;
  26.     }
  27.     auxiliar -> proximo = lista2;
  28.     auxiliar = lista;
  29.     return auxiliar;
  30. }
  31.  
  32. no *inserir(no *lista, int valor){
  33.     //caso base
  34.     if(lista == NULL){
  35.         return criar_no(valor);
  36.     }else{
  37.         //caso não nulo, inserir no final    
  38.         no *auxiliar = lista;
  39.         while(auxiliar -> proximo != NULL){
  40.             auxiliar = auxiliar -> proximo;
  41.         }
  42.         auxiliar -> proximo = criar_no(valor);
  43.     }
  44.     return lista;
  45. }
  46.  
  47. no *Merge(no *lista, no *lista2){
  48.     //Inicialização de variáveis de controle
  49.     int contL1 = 0, contL2 = 0, contadorMain = 0;
  50.     no *auxiliaR = lista, *auxiliaR2 = lista2, *merge = NULL;
  51.     //While para verificar o tamanho das listas
  52.     while(auxiliaR != NULL && auxiliaR2 != NULL){
  53.         if(auxiliaR != NULL){
  54.             contL1++;
  55.             auxiliaR = auxiliaR -> proximo;
  56.         }else{
  57.             contL2++;
  58.             auxiliaR2 = auxiliaR2 -> proximo;
  59.         }
  60.     }
  61.     //Atualização dos ponteiros auxiliares
  62.     auxiliaR = lista;
  63.     auxiliaR2 = lista2;
  64.     if(contL1 < contL2){
  65.         contL1 = contL2;
  66.     }
  67.     //Realização do merge enquanto meu contador principal menor que a maior lista
  68.     while(contadorMain < contL1){
  69.         //Caso 01: Lista 1 ou 2 nula ou chegou a nula -> inserir o resto da lista não nula
  70.         if(auxiliaR == NULL || auxiliaR2 == NULL){
  71.             if(auxiliaR == NULL){
  72.                 merge = inserir(merge, auxiliaR2 -> valor);
  73.                 auxiliaR2 = auxiliaR2->proximo;
  74.             }else {
  75.                 merge = inserir(merge, auxiliaR->valor);
  76.                 auxiliaR = auxiliaR->proximo;
  77.             }
  78.         //Case base: inserir reversando elemento das listas
  79.         }else {
  80.             merge = inserir(merge, auxiliaR->valor);
  81.             merge = inserir(merge, auxiliaR2->valor);
  82.             //Atualização da posição dentro da lista
  83.             auxiliaR = auxiliaR->proximo;
  84.             auxiliaR2 = auxiliaR2->proximo;
  85.         }
  86.         contadorMain++;
  87.     }
  88.     return merge;
  89. }
  90.  
  91. no *remover(no *lista, int valor){
  92.     //caso base
  93.     no *auxiliar = lista;
  94.     if(lista == NULL){
  95.         return lista;
  96.     //caso primeiro elemento
  97.     }else if(auxiliar -> valor == valor){
  98.         auxiliar = auxiliar -> proximo;
  99.         return auxiliar;
  100.     }else{
  101.         //caso segundo elemento em diante
  102.         while(auxiliar -> proximo != NULL){
  103.             if(auxiliar -> proximo -> valor == valor){
  104.                 auxiliar -> proximo = auxiliar -> proximo -> proximo;
  105.                 return lista;
  106.             }
  107.             auxiliar = auxiliar -> proximo;
  108.         }
  109.     }
  110. }
  111.  
  112. void imprimir(no *lista){
  113.     no *auxiliar = lista;
  114.     while(auxiliar != NULL){
  115.         printf("[%d] ", auxiliar -> valor);
  116.         auxiliar = auxiliar -> proximo;
  117.     }
  118.     printf("\n");
  119. }
  120.  
  121. void main(){
  122.     no *lista = NULL;
  123.     lista = inserir(lista, 15);
  124.     lista = inserir(lista, 30);
  125.     lista = inserir(lista, 50);
  126.     lista = inserir(lista, 65);
  127.     lista = inserir(lista, 98);
  128.     imprimir(lista);
  129.     lista = remover(lista, 15);
  130.     imprimir(lista);
  131.     lista = remover(lista, 98);
  132.     imprimir(lista);
  133.     lista = remover(lista, 50);
  134.     imprimir(lista);
  135. }
Advertisement
Add Comment
Please, Sign In to add comment