Lista Cadastral

Fazer download em pdf ou txt
Fazer download em pdf ou txt
Você está na página 1de 9

UNIDADE FEDERAL DE SÃO CARLOS

Centro de Ciências Exatas e Tecnologia

Departamento de Computação

Algoritmos e Estruturas de Dados 1

F5 – Lista Cadastral com alocação encadeada e dinâmica

Professor: Roberto Ferrari Junior

Autor

Pietro Minghini Moralles

792238

Ciência da Computação

São Carlos, 14 de fevereiro de 2022


1. Introdução

Atividade realizada para implementação de uma Lista Cadastral, de modo a testas os


conhecimentos adquiridos sobre o assunto. Diferentemente da pilha e fila, as listas
cadastrais removem e inserem elementos específicos de sua estrutura, ou seja, é
necessário identificar o elemento a ser removido e o elemento a ser inserido. Há vários
tipos de implementação de lista, sendo elas uma lista comum sem tratamento na ordem
dos elementos, listas ordenadas, listas circulares e entre outras. Optei por realizar a
implementação de uma lista comum.

A seguir, se encontra uma figura que exemplifica a estrutura de dados.

2. Descrição da execução das atividades

As declarações do TAD Fila Cadastral podem ser encontradas no trecho de código


abaixo, seguida da implementação de suas funções.

/*
NOME: PIETRO MINGHINI MORALLES
RA: 792238
DISCIPLINA: Algoritmos e Estruturas de Dados 1
EXERCICIO: F5 – LISTA CADASTRAL COM ALOCAÇÃO ENCADEADA E
DINÂMICA.
DESCRIÇÃO: DECLARAÇÃO DO TAD LISTA COM ALOCAÇÃO ENCADEADA E
DINÂMICA.
*/
#ifndef LISTA_CADASTRAL_ORDENADA_LISTA_CADASTRAL_TAD_H
#define LISTA_CADASTRAL_ORDENADA_LISTA_CADASTRAL_TAD_H
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>

struct Node{
int info;
struct Node *next;
};

typedef struct Node *NodePtr;


typedef struct {
NodePtr inicio;
NodePtr fim;
} Lista;

void cria(Lista *lista);

bool vazia(Lista *lista);

bool cheia(Lista *lista);

bool estaNaLista(Lista *lista, int *x);

void insere(Lista *lista, int x, bool *ok);

void retira(Lista *lista, int *x, bool *ok);

#endif //LISTA_CADASTRAL_ORDENADA_LISTA_CADASTRAL_TAD_H

/*
NOME: PIETRO MINGHINI MORALLES
RA: 792238
DISCIPLINA: Algoritmos e Estruturas de Dados 1
EXERCICIO: F5 – LISTA CADASTRAL COM ALOCAÇÃO ENCADEADA E
DINÂMICA.
DESCRIÇÃO: IMPLEMENTAÇÃO DAS FUNÇÕES TAD LISTA COM ALOCAÇÃO
ENCADEADA E DINÂMICA
*/
#include "Lista_Cadastral_TAD.h"

void cria(Lista *lista){


lista->inicio = NULL;
lista->fim = NULL;
};

bool vazia(Lista *lista){


if(lista->inicio == NULL){
return true;
}
else{
return false;
}
};

bool cheia(Lista *lista){


return false;
};

//Procura se determinado elemento X esta na Lista


bool estaNaLista(Lista *lista, int *x){
NodePtr Laux;
Laux = (NodePtr) malloc(sizeof(NodePtr));

if(vazia(lista)){
return false;
}
else{
Laux = lista->inicio;

while(Laux != NULL){
if(Laux->info == *x){
return true;
}
else{
Laux = Laux->next;
}
}
return false;
}
};

//Insere um elemento X se este elemento não estivar na lista.


void insere(Lista *lista, int x, bool *ok){
NodePtr Laux;
Laux = (NodePtr) malloc(sizeof(NodePtr));
Laux->info = x;
if(cheia(lista)){
printf("A lista esta cheia!\n");
}
//Se o elemento ja estiver na lista, nao vou inserir
else if(estaNaLista(lista, &x)){
*ok = false;
}
//A lista esta vazia e o elemento vai ser inserido no inicio
else if(vazia(lista)) {
lista->inicio = Laux;
lista->fim = Laux;
lista->fim->next = NULL;
*ok = true;
}
//A lista ja contem pelo menos um elemento e o novo elemento é
inserido no fim
else {
lista->fim->next = Laux;
lista->fim = Laux;
lista->fim->next = NULL;
*ok = true;
}
};

