E cá estamos nós para mais um artigo, este sobre Listas Simplesmente Ligadas, isto quer dizer que apenas é utilizado 1 apontador entre blocos de memória ou seja “entre cada nodo”.
Como se pode observar apenas 1 e 1 só apontador é utilizado para ligar nodos distintos.
Esta é a técnica utilizada em listas simplesmente ligadas, assim que necessário a introdução de mais um valor é criado mais um pedaço de memória (um nodo) e inserido na lista. Vamos então ver a seguir como fazê-lo.
O que é uma lista ligada (linked list)?
Uma lista ligada ou lista encadeada é uma estrutura de dados linear e dinâmica. Ela é composta por blocos que apontam para o próximo elemento da lista. Para “ter” uma lista ligada/encadeada, basta guardar seu primeiro elemento, e seu último elemento aponta para um bloco nulo, exactamente como a representação em cima.
E porquê o uso de listas invés de arrays / vectores?
Visto que um array é representado numa sequência, ou seja ele guarda a informação em blocos de memória sequênciais, poderia surgir o caso em que o número de dados a carregar para memória
fosse suficientemente grande para que coubesse de uma forma sequencial em memória, daí o uso de listas, em que cada pedaço de memória (nodo) é armazenado num “qualquer” lugar em memória e
ligados entre si através de ponteiros/apontadores, algo como observamos na figura em cima.
Fantástico, já sabemos então como funcionam as listas, agora vamos fazer um exercício para ver se ficou bem percebido.
Passos que vamos seguir para a elaboração do pequeno programa:
- Carregar dados de um ficheiro de texto
- Elaborar uma função que leia os dados do ficheiro e posteriormente os carregue para memória, ou seja, para a nossa lista
- Mostrar a lista com os dados carregados
Pois é, são somente estes 3 passos que vamos fazer.
Vamos então começar, o nosso ficheiro vai ter o nome “dados.txt” e vai conter os seguintes dados.
Xavier 18
Ana 22
Pedro 20
Miguel 51
Hugo 37
Mariana 12
Em que do lado esquerdo temos o nome de 6 indivíduos e mais à direita um int que representa a idade do mesmo.
Ok, esta-se mesmo a ver que o ideal é criarmos uma “estrutura”, para que possamos guardar o nome da pessoa, a sua idade e muito importante, um ponteiro para o próximo bloco de memória.
Estou a falar em algo assim:
- //ler do ficheiro os valores e armazena-los em memoria
- PESSOA *Ler(){
- PESSOA *L=NULL,*aux;
- FILE *f;
- char buff[50];
- int idade;
- //abrir o ficheiro de dados
- f=fopen(“dados.txt”,“r”);
- //verificar se o ficheiro existe
- if(f==NULL)
- return(NULL);
- while(fscanf (f, “%st%d”, buff,&idade)!=EOF){
- //se a lista estiver vazia, inserimos na 1 posicao
- if(L==NULL){
- //reservar memoria do tipo de estruct PESSOA
- L=(PESSOA*)malloc (1*sizeof(PESSOA));
- //enviar nome para o nodo criado em memoria
- strcpy(L->nome,buff);
- //enviar idade para nodo criado em memoria
- L->idade=idade;
- //declarar “a seta” do proximo nodo a NULL (vazio)
- L->next=NULL;
- //a partir de agr o aux e’ a nossa lista (L -> cabeca da lista)
- aux=L;
- }
- else {
- aux->next=(PESSOA*)malloc (1*sizeof(PESSOA));
- aux=aux->next;
- strcpy(aux->nome,buff);
- aux->idade=idade;
- aux->next=NULL;
- }
- }
- return(L);
- }
- //funcao para mostrar o que existe na lista
- void Showlist(PESSOA *L){
- if(L==NULL){
- printf(“A Lista esta’ vazia!n“);
- return;
- }
- else {
- //enquanto houver nodos..
- while(L!=NULL){
- printf(“Nome: %s = idade %dn“,L->nome,L->idade);
- L=L->next;
- }
- }
- return;
- }
- /*#########################################
- # LISTAS SIMPLESMENTE LIGADAS #
- # @2012 by PEDRO TAVARES #
- # #
- #########################################*/
- /*bibliotecas*/
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- //definir a estrutura apropriada
- typedef struct Pessoa{
- char nome[50];
- int idade;
- struct Pessoa *next;
- }PESSOA;
- //ler do ficheiro os valores e armazena-los em memoria
- PESSOA *Ler(){
- PESSOA *L=NULL,*aux;
- FILE *f;
- char buff[50];
- int idade;
- //abrir o ficheiro de dados
- f=fopen(“dados.txt”,“r”);
- //verificar se o ficheiro existe
- if(f==NULL)
- return(NULL);
- while(fscanf (f, “%st%d”, buff,&idade)!=EOF){
- //se a lista estiver vazia, inserimos na 1 posicao
- if(L==NULL){
- //reservar memoria do tipo de estruct PESSOA
- L=(PESSOA*)malloc (1*sizeof(PESSOA));
- //enviar nome para o nodo criado em memoria
- strcpy(L->nome,buff);
- //enviar idade para nodo criado em memoria
- L->idade=idade;
- //declarar “a seta” do proximo nodo a NULL (vazio)
- L->next=NULL;
- //a partir de agr o aux e’ a nossa lista (L -> cabeca da lista)
- aux=L;
- }
- else {
- aux->next=(PESSOA*)malloc (1*sizeof(PESSOA));
- aux=aux->next;
- strcpy(aux->nome,buff);
- aux->idade=idade;
- aux->next=NULL;
- }
- }
- return(L);
- }
- //funcao para mostrar o que existe na lista
- void Showlist(PESSOA *L){
- if(L==NULL){
- printf(“A Lista esta’ vazia!n“);
- return;
- }
- else {
- //enquanto houver nodos..
- while(L!=NULL){
- printf(“Nome: %s = idade %dn“,L->nome,L->idade);
- L=L->next;
- }
- }
- return;
- }
- int main(){
- //declaracao da lista
- PESSOA *L=NULL;
- //carregar dados para a lista
- L=Ler();
- //mostrar dados da lista.
- printf(“::::::LISTAGEM::::::n“);
- Showlist(L);
- printf(“::::::FIM LISTAGEM::::::n“);
- return (0);
- }