You are on page 1of 52

Alocao Dinmica de

Estruturas de Dados
Estrutura de Dados I

Universidade Federal de Santa Catarina


Campus Ararangu
Jailson Torquato

1
Introduo
Alm de vetores e matrizes, estruturas no-homogneas tambm
podem ser alocadas dinamicamente;

Tais estruturas so a base para diversos tipos de aplicaes, tais


como:
Sistemas acadmicos
Sistemas empresariais
Sistemas de controle
Sistemas bancrios
Simulaes
Jogos

2
Introduo

Essas aplicaes fazem uso de vrias tarefas que, em vrios casos,


consomem muito tempo. Entre essas tarefas destacam-se:
Ordenao, classificao e pesquisa de informaes
Correlao entre informaes
Insero, atualizao e remoo de informaes
Compactao e descompactao
Clculos matemtico-cientficos

Nesse sentido, o uso eficiente de recursos computacionais


depende de uma boa estruturao das informaes, assim como,
de bons algoritmos para manipular tais informaes.

3
Introduo
Existem vrios modelos que podem ser utilizados para visualizar,
interpretar e armazenar informaes;

Os trs principais modelos para a representao de informaes e


como estas informaes se relacionam so as listas lineares, as
rvores e os grafos;

4
Lista Linear
Constitui-se em um modelo em que os elementos formam uma
sequncia linear. Cada elemento tem um antecessor e um sucessor.

E1 E2 E3 En-1 En

5
rvore
rvore um modelo em que os elementos formam uma estrutura
hierrquica. Cada elemento, com exceo do elemento raiz, ter
apenas um pai, mas poder ter zero ou mais filhos.

E1

E1,1 E1,2 E1,3

E1,1,1 E1,1,2 E1,3,1 E1,3,2 E1,3,3

E1,1,2,1 E1,3,1,1 E1,3,1,2 6


Grafo
Grafo um modelo em que os elementos se conectam de forma
geral, ou seja, sem hierarquia e sem necessariamente formar uma
sequncia.

E8
E7
E1

E3 E9
E5

E4 E6 E2

7
Listas
Iniciando no estudo de Estruturas de Dados abordaremos a
estrutura mais simples, chamada lista linear.

Uma lista linear agrupa um conjunto de elemento, que se


relacionam de alguma forma.
Existem vrias formas de representar listas num computador e
estas formas esto ligadas a forma como a memria do
computador utilizada.
Neste primeiro passo, estudaremos listas chamadas estticas ou
sequenciais.

8
Listas Lineares Gerais
Listas lineares permitem inseres e remoes dos elementos em
qualquer posio;

As estruturas de dados para essa classe dividem-se em dois


grupos: as estruturas contguas, em que os elementos so
armazenados em um vetor, e as estruturas encadeadas em que os
elementos so armazenados em encadeamentos de variveis do
tipo estrutura;

9
Listas

O que uma lista esttica/sequencial/contgua ?

uma lista de elementos que esto sequencialmente na memria,


como um vetor.

10
Estrutura contgua
Nesse tipo de estrutura uma lista entendida como uma entidade
com dois campos: elementos, representado por um vetor onde so
armazenados os contedos da lista, e ultimo, que usado para
armazenar o ndice do ltimo elemento da lista.

Por conveno, o primeiro elemento fica guardado na primeira


posio do vetor elementos. Desse modo, caso o valor do campo
ultimo seja zero a lista est vazia, do contrrio, ultimo indicar o
nmero de elementos.

12
Estrutura contgua

ltimo
0 xxxxxxxx
n
1 1 elemento
2 2 elemento

Elementos

n n elemento

30

13
Estrutura contgua
Nessa estrutura, a operao de insero em uma posio i do
campo elementos envolve um acrscimo unitrio no campo
ultimo, um deslocamento para baixo a partir da posio i e a
cpia/incluso do contedo desejado nessa posio;

A operao de remoo de uma determinada posio i segue o


caminho contrrio, ou seja, deve-se realizar um decremento
unitrio no campo ultimo e um deslocamento no sentido inverso,
de tal maneira que o elemento da posio i+1 passe para a posio
i, apagando o contedo que estava nessa posio;

14
Estrutura contgua
Consideraes:

Os processos de insero e remoo podem ser demorados


caso a lista precise armazenar uma grande quantidade de
informaes. Nesse sentido, a estrutura contgua pode se
mostrar inadequada;

De modo geral a lista fica limitada ao tamanho do vetor;

Isso pode ser flexibilizado utilizando alocao/realocao


dinmica do vetor de elementos.

15
Exemplo 1

16
Unidade 4
Alocao Dinmica de
Estruturas de Dados
parte 1.2
Programao II

Universidade Federal de Santa Catarina


Campus Ararangu
Jailson Torquato

