shouldz

Estrutura de Dados - Lista Duplamente Encadeada I/R

Sep 27th, 2019
205
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.01 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 Duplamente Encadeada com inserir e remover funcionais.
  8. */
  9.  
  10. typedef struct no{
  11.     int valor;
  12.     struct no *proximo;
  13.     struct no *anterior;
  14. }no;
  15.  
  16. no *criar_no(int valor, no *anterior){
  17.     no *criar_no = malloc(sizeof(no));
  18.     criar_no -> valor = valor;
  19.     criar_no -> proximo = NULL;
  20.     criar_no -> anterior = anterior;
  21.     return criar_no;
  22. }
  23.  
  24. no *inserir(no *lista, int valor){
  25.     //caso base
  26.     if(lista == NULL){
  27.         return criar_no(valor, NULL);
  28.     }else{
  29.         //caso não nulo, inserir no final    
  30.         no *auxiliar = lista;
  31.         while(auxiliar -> proximo != NULL){
  32.             auxiliar = auxiliar -> proximo;
  33.         }
  34.         auxiliar -> proximo = criar_no(valor, auxiliar);
  35.     }  
  36.     return lista;
  37. }
  38.  
  39. no *remover(no *lista, int valor){
  40.     //caso base
  41.     no *auxiliar = lista;
  42.     if(lista == NULL){
  43.         return lista;
  44.     //caso lista com apenas um elemento
  45.     }else if(auxiliar -> valor == valor && auxiliar -> proximo == NULL && auxiliar -> anterior == NULL){
  46.         auxiliar = NULL;
  47.         return auxiliar;
  48.     //caso primeiro elemento
  49.     }else if(auxiliar -> valor == valor){
  50.         auxiliar = auxiliar -> proximo;
  51.         auxiliar -> anterior = NULL;
  52.         return auxiliar;
  53.     }else{
  54.         //caso segundo elemento em diante
  55.         while(auxiliar -> proximo != NULL){
  56.             if(auxiliar -> proximo -> valor == valor){
  57.                 auxiliar -> proximo = auxiliar -> proximo -> proximo;
  58.                 return lista;
  59.             }
  60.             auxiliar = auxiliar -> proximo;
  61.         }
  62.     }
  63. }
  64.  
  65. void imprimirA(no *lista){
  66.     no *auxiliar = lista;
  67.     if(auxiliar == NULL){
  68.         printf("LISTA VAZIA");
  69.     }
  70.     while(auxiliar != NULL){
  71.         printf("[%d] ", auxiliar -> valor);
  72.         auxiliar = auxiliar -> proximo;
  73.     }
  74.     printf("\n");
  75. }
  76.  
  77. void visualizarPonteiros(no *lista){
  78.     no *auxiliar = lista;
  79.     while(auxiliar != NULL){
  80.         if(auxiliar -> anterior == NULL && auxiliar -> proximo != NULL){
  81.             printf("[NULL <=%i=> %i]", auxiliar -> valor, auxiliar -> proximo -> valor);
  82.         }else if(auxiliar -> proximo == NULL && auxiliar -> anterior != NULL){
  83.             printf("[%i <=%i=> NULL]", auxiliar -> anterior -> valor, auxiliar -> valor);
  84.         }else if(auxiliar -> proximo == NULL && auxiliar -> anterior == NULL){
  85.             printf("[NULL <=%i=> NULL]", auxiliar -> valor);
  86.         }else{
  87.             printf("[%i <=%i=> %i] ", auxiliar -> anterior -> valor, auxiliar -> valor,
  88.             auxiliar -> proximo -> valor);  
  89.         }
  90.         auxiliar = auxiliar -> proximo;
  91.     }
  92.     printf("\n");
  93. }
  94.  
  95. void main(){
  96.     no *lista = NULL;
  97.     lista = inserir(lista, 15);
  98.     lista = inserir(lista, 30);
  99.     imprimirA(lista);
  100.     lista = remover(lista, 30);
  101.     imprimirA(lista);
  102.     visualizarPonteiros(lista);
  103.     lista = remover(lista, 15);
  104.     imprimirA(lista);
  105.    
  106. }
Advertisement
Add Comment
Please, Sign In to add comment