Aplicações em listas dinâmicas
Publicado por José (última atualização em 14/09/2019)
[ Hits: 1.756 ]
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.
#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); }
Fibonacci Recursivo e Não Recursivo
Calcular pagamento com a menor quantidade de cédulas possível
Nenhum comentário foi encontrado.
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Flatpak: remover runtimes não usados e pacotes
Mudar o gerenciador de login (GDM para SDDM e vice-versa) - parte 2
Como atualizar o Debian 8 para o 10 (10)
Dica sobre iptables ACCEPT e DROP (6)
NGNIX - Aplicar SNAT para evitar roteamento assimetrico (29)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta