-
Notifications
You must be signed in to change notification settings - Fork 1
Home
@author João Paulo
, Link para executar o projeto no replit.com.
Este projeto demonstra a criação e utilização de uma lista encadeada para tipos genéricos com a linguagem c, no qual utiliza-se de duas struct
e a mesma lista para armazená-las, o projeto está baseado no padrão de projeto de software MVC(Model-View-Controller). Para a criação da lista sem a necessidade de um tipo específico nos nós, os mesmos armazenam os endereços com uma variável não definida(void
).
A lista encadeada com tipos genéricos deste projeto usa-se de ponteiro *
e utiliza-se de bibliotecas customizadas Exemplo.h
, para uma melhor organização do algoritmo.
Uma lista encadeada é a armazenação de um conjunto de elementos, no qual cada elemento conhece o próximo na lista. Sendo uma ótima maneira para substituir vetores, já que os mesmos tem sua quantidade de elementos limitada pelo valor definido nos mesmos. A implementação de uma lista encadeada em C dá-se pela utilização de uma estrutura que contém o elemento e o endereço do próximo.
Exemplo de struct
para lista encadeada com inteiros:
// Estrutura da lista encadeada.
typedef struct LISTA{
int valor;
struct LISTA * proximo;
}Lista;
O struct LISTA * proximo;
armazena o endereço do próximo nó da lista.
Neste projeto será criado 2 lista encadeada usando a lista genérica que se encontra na pasta lista/lista.h
e lista/lista.c
. As lista serão criadas com dois typedef struct
, denominados como Produto
e Usuario
.
Para armazenar os dados na lista de forma genérica, os dados serão armazenados no endereço do tipo void
, para apontar para qualquer endereço armazenado na memória. Exemplo: void * generico;
.
Para adicionar valores a lista será utilizado uma variável auxiliar do tipo Lista
para armazenar o início da lista atual. Para encadear a lista é necessário salvar o nó atual antes de atualizar o primeiro da lista. Exemplo:
Lista * aux = listaAtual;
listaAtual = novoNó;
listaAtual->proximo = aux;
Com isso no primeiro nó inserido na lista seu próximo apontará para um valor nulo(NULL
). Sendo utilizado para verificar o final da lista nas interações utilizadas na lista como por exemplo deletar a lista ou mostrar os dados armazenados.
Posição ao inserir: | 5 | 4 | 3 | 2 | 1 |
---|---|---|---|---|---|
Dados: | valor5 |
valor4 |
valor3 |
valor2 |
valor1 |
Endereço do próximo: | &valor4 |
&valor3 |
&valor2 |
&valor1 |
NULL |
Posição na lista: | 0 | 1 | 2 | 3 | 4 |
Para percorrer a lista utiliza-se de um loop e uma variável auxiliar para armazenar os nós atuais.
// Exemplo de função que percorre a lista.
int percorrendoLista(Lista * lista, int i){
aux = lista;
int posicao = 0;
while(aux != NULL){
if(posicao == i){
return lista->valor;
}
aux = aux->proximo;
}
printf("Posição inválida.");
return NULL;
}
No menu inicial o usuário pode decidir selecionar produtos, usuários ou sair.
Nesses menus o usuário pode decidir por inserir, mostrar todos os dados, pesquisar ou voltar ao menu inicial.
Nessas telas o usuário insere os dados de cada tipo.
Após inserir o usuário pode continuar inserindo ou voltar ao menu inicial.
Mostra todos os dados contidos na lista.
Nessas telas o usuário pode informar um nome para efetuar a pesquisa.
A tela de resultados mostra as informações encontradas e oferece opção para deletar o dado da lista.
Salva os dados da memória ram em arquivo, sobrescrevendo o arquivo anterior
A utilização de lista encadeada, ao contrário de vetores, oferece a opção de armazenar os dados de forma dinâmica. Ao contrário de um vetor uma quantidade de dados pré-definida antes de inserir os dados limitando a quantidade ao valor dado para a variável. Exemplo: int vetor[10]
, sendo possível armazenar apenas 10 valores, não podendo ser modificado após definir a quantidade de dados do vetor.
@author João Paulo
, Link to run the project on replit.com.
This project demonstrates the creation and use of a linked list for generic types with the c language, in which it uses two struct
and the same list to store them. For the creation of the list without the need for a specific type in the nodes, they store the addresses with an undefined variable (void
).
The linked list with generic types uses pointer *
and using custom libraries Example.h
, for a better organization of the algorithm.
A linked list is the storage of a set of elements, where each element knows the next one in the list. Being a great way to replace vectors, since they have their number of elements limited by the value defined in them. The implementation of a linked list in C is done by using a structure that contains the element and the address of the next one.
Example of struct
for linked list with integers:
// Linked list structure.
typedef struct LIST{
int value;
struct LIST * next;
}List;
The LIST *next;
struct stores the address of the next node in the list.
In this project, 2 linked lists will be created using the generic list found in the folders lista/lista.h
andlista/lista.c
. The lists will be created with two typedef struct
, named as Produto
e Usuario
.
To store the data in the list generically, the data will be stored at address of type void
, to point to any address stored in memory. Example: void * generic;
.
To add values to the list, an auxiliary variable of type List
will be used to store the beginning of the current list. To chain the list it is necessary to save the current node before updating the first one in the list. Example:
List * aux = CurrentList;
currentList = newNode;
CurrentList->next = aux;
With that in the first node inserted in the list its next one will point to a null value(NULL
). Being used to check the end of the list in interactions used in the list, such as deleting the list or showing the stored data.
Position when inserting: | 5 | 4 | 3 | 2 | 1 |
---|---|---|---|---|---|
Data: | value5 |
value4 |
value3 |
value2 |
value1 |
Next Address: | &value4 |
&value3 |
&value2 |
&value1 |
NULL |
List position: | 0 | 1 | 2 | 3 | 4 |
To traverse the list, we use a loop and an auxiliary variable to store the current nodes.
// Example of function that traverses the list.
int traversingList(List * list, int i){
aux = list;
int position = 0;
while(aux != NULL){
if(position == i){
return list->value;
}
aux = aux->next;
}
printf("Invalid position.");
return NULL;
}
From the home menu the user can decide to select products, users or exit.
In these menus the user can decide to enter, show all data, search or return to the main menu.
In these screens, the user enters the data of each type.
After entering the user can continue entering or return to the main menu.
Shows all data contained in the list.
On these screens, the user can enter a name to perform the search.
The results screen shows the information found and offers an option to delete the data from the list.
Using a linked list, as opposed to arrays, gives you the option of storing data dynamically. Unlike a vector a pre-defined amount of data before entering the data limiting the amount to the given value for the variable. Example: int vector[10]
, being possible to store only 10 values, not being able to be modified after defining the amount of vector data.