Aplicações em listas dinâmicas
Publicado por José (última atualização em 14/09/2019)
[ Hits: 2.218 ]
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);
}
Salario bruto e liquido de um funcionario
Nenhum comentário foi encontrado.
SynapSeq - programa para estimular as ondas cerebrais
Por que seu __DIR__ falhou ou o "inferno" dos caminhos no PHP
Preparando-se para certificações da LPI através do LPI Lab
Migração de Arch Linux para repositórios CachyOS (Uso de Instruções v3 e v4)
Zoxide e fzf no bash para incrementar o uso do Terminal
As diferencas entre o clipboard comum e a selecao ativa
Arch Linux com repos do CachyOS para otimização ou usar Gentoo?
Abrir um arquivo URL pelo Clipper (4)
Eu aprendi o segredo das artes! hahaha (0)
Instalação Dual Boot Linux+Windows 11 [RESOLVIDO] (5)