17
Criando uma Lista (Pilha)
Funo InicializePilha ()
Construa uma funo que inicialize uma pilha implementada
como lista encadeada com cabea, ou seja, que crie a cabea. O
prottipo da funo deve ser
Celula* inicializarPilha();

Funo empilhar ()
Implemente uma funo que empilhe uma letra na pilha. Escreva
um programa que utilize a funo para empilhar cinco letras
inseridas pelo usurio. No fim, imprima a letra no topo da fila.
Para a funo, utilize o prottipo
void empilhar(Celula* pilha, char letra);

Escreva um programa que crie uma pilha usando a funo


implementada.
18
19
20
Criando uma Lista Encadeada
Funo imprimir ()
Implemente uma funo que imprima todas as letras da pilha.
Reescreva o programa acima, porm, em vez de imprimir o
elemento no topo da pilha, imprima todos eles utilizando a
funo. O prottipo deve ser desempilhar
void imprimir(Celula* pilha);

Funo desempilhar ()
Implemente uma funo que desempilhe uma letra da pilha.
Reescreva o programa acima, contudo desempilhando uma letra e
imprimindo a pilha mais uma vez. Prottipo:
char desempilhar(Celula* pilha);

Escreva um programa que crie uma pilha usando a funo


implementada.
21
22
23
Criando uma Lista Encadeada
Funo buscar ()
Implemente uma funo que busque a primeira ocorrncia de
uma letra na pilha. A funo dever retornar a quantas clulas a
partir da cabea a letra est. Retorne 0 se no houver ocorrncias.
Escreva um programa que pea cinco letras, empilhe-as e pea ao
usurio por qual letra procurar; imprima a posio. Prottipo da
funo:
int buscar(Celula* pilha, char letra);

Escreva um programa que crie uma pilha usando a funo


implementada.

24
25
26
27
Criando uma Lista Encadeada
Funo escolha()
Implemente uma funo que permita escolher as operaes
realizada at agora

Tarefa para casa!!!

28
Unidade 4
Alocao Dinmica de
Estruturas de Dados
parte 1.3
Programao II

Universidade Federal de Santa Catarina


Campus Ararangu
Jailson Torquato

29
Criando uma Lista (Fila)
Funo InicializeFila()
Construa uma funo que inicialize uma fila implementada como
lista encadeada com cabea, ou seja, que crie a cabea. O
prottipo da funo deve ser
Celula* inicializarFila();

Funo empilhar ()
Implemente uma funo que empilhe uma letra na fila . Escreva
um programa que utilize a funo para empilhar cinco letras
inseridas pelo usurio. No fim, imprima a letra no topo da fila.
Para a funo, utilize o prottipo
void empilhar(Celula* fila, char letra);

Escreva um programa que crie uma pilha usando a funo


implementada.
30
31
32
void imprimir(Celula* fila)
{
// Comear o for na celula seguinte cabeca;
// enquanto a celula no for nulo,
// imprimir a letra daquela celula e avanar na fila.
for(fila = fila->proxima; fila != NULL; fila = fila->proxima)
printf("%5c", fila->letra);
}

33
Criando uma Lista Encadeada
Funo imprimir ()
Implemente uma funo que insira uma letra na fila. Escreva um
programa que utilize a funo para inserir cinco letras inseridas
pelo usurio. No fim, imprima a letra no incio da fila. Para a
funo, utilize o prottipo
void imprimir(Celula* fila);

Funo remover()
Implemente uma funo que remova uma letra da fila. Reescreva
o programa acima, contudo removendo uma letra e imprimindo a
fila mais uma vez. Prottipo:

char remover(Celula* pilha);

Escreva um programa que crie uma pilha usando a funo


implementada.
34
35
36
Criando uma Lista Encadeada
Funo buscar ()
Implemente uma funo que busque a primeira ocorrncia de
uma letra na fila. A funo dever retornar a quantas clulas a
partir da cabea a letra est. Retorne 0 se no houver ocorrncias.
Escreva um programa que pea cinco letras, insira-as na fila e
pea ao usurio por qual letra procurar; imprima a posio.
Prottipo da funo:
int buscar(Celula* fila, char letra);

Escreva um programa que crie uma pilha usando a funo


implementada.

37
38
39
Material Extra

40
Estrutura encadeada
Antes de discutir a alocao de estruturas encadeadas faz-se
necessrio a apresentao das formas em que isso possvel.
Considere a estrutura abaixo:

typedef struct {
int a;
float b;
} ab;
typedef ab *qq;

Para se alocar espao para essa estrutura o comando abaixo seria


necessrio:

qq var_ab;
var_ab = (qq) malloc(sizeof(ab)); a b

var_ab
A interpretao grfica ser: 41
Estrutura encadeada
As seguintes atribuies podem ser feitas aos campos da estrutura:

