0% acharam este documento útil (0 voto)
5 visualizações5 páginas

Estrutura de Dados: Lista Encadeada em C

O documento apresenta um código em C que implementa uma lista simplesmente encadeada (TLSE) com funções para inserir, remover e imprimir elementos. Inclui operações para inserir no início, no final e de forma ordenada, além de funções para liberar a memória alocada e verificar se a lista está vazia. A função principal demonstra o uso dessas operações com exemplos práticos.

Enviado por

Lucas Sousa
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
5 visualizações5 páginas

Estrutura de Dados: Lista Encadeada em C

O documento apresenta um código em C que implementa uma lista simplesmente encadeada (TLSE) com funções para inserir, remover e imprimir elementos. Inclui operações para inserir no início, no final e de forma ordenada, além de funções para liberar a memória alocada e verificar se a lista está vazia. A função principal demonstra o uso dessas operações com exemplos práticos.

Enviado por

Lucas Sousa
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

CódigoTLSE

c
CopiarEditar
#include <stdio.h> // Inclui a biblioteca padrão para entrada e
saída (printf).
#include <stdlib.h> // Inclui a biblioteca para alocação
dinâmica de memória (malloc e free).

typedef struct lista{ // Define o tipo de estrutura de


dados 'lista' (Lista Simplesmente Encadeada).

int info; // A variável 'info'


armazena o valor do nó da lista. 4 bytes para armazenar um int.
struct lista *prox; // A variável 'prox' é um ponteiro
para o próximo nó da lista. 4 bytes para o ponteiro.
}TLSE; // Define o nome do tipo como TLSE
(Tipo Lista Simplesmente Encadeada).

// Função que insere um novo nó no início da lista.


TLSE* insere_ini(TLSE* l, int valor) {
TLSE* novoNo = (TLSE*) malloc(sizeof(TLSE)); // Aloca
dinamicamente um novo nó.
novoNo->info = valor; // Atribui o
valor ao campo 'info' do novo nó.
novoNo->prox = l; // O novo nó
aponta para a lista atual (início).
return novoNo; // Retorna o novo
nó, que agora é o início da lista.
}

// Função que insere um novo nó no final da lista (versão


iterativa).
TLSE* insere_fim(TLSE* l, int valor) {
if (!l) // Se a lista estiver vazia (l é NULL), chama a função
insere_ini para inserção no início.
return insere_ini(l, valor);

TLSE* p = l; // Cria um ponteiro auxiliar para percorrer a


lista.
while (p->prox) // Vai até o último nó da lista.
p = p->prox;

p->prox = insere_ini(NULL, valor); // Insere o novo nó no final


da lista.
return l; // Retorna a lista (inicialmente não modificada).
}

// Função que insere um novo nó de forma ordenada na lista (versão


iterativa).
TLSE* insere_ord(TLSE* l, int valor) {
TLSE* p = l, *ant; // Cria ponteiros auxiliares para percorrer
a lista.
while ((p) && (p->info < valor)) { // Vai até o nó cuja
informação seja maior ou igual ao valor.
ant = p;
p = p->prox;
}
if (!ant) // Se a lista estiver vazia ou o valor for menor que
o primeiro nó, insere no início.
return insere_ini(l, valor);
else // Caso contrário, insere após o nó anterior.
ant->prox = insere_ini(p, valor);

return l; // Retorna a lista.


}

// Função que retira a primeira ocorrência de um valor da lista


(versão iterativa).
TLSE* retira_1_ocorr(TLSE* l, int x) {
TLSE* p = l, *ant = NULL; // Ponteiros auxiliares.
while ((p) && (p->info != x)) { // Vai até encontrar o valor x
ou até o final da lista.
ant = p;
p = p->prox;
}
if (!p) return l; // Se não encontrou o valor, retorna a lista
original.
if (!ant) l = l->prox; // Se o valor está no primeiro nó,
ajusta o início da lista.
else ant->prox = p->prox; // Se o valor está em outro nó,
ajusta o ponteiro do nó anterior.
free(p); // Libera a memória alocada para o nó removido.
return l; // Retorna a lista após a remoção.
}

