cee.uma.ptcee.uma.pt/edu/eda/eda_200506/Aula06.pdf · Laura Rodríguez Estruturas de dados e...

27
1 Profa. Dra. Laura Rodr Profa. Dra. Laura Rodrí guez guez E-mail: [email protected] Universidade da Madeira Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 2 1. 1. Introdu Introduç ão ão 2. 2. Listas Listas 3. 3. Listas ligadas simples Listas ligadas simples 4. 4. Opera Operaç ões dentro das listas ões dentro das listas 5. 5. Listas Circulares Listas Circulares 6. 6. Listas Duplamente Ligadas Listas Duplamente Ligadas 7. 7. Pilhas Pilhas 8. 8. Filas Filas

Transcript of cee.uma.ptcee.uma.pt/edu/eda/eda_200506/Aula06.pdf · Laura Rodríguez Estruturas de dados e...

1

����������������

��� ��� ������������ ��� �����������������������

Profa. Dra. Laura RodrProfa. Dra. Laura RodrííguezguezE-mail: [email protected] da Madeira

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 2

���� ��� �������������������� ��� ����������������

1.1. IntroduIntrodu çção ão 2.2. ListasListas3.3. Listas ligadas simplesListas ligadas simples

4.4. OperaOpera çções dentro das listasões dentro das listas5.5. Listas CircularesListas Circulares6.6. Listas Duplamente LigadasListas Duplamente Ligadas7.7. PilhasPilhas8.8. FilasFilas

2

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 3

����������� ����������������� ������������������

�Um Tipo Abstrato de Dados (TAD) é um modelo matemático de um conjunto de dados

�Basicamente, a definição de um TAD inclui:� o tipo dos dados� as operações que agem sobre esses

dados* Hermes Senger, Algoritmos e Estruturas de dados 2003

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 4

��������

�A definição de um TAD não inclui :� detalhes sobre o formato de

armazenamento dos dados� detalhes de implementação das

operações

�A definição de um TAD indica o quê faz cada operação, e não como

3

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 5

�������� ���� ��� ������������� ��� ���������

�Estruturas de dados incluem detalhes de implementação

�TADs são materializados através de estruturas de dados

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 6

���������� ������������

� Vantagens:� Acesso muito rápido através do índice de cada elemento.� Permitem implementar facilmente a pesquisa binária.

� Desvantagens:� Tamanho máximo fixo, o que implica que mesmo quando

vazias ocupam um grande espaço na memória. Os elementos da tabela têm de estar contíguos na memória.

� As inserções ou remoções de novos valores no meio de uma tabela ordenada implicam normalmente a movimentação de grande número dos seus elementos.

� Se o tamanho da tabela aumenta frequentemente então énecessário redimensionar a sua capacidade. Isto implica uma nova alocação de memória e uma cópia de dados de um lado para o outro.

4

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 7

���� ��� �������������������� ��� ����������������

1.1. IntroduIntrodu çção ão

2.2. ListasListas3.3. Listas ligadas simplesListas ligadas simples4.4. OperaOpera çções dentro das listasões dentro das listas5.5. Listas CircularesListas Circulares6.6. Listas Duplamente LigadasListas Duplamente Ligadas

7.7. PilhasPilhas8.8. FilasFilas

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 8

������������������

� Uma lista é uma sequência a1, a2,..., an (n ≥0) de elementos, todos de um mesmo tipo

� n é o comprimento da lista� Dado um elemento ai ,

dizemos que ai-1 � seu antecessor (0<i�n)

� Dado um elemento ai , dizemos que ai+1 � seu sucessor (0�i <n)

5

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 9

��� ���� ��������� ������������� �������

� iniciar (): inicia a estrutura de dados� incluirFim (X): acrescenta um objeto X ao fim

da lista� excluirFim (X): retira e retorna o último

elemento da lista� isEmpty(): retorna um valor booleano,

indicando que a lista est� vazia� exibir(): exibe todos os elementos da lista

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 10

���������������������� ����������!��� ����������!���

� Uma forma simples de implementar o TAD Lista éusar um vetor