(*var_ab).a = 10;
(*var_ab).b = 15.2;

printf("\nValor de a: %d",(*var_ab).a);
printf("\nValor de b: %.2f", (*var_ab).b);

Obs: Os parnteses so necessrios porque o operador . tem


precedncia sobre o operador unrio *;

42
Estrutura encadeada

A Linguagem C estabelece outra forma de se referenciar os


campos de uma estrutura apontada por um ponteiro:

var_ab->a = 11;
var_ab->b = 16.2;

printf("\nValor de a: %d", var_ab->a);


printf("\nValor de b: %.2f\n", var_ab->b);

43
Estrutura encadeada
Considere agora uma estrutura em que um dos campos um
ponteiro para a prpria estrutura;

Esse tipo de estrutura chamada de estruturas auto-


referenciveis:

typedef struct ab ab;


struct ab {
int a;
ab *prox;
};
typedef ab *qq;

44
Estrutura encadeada

qq p;

p = (qq) malloc(sizeof(ab));
p->a=1;
a prox

p 1

p->prox = (qq) malloc(sizeof(ab));


p->prox->a=2;
a prox a prox

p 1 2

45
Estrutura encadeada
Definio: Estrutura que armazena os elementos atravs de
encadeamentos de ponteiros;

Cada elemento geralmente chamado de n;

Na forma mais simples, cada n (elemento) guarda um elemento


da lista e um ponteiro para o n (elemento) sucessor.

Por conveno e visando facilitar as operaes com listas


estruturadas o primeiro n do encadeamento no guarda nenhum
elemento e chamado de n-lder;
.

46
Estrutura encadeada

typedef struct noh noh;


typedef noh *lista;
typedef noh *posicao;
struct noh {
int elemento;
noh *proximo;
};

######### 1 Elemento 2 Elemento n Elemento

n-lder
47
Estrutura encadeada
Em listas lineares usa-se em geral variveis do tipo posicao para
indicar a posio de um determinado elemento (n);

Alm disso, deve-se utilizar um ponteiro que marque a posio


inicial da lista, permitindo que a mesma seja percorrida;

Desse modo atualizaes, inseres e eliminaes na lista so


possveis;

48
Estrutura encadeada (Exemplo)
#include <stdio.h>
lista criaLista(int n) {
typedef struct noh noh;
posicao p;
typedef noh *lista;
lista L;
typedef noh *posicao; int i;
struct noh {
int elemento; p=(lista) malloc(sizeof(noh));
noh *proximo; L=p;
}; for (i = 1; i <= n; i++) {
p->elemento = 0;
void preencheLista(lista L) {
p->proximo = (lista) malloc(sizeof(noh));
posicao p; p = p->proximo;
int ctr=1; }
for (p=L; p->proximo != NULL; p = p->proximo) p->elemento=0;
{ p->proximo=NULL;
printf("Informe o %d nmero: ",ctr++); return L;
scanf("%d", &p->proximo->elemento); }
}
} 49
Estrutura encadeada (Exemplo)
void imprimeLista(lista L) {
main() {
posicao p; int n=4;
printf("\n"); lista L = criaLista(n);
imprimeLista(L);
int ctr=1;
preencheLista(L);
p=L; imprimeLista(L);
printf("\n\nEndereco de L: %d - endereco do no-lider: %d ", &L, L); }
printf("\nno-lider (endereco: %d - valor: %d - proximo: %d",&p-
>elemento,
p->elemento,p->proximo);
for (; p->proximo != NULL; p = p->proximo) {
printf("\n%d elemento (endereco: %d - valor: %d - proximo: %d",
ctr++,&p->proximo->elemento, p->proximo->elemento,p->proximo-
>proximo);
}
printf("\n\n");
}

50
Estrutura encadeada
Na insero necessrio encontrar a posio desejada, criar um
novo n, encade-lo na lista e atribuir o elemento a ser
armazenado;

Na remoo, encontrada a posio do n que ser removido, deve-


se modificar o ponteiro (campo proximo) do elemento anterior
para que esse aponte para prximo elemento, ou seja, o elemento
para o qual o n que est sendo eliminado aponta. Depois basta
eliminar o n desejado.

51
Estrutura encadeada (Lista Encadeada Circular)

typedef struct noh noh;


typedef noh *lista;
typedef noh *posicao;
struct noh {
int elemento;
noh *proximo;
};

######### 1 Elemento 2 Elemento n Elemento

n-lder
52
Estrutura encadeada (Lista Duplamento Encadeada)

typedef struct noh noh;


typedef noh *lista;
typedef noh *posicao;
struct noh {
int elemento;
noh *anterior;
noh *proximo;
};

1 Elemento 1 Elemento 2 Elemento 2 Elemento

n-lder
53