View
217
Download
0
Category
Preview:
Citation preview
1
����������������
��� ��� ������������ ��� �����������������������
Profa. Dra. Laura RodrProfa. Dra. Laura RodrííguezguezE-mail: lmrodrig@uma.ptUniversidade 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
nó
����
��� �
� � �
∅∅∅∅
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
Recommended