� Elementos são inseridos da esquerda para direita

� A variável quant controla a quantidade de elementos no vetor (último é quant - 1 )

���� ���� ��������������� ������� ��� ������ ���������� �������

��� ������ ← ����� − � ��� �� ���������� � ��

���� ���� ��������������� ����� � ��� ��� ������ ���������� �������

��� ������������← �

����� ← ����� �

� � �

�����

"

6

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 11

���������������������� ����## ����##

�������������� �����������������

������ ���� �������������� �������������������

����� ���������������

��������� ����!�"�����#$����

�$%��� ������ ��������&'���� ����$��(�� &��������� )'���� �)��$��(�� &���������* )'����� +)�%��&'�

,�

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 12

���� ���������������$�������� ���������������$����

��������� ����$��(�� &��������� )'�

���&#$��� --��'����$�� (./001����� �

����!#$���"�-�)�#$��� 22����$�� 03/+001�

,,

7

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 13

%���!�������������������%���!�������������������

��������� �)��$��(�� &���������* )'�

���&��+����&''���$�� (./001��

���� �)�-�����!#$���"�#$��� 44����$�� 03/+001�

,,

Repare que X deve ser passado por referencia

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 14

����������������

%��� ����� ��+����&'����&#$����5-�'

���$�����$������

���$���������,

8

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 15

��� &��� &''&���&���

1. Implemente as seguintes operações:inserirPosicao (X, p): acrescenta um novo valor X na posi�ão p da lista

Obs.: cuidado para não sobrepor ou perder valores existentes na lista

lerPosicao (X, p): retorna (na vari�vel X) o valor que ocupa a posi�ão p da listaremoverPosicao (X, p): remove e retorna o valor que ocupa a posi�ão p da lista

Obs.: ao final desta opera�ão, quant deve ter sido decrementado, e o valor retirado não deve estar mais poresente na lista

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 16

������������������

�OTAD Lista modela uma seqüência de objetos arbitrários estocados em certas posições

�Permite remover e insertar nós dentro da lista

�Métodos de consulta:� isFirst(p), isLast(p)

9

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 17

������������������

� Métodos de acesso:� first(), last()� before(p), after(p)

� Métodos de atualização:� replaceElement(p, o),� insertBefore(p, o), insertAfter(p, o),� insertFirst(o), insertLast(o)� remove(p)

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 18

��� &��� &''&���&���

2. O que aconteceria se o vetor todo fosse preenchido, e alguém solicitasse uma nova inclusão? Você vê algum modo de resolver isso?

Dica : tente implementar um vetor que “cresce”, dobrando o seu tamanho toda vez que isso acontecer.

10

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 19

���� ��� �������������������� ��� ����������������

1.1. IntroduIntrodu çção ão 2.2. ListasListas

3.3. Listas ligadas simplesListas ligadas simples4.4. OperaOpera çções dentro das listasões dentro das listas5.5. Listas CircularesListas Circulares6.6. Listas Duplamente LigadasListas Duplamente Ligadas

7.7. PilhasPilhas8.8. FilasFilas

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 20

