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.
}