Aplicações em listas dinâmicas
Publicado por José (última atualização em 14/09/2019)
[ Hits: 2.133 ]
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);
}
Máximo Divisor Comum (algoritmo de Euclides)
Nenhum comentário foi encontrado.
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Jogar games da Battle.net no Linux com Faugus Launcher
Como fazer a Instalação de aplicativos para acesso remoto ao Linux
Como fazer a instalação do Samba
Como fazer a conversão binária e aplicar as restrições no Linux
Duas Pasta Pessoal Aparecendo no Ubuntu 24.04.3 LTS (19)
Formas seguras de instalar Debian Sid (13)
Malware encontrado em extensões do Firefox. (0)
Fiz uma pergunta no fórum mas não consigo localizar [RESOLVIDO] (21)