�(�(������������ ��������������

� Foram pensadas para resolver alguns dos problemas resultantes da utilização de tabelas no armazenamento de dados do mesmo tipo.

� As listas ligadas são constituídas por vários «nós»que armazenam os dados pretendidos. Cada nóarmazena o tipo de dados da lista e um ponteiro para o próximo nó.

11

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 21

�(�(������������ ��������������� A lista pode crescer dinamicamente para o tamanho

que se pretender (o limite é apenas determinado pela memória disponível). As inserções e remoções não implicam o deslocamento dos outros elementos.

� Cada elemento da lista (cada nó) referencia o próximo e é alocado dinamicamente apenas quando é necessário, o que implica que é apenas reservado espaço para os dados.

� Para referenciar o primeiro elemento da lista utiliza-se um ponteiro que se designa por cabeça da lista.

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 22

�����������)�����������������)������

� Uma lista ligada simples éuma estrutura de dados composta por nós

� Cada nó contém� um elemento� ponteiro para próximo

����

��� �

� � �

∅∅∅∅

Cabeça da lista

NULL

12

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 23

��&�����&����� **++

�44444 6�����������%7��������$����������������� ���� ��������������

�44444 6������$��89 ������������� 89 ��$%��� ��������� �����89 :���)�

,�

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 24

��$�����$����� ����������������� �����������������

template <class T>class CListaLigadaCListaLigada {

CNoLista<T> *Cabeca; // Ponteiro para o primeiro elementopublic:

CListaLigada(void);~CListaLigada(void);

void InsereItem(const T Item);void ApagaItem(const T Item);bool ProcuraItem(const T Item);void EscreveLista(void);…

};

13

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 25

��$�����$����� ����������������� �����������������

� Construtor:

template <class T> CLista<T>::CLista(){

Cabeca=NULL;}

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 26

��$�����$����� ����������������� �����������������

� Destrutor:template <class T> CLista<T>::~CLista(){

CNoLista<T> *Actual,*Proximo;if(Cabeca!=NULL){

Actual=Cabeca;

while(Actual!=NULL){

Proximo=Actual->Proximo;delete

Actual;

Actual=Proximo;}Cabeca=NULL;

}}

14

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 27

���� ��� �������������������� ��� ����������������

1.1. IntroduIntrodu çção ão 2.2. ListasListas3.3. Listas ligadas simplesListas ligadas simples

4.4. OperaOpera çções dentro das listasões dentro das listas5.5. Listas CircularesListas Circulares6.6. Listas Duplamente LigadasListas Duplamente Ligadas

7.7. Pilhas Pilhas 8.8. FilasFilas

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 28

����� ����� �� �����* �����*++ ��

� Exemplo da inserção:

Os restantes elementos não foram deslocados o que implica que a inserção de um novo elemento numa lista é mais rápido do que a mesma operação numa tabela.

NULL

* Paulo Peixoto, Estruturas de dados e Algoritmos, 2004

15

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 29

������ �������� ���� ��������''&��&��

1. Aloque um novo nó2. Insira o elemento3. Guarde o endereço do

antigo primeiro4. Atualize o ponteiro do

primeiro

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 30

���� �������� ���� ��,������,����1. Criar o novo nó

2. Guardar os dados no novo nó

3. Se a lista estiver vaziaColocar a cabeça da lista a apontar para o novo nó

Caso contrário

Percorrer a lista até atingir o

último nó.

Faça o novo nó apontar paraNULO

Faça o ex-último nó apontar

para o novo

4. Fim

16

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 31

--..������������ �� ���� �� ��������

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 32

���� ���� �� �������!������������� �������!������������������� ������������ ������

17

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 33

--..������������ �� ���� �� ����� ����������� ������

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 34

��&��� � ���&��� � �//��������������������������

Actual=Cabeca;while(Actual->Proximo!=NULL)Actual=Actual->Proximo;

18

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 35

� �!������ �!�����

� Percorrer toda a lista, escrevendo todos os seus elementos (travessia):

while(Actual!=NULL){cout << Actual->Dados << ", ";Actual=Actual->Proximo;}

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 36

--..����������& �!������0��& �!������011

template <class T> void CLista<T>::EscreveLista(void) {CNoLista<T> *Actual=Cabeca;if(Cabeca==NULL)

cout << "Lista Vazia..." << endl;else {

while(Actual!=NULL){cout << Actual->Dados << ", ";Actual=Actual->Proximo;

}cout << "FIM" << endl;

}}

19

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 37

2 �&� � ����������2 �&� � ����������

� Percorrer toda a lista à procura de um determinado elemento:

while(Actual!=NULL){if(Actual->Dados==Item)return(true);

Actual=Actual->Proximo;}

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 38

--..��������2 �&� �����02 �&� �����011

template <class T> bool CLista<T>::ProcuraItem(T Item) {CNoLista<T> *Actual=Cabeca;if(Cabeca==NULL)

return(false);else{

while(Actual!=NULL) {if(Actual->Dados==Item)

return(true);Actual=Actual->Proximo;

}return(false);

}}

20

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 39

%���!���� �� ���� �

1. Guarde o endereço do primeiro em pt_aux

2. Atualize o endereçodo primeiro

3. Remova o primeiro nó

� � �

∅∅∅∅

����$) ��������

� � �

∅∅∅∅

����$) ��������

� �

∅∅∅∅

��������

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 40

%���!����%���!���� ��33����������

� Remover o último elemento de uma lista ligada simples não éuma operação eficiente!!!

� Não existe algoritmo de tempo constante para atualizar ponteiro de fim para apontar para o antecessor

� É preciso usar um loop …

21

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 41

���������������� ������������� �������������

� Dado um determinado elemento pertencente à lista, eliminá-lo desta

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 42

--..�����������������0���������011

22

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 43

��&��� � ����������������� ��&��� � �����������������

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 44

--..�����������������0���������01!�41!�4

23

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 45

���� ��� �������������������� ��� ����������������

1.1. IntroduIntrodu çção ão 2.2. ListasListas3.3. Listas ligadas simplesListas ligadas simples

4.4. OperaOpera çções dentro das listasões dentro das listas

5.5. Listas CircularesListas Circulares6.6. Listas Duplamente LigadasListas Duplamente Ligadas

7.7. PilhasPilhas8.8. FilasFilas

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 46

�������� &��� ���������� &��� ��

24

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 47

�������� &��� ���������� &��� ��

� Método EscreveLista():template <class T> void CLista<T>::EscreveLista(void){

CNoLista<T> *Actual=Cabeca;if(Cabeca==NULL)

cout << "Lista Vazia..." << endl;else{

do{cout << Actual->Dados << ", ";Actual=Actual->Proximo;

} while(Actual!=Cabeca)cout << "FIM" << endl;

}} Actual

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 48

���� ��� �������������������� ��� ����������������

1.1. IntroduIntrodu çção ão 2.2. ListasListas3.3. Listas ligadas simplesListas ligadas simples

4.4. OperaOpera çções dentro das listasões dentro das listas5.5. Listas CircularesListas Circulares

6.6. Listas Duplamente LigadasListas Duplamente Ligadas7.7. PilhasPilhas8.8. FilasFilas

25

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 49

�5������������������������5�����������������������

� Cada nó possui um ponteiro para o seu sucessor e para seu antecessor

�Pode ser percorrida nos dois sentidos

; / 6

∅∅∅∅∅∅∅∅

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 50

���� ���&�����& ��� ���� ���&�����& ���

� Pode ser interessante implementar um nóespecial, com informações como inicio, fim, e quantidade de elementos

� � �

∅∅∅∅∅∅∅∅

26

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 51

����������������������66 ���������������������� � �

������� ���� ��������������

����� 8����$%��� ��������� �����8� :���<�:�$��

,�

����� �����6$� ��������

8������:�����8������:$������������#$������

�$%��� ������ ��������&'����� ����$��=������� &��������� )'����� �)��$��=������� &���������* )'����� �)�%��&'�%��� ��+����&'�

,�

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 52

����������������������������������������������66--..������������ �����0���� �����01717template <class T> void CLista2<T>:: InsereItem(T Item) {

No<T> *Novo=new No<T>;No<T> *Actual;Novo->Dados=Item; Novo->Proximo=NULL; Novo->Anterior=NULL;if(Cabeca==NULL){

Cabeca=Novo;} else {

Actual=Cabeca;while(Actual->Proximo!=NULL)

Actual=Actual->Proximo;Actual->Proximo=Novo;Novo->Anterior=Actual;

}}

27

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 53

����������������������������������������������66--..������������ �����0���� �����01717if(Cabeca==NULL) {

Cabeca=Novo;} else {

Actual=Cabeca;while(Actual->Proximo!=NULL)

Actual=Actual->Proximo;Actual->Proximo=Novo;Novo->Anterior=Actual;

}

Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 54

��� &��� &''&���&���

1. Implemente as funções básicas de manipulação de listas duplamente encadeadas, que constam na declaração da classe ListaDup

2. Proponha e implemente outras operações sobre listas duplamente encadeadas