//Remove um elemento da lista se este elemento estiver na mesma.


void retira(Lista *lista, int *x, bool *ok){
NodePtr Laux, anterior;
Laux = (NodePtr) malloc(sizeof(NodePtr));
anterior = (NodePtr) malloc(sizeof(NodePtr));
if(vazia(lista)){
*ok = false;
}
else if(estaNaLista(lista, x)){
Laux = lista->inicio;
anterior = NULL;
while(Laux != NULL){
if(Laux->info == *x){
//Elemento removido no inicio
if(Laux == lista->inicio){
lista->inicio = Laux->next;
free(Laux);
Laux = lista->inicio;
*ok = true;
}
//Elemento removido no fim
else if(Laux == lista->fim){
anterior->next = NULL;
lista->fim = anterior;
free(Laux);
Laux = NULL;
*ok = true;
}
//Elemento removido no meio
else{
anterior->next = Laux->next;
free(Laux);
Laux = anterior->next;
*ok = true;
}
}
else{
anterior = Laux;
Laux = Laux->next;
}
}
}
else{
*ok = false;
}
};
A seguir, se encontra a implementação em um arquivo main, com duas funções
adicionadas: imprimeLista e MaiorElem.

/*
NOME: PIETRO MINGHINI MORALLES
RA: 792238
DISCIPLINA: Algoritmos e Estruturas de Dados 1
EXERCICIO: F5 – LISTA CADASTRAL COM ALOCAÇÃO ENCADEADA E
DINÂMICA.
DESCRIÇÃO: ATIVIDADE PARA IMPLEMENTAR E TESTAR O TAD LISTA COM
ALOCAÇÃO ENCADEADA E DINAMICA
*/
#include "Lista_Cadastral_TAD.h"
void imprimeLista(Lista *lista);
void MaiorElem(Lista *lista, bool *deuCerto, int *x);
int main() {
int op = 10, valor;
bool resultado;
Lista lista1;
cria(&lista1);
while(op != 0){
printf("--- MENU ---: (1) Verifica vazia -- (2) Verifica
cheia -- (3) Insere elemento -- (4) Remove elemento -- (5)
Imprime\n -- (6) Maior elemento --\n");
scanf("%d", &op);
if(op == 1){
if(vazia(&lista1)){
printf("Lista vazia.\n");
}
else{
printf("Lista n vazia.\n");
}
}
else if(op == 2){
if(cheia(&lista1)){
printf("Lista cheia.\n");
}
else{
printf("Lista n cheia\n");
}
}
else if(op == 3){
printf("Digite o elemento a ser inserido na lista: ");
scanf("%d", &valor);
insere(&lista1, valor, &resultado);
if(resultado){
printf("Elemento %d inserido na lista.\n", valor);
}
else{
printf("Elemento %d n inserido na lista.\n",
valor);
}
}
else if(op == 4){
printf("Digite o elemento a ser removido da lista: ");
scanf("%d", &valor);
retira(&lista1, &valor, &resultado);
if(resultado){
printf("Elemento %d removido da lista.\n", valor);
}
else{
printf("Elemento %d nao encontrado ou lista
vazia.\n", valor);
}
}
else if(op == 5){
imprimeLista(&lista1);
}
else if(op == 6){
MaiorElem(&lista1, &resultado, &valor);
if(resultado){
printf("O maior elemento da lista eh %d.\n",
valor);
}
else{
printf("Lista vazia.\n");
}
}
}
return 0;
}
void imprimeLista(Lista *lista){
NodePtr Laux;
Laux = (NodePtr) malloc(sizeof(NodePtr));
Laux = lista->inicio;
if(vazia(lista)){
printf("Lista vazia.\n");
}
else{
while(Laux != NULL){
printf("%d ", Laux->info);
Laux = Laux->next;
}
printf("\n");
}
}
void MaiorElem(Lista *lista, bool *deuCerto, int *x){
int maior = -50000;
NodePtr Laux;
Laux = (NodePtr) malloc(sizeof(NodePtr));
Laux = lista->inicio;
if(vazia(lista)){
*deuCerto = false;
}
else{
while(Laux != NULL){
if(Laux->info >= maior){
maior = Laux->info;
}
Laux = Laux->next;
}
*x = maior;
*deuCerto = true;
}
}

Agora, seguem prints que comprovam a compilação e funcionamento do código.

Você também pode gostar