// Função para imprimir a lista usando um loop while.


void imprimir_lista_while(TLSE* l) {
TLSE* pAux = l; // Ponteiro auxiliar para percorrer a lista.
while (pAux != NULL) { // Enquanto o ponteiro não for NULL (fim
da lista).
printf("\nValor: %d", pAux->info); // Imprime o valor
armazenado no nó atual.
pAux = pAux->prox; // Avança para o próximo nó.
}
}

// Função para imprimir a lista usando um loop for.


void imprimir_lista_for(TLSE* l) {
TLSE* pAux; // Ponteiro auxiliar para percorrer a lista.
for (pAux = l; pAux != NULL; pAux = pAux->prox) { // Percorre a
lista com um loop for.
printf("\nValor: %d", pAux->info); // Imprime o valor
armazenado no nó atual.
}
}

// Função recursiva para imprimir a lista.


void imprimir_lista_recursivo(TLSE* l) {
if (l->prox != NULL) { // Se houver mais elementos na lista.
imprimir_lista_recursivo(l->prox); // Chama a função
recursivamente para o próximo nó.
}
printf("\nValor: %d", l->info); // Imprime o valor do nó atual.
}

// Função que inicializa a lista (retorna uma lista vazia).


TLSE* inicializa_lista() {
return NULL; // Retorna NULL, representando uma lista vazia.
}

// Função que verifica se a lista está vazia.


int vazia(TLSE* l) {
return (l == NULL); // Retorna 1 se a lista estiver vazia
(NULL), caso contrário retorna 0.
}

// Função iterativa para liberar a memória de todos os nós da lista.


TLSE* liberar_lista_it(TLSE* l) {
TLSE* pAux = l; // Ponteiro auxiliar para percorrer a lista.
while (pAux != NULL) { // Enquanto houver nós na lista.
TLSE* t = pAux; // Armazena o ponteiro para o nó atual.
pAux = pAux->prox; // Avança para o próximo nó.
free(t); // Libera a memória alocada para o nó atual.
}
return NULL; // Retorna NULL, indicando que a lista foi
liberada.
}

// Função recursiva para liberar a memória de todos os nós da lista.


TLSE* liberar_lista_rec(TLSE* l) {
if (l->prox != NULL) { // Se houver mais nós.
liberar_lista_rec(l->prox); // Chama a função
recursivamente para o próximo nó.
}
free(l); // Libera a memória alocada para o nó atual.
return NULL; // Retorna NULL, indicando que a lista foi
liberada.
}

// Função principal que testa todas as operações acima.


int main() {
TLSE* l = inicializa_lista(); // Inicializa uma lista vazia.
printf("\nEh vazia? %d", vazia(l)); // Verifica se a lista está
vazia e imprime o resultado.
l = insere_ini(l, 10); // Insere o valor 10 no início da lista.
l = insere_ini(l, 3); // Insere o valor 3 no início da lista.
printf("\nEh vazia? %d", vazia(l)); // Verifica se a lista está
vazia e imprime o resultado.
l = insere_ini(l, 9); // Insere o valor 9 no início da lista.
imprimir_lista_while(l); // Imprime a lista utilizando a versão
com 'while'.
imprimir_lista_for(l); // Imprime a lista utilizando a versão
com 'for'.
imprimir_lista_recursivo(l); // Imprime a lista utilizando a
versão recursiva.
// l = liberar_lista_it(l); // Descomente se quiser liberar a
lista de forma iterativa.
l = liberar_lista_rec(l); // Libera a lista de forma recursiva.

printf("\nEh vazia? %d", vazia(l)); // Verifica se a lista foi


liberada e imprime o resultado.
return 0; // Retorna 0, indicando que o programa foi executado
com sucesso.
}

Você também pode gostar