Aplicações em listas dinâmicas

Publicado por José (última atualização em 14/09/2019)

[ Hits: 768 ]

Download listas_dinamicas.c




Código que fiz de algumas funções sobre listas dinâmicas que podem ajudar o iniciante em AEDs. Críticas e correções serão muito bem-vindas. Grato.

  



Esconder código-fonte

 #include <stdio.h>
 #include <stdlib.h>
 #include <locale.h>
 
 typedef struct LISTA_INT
 {
    int elemento;
    struct LISTA_INT *proximo;
 } LISTA_INT;
 
 void ExibirLista(LISTA_INT *lista)
 {
    printf("\n\n\tLista: ");
    while(lista)
    { 
       printf(" %d ", lista->elemento); lista = lista->proximo;
    }
 } 
 
 void InserirEmLista(LISTA_INT **pt_pt_lista, int novo_elemento)
 {  
    while(*pt_pt_lista)
       pt_pt_lista = &(*pt_pt_lista)->proximo; 
       
    if((*pt_pt_lista = malloc(sizeof(LISTA_INT))) == NULL)
       printf("ERRO NA ALOCAÇÃO DE MEMÓRIA. OPERAÇÃO DE INSERÇÃO ABORTADA.");
    
   (*pt_pt_lista)->elemento = novo_elemento; /**/ (*pt_pt_lista)->proximo = NULL;  
 }

 void FecharLista(LISTA_INT **pt_pt_lista)       /*Liga o último elemento da lista ao primeiro*/
 {
    LISTA_INT *inicio = *pt_pt_lista;                                                   

    while(*pt_pt_lista)
       pt_pt_lista = &(*pt_pt_lista)->proximo; 
    
    *pt_pt_lista = inicio; 
 }
 
 void ExcluirElementoDeLista(LISTA_INT **pt_pt_lista, unsigned int posicao)
 {
    unsigned int i = 1;
    LISTA_INT **anterior = NULL;
     
    while(posicao > i++)  
       if(*pt_pt_lista)      /*Necessário condicionar o caso em que *pt_pt_lista = NULL, isto é, quando posicao > elemenetos da lista*/
          pt_pt_lista = &(*pt_pt_lista)->proximo;  
       else
          return;      
    
    anterior = pt_pt_lista; /**/ pt_pt_lista = &(*pt_pt_lista)->proximo; /**/ *anterior = *pt_pt_lista;    
    
   *pt_pt_lista = NULL; free(*pt_pt_lista);   
 }
   
 void EnfileirarReplicasDeLista(LISTA_INT **pt_pt_lista, int quantidade_repeticoes)
 {    
    LISTA_INT *auxiliar = NULL, *inicio = NULL;                                         
    
    while(*pt_pt_lista)                           /*Copiando lista original numa lista temporária*/
    {
       InserirEmLista(&auxiliar, (*pt_pt_lista)->elemento);   
       pt_pt_lista = &(*pt_pt_lista)->proximo; 
    }
    
    FecharLista(&auxiliar);                       /*Fecha-se a cópia da lista para facilitar a replicação*/
    
    inicio = auxiliar;
    while(quantidade_repeticoes--)
       do
       {
          InserirEmLista(pt_pt_lista, auxiliar->elemento); /**/ auxiliar = auxiliar->proximo;
       } while(inicio != auxiliar);
 }
  
 int main(void)
 {
    LISTA_INT *lista = NULL;
   int elemento, n_replicas, posicao;
    
    setlocale(LC_ALL, "Portuguese");
    
    printf("\n\tDigite uma lista de inteiros (digite uma letra para sair): \n\t-> "); /*Construção da lista*/   
    while(1)
    {
       if(scanf(" %d", &elemento) != 1)
          break;
      
       InserirEmLista(&lista, elemento);
      
      printf("\t-> ");
    }
    
    ExibirLista(lista);
    
    printf("\n\n\n\tDigite quantos encadeamentos a realizar: "); fflush(stdin);
    if(scanf(" %d", &n_replicas) != 1)
    {
          free(lista); printf("\n\n\n\tERRO DE LEITURA. PROGRAMA ABORTADO."); getchar(); getchar(); exit(1);
   }
    
    EnfileirarReplicasDeLista(&lista, n_replicas);
    
    ExibirLista(lista);
    
    printf("\n\n\n\tDigite a posição do elemento a ser excluído: "); fflush(stdin);
    if(scanf(" %d", &posicao) != 1)
    {
          free(lista); printf("\n\n\n\tERRO DE LEITURA. PROGRAMA ABORTADO."); getchar(); getchar(); exit(1);
   }
     
    ExcluirElementoDeLista(&lista, posicao);
     
    ExibirLista(lista);
     
    free(lista); printf("\n\n\n\tFIM DO PROGRAMA."); getchar(); getchar(); exit(0);
 }

Scripts recomendados

Tabuada no terminal

Introdução a C

Ordenação de números

Decremento e incremento

EXPRESSÕES ARITMÉTICAS - PARTE 2


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts