Estrutura de Dados - Aula 09 - Listas Simplesmente Encadeadas
Algoritmos e Estruturas de Dados Iprofessor.ufabc.edu.br/~jesus.mena/courses/aed1-1q-2019/...Outros...
Transcript of Algoritmos e Estruturas de Dados Iprofessor.ufabc.edu.br/~jesus.mena/courses/aed1-1q-2019/...Outros...
1
Aula 09 Revisão + Simulado
Algoritmos e Estruturas de Dados I
Prof. Jesús P. [email protected]
1Q-2019
2
Vetores
3
Vetores
4
Vetores
vetor
5
Vetores
vetor
...
...
6
Ponteiros
7
INSTRUÇÕES
Armazena o código compilado (na linguagem máquina)
[~bytes]
PILHA (STACK)
Armazena as variáveis ao longo da execução do programa.
[~Mbytes]
Processo na memória
HEAP
Espaço de memória principal gerenciado pelo SO.
[~Toda a memória RAM]
Alocação estática Alocação dinâmica
int x;double M[10][20];char *c;
double M = malloc(...);
8
INSTRUÇÕES PILHA (STACK)
Processo na memória
HEAP
Ponteiros?
Em Java e Python o uso é transparente. Não precisa se preocupar de alocar e
liberar memória
9
INSTRUÇÕES PILHA (STACK)
Processo na memória
HEAP
Fenômeno: Stack Overflow
10
Endereços
A memória de qualquer computador (arquitetura de Von Neumann) é uma sequência de bytes.
Cada byte armazena um de 256 possíveis valores.
Os bytes são numerados sequencialmente e o número de um byte é o seu endereço
(*) Fonte: http://codingfox.com/3-1-computer-memory-and-data-representation/
11
Endereços
Em c o endereço de um objeto é dado pelo operador &
Se x é uma variável, então &x é o seu endereçoint s = -999int* p = &s
0x89422
0x60001
p
p = 0x89422&p = 0x60001
-9999
0x89422
*p = -9999
s
“p aponta para a s”“p é o endereço de s”“p aponta a s”
*p é o mesmo que escrever “s”
12
Structs
13
Linguagem C: Tipos de dados
Tipos de dados primários.Tipos de dados derivados.Tipos definidos pelo usuário.
(*) Fonte: http://www.studytonight.com/c/datatype-in-c.php
14
Por que precisamos saber de structs?
Em determinadas aplicações é necessário associar diferentes dados a um “objeto”.
Objeto: Ponto em 3D
Ponto 2
Ponto 3
Ponto 4
Ponto 5
Ponto 1
x y z
.
.
.
15
Por que precisamos saber de structs?
Podemos usar 3 vetores para armazenar as posições de cada ponto no espaço 3D
Vx Vy Vz
void plot3D(double Vx[], double Vy[], double Vz[]) { ...}
16
Por que precisamos saber de structs?
Podemos usar 7 vetores para armazenar as posições de cada ponto no espaço 3D e a sua cor RGB
Vx Vy Vz
void plot3D(double Vx[], double Vy[], double Vz[], … ) { ...}
Vr Vg Vb Va
17
Por que precisamos saber de structs?
Por que não simplificar? void plot3D(struct Ponto3D V[], int n) { ...}
As structs fornecem uma forma “simples” para programar
Vx Vy Vz Vr Vg Vb Va
18
Estruturas
Uma estrutura para armazenar um ponto 3D
Uma estrutura para armazenar um ponto 3D e sua cor (RGBA)
19
Maior segmento de reta 2D
Crie um programa, na linguagem C, em que dada uma sequência de n pares de números reais, apresente o comprimento do maior segmento de reta. Deve ser obrigatoriamente utilizada a estrutura: struct Ponto2D { double x; double y; };
Exemplo de entrada:51 12 20 03 34 4Saída:5.66
Obs.: Não use colchetes. Use apenas ponteiros.
Apresente apenas os 2 primeiros digitos após o ponto decimal
20
Exemplo de segmentos de reta
Maior segmento
21
Maior segmento de reta 2D
pow(2,2)sqrt(2)
22
Maior segmento de reta 2D
23
Área do Menor Triângulo
Crie um programa, na linguagem C, em que dada uma sequência de n (n>=3) pares de números reais, apresente a área do menor triângulo composto por 3 pontos. Deve ser obrigatoriamente utilizada a estrutura: struct Ponto2D { double x; double y; };
Exemplo de entrada:315 1520 3028 30
Saída:60.00
Obs.: Não use colchetes. Use apenas ponteiros.
Apresente apenas os 2 primeiros digitos após o ponto decimal
24
Exemplo de triângulos para 4 pontos
25
Área de um triângulo
https://www.mathopenref.com/coordtrianglearea.html
26
Área do Menor triângulo
27
Área do Menor triângulo
28
Listas
29
Definição
Suporemos que os objetos armazenados nos nós são do tipo int.
A estrutura de nós pode ser definida como:
3 7
30
Imprimir uma lista (rec)
31
Busca por um elemento
xBusca → (dado um elemento)
x O(n)
pr
Se o elemento não existir, na lista, a função devolve NULL.
32
Outros tipos de listas encadeadas:
Lista circular
7
p
4
8
13
0
-3
A última célulaaponta para a primeira
33
Outros tipos de listas encadeadas:
Lista duplamente encadeada
7
p
9 -2 75
q
NULL NULL
Cada célula contém o endereçoda célula anterior e o da
seguinte
34
4) Eliminar elemento em uma posição
Dado um ponteiro para o primeiro nó de uma lista ligada, e um número inteiro p. Elimine da lista o nó que está na posição p da lista. A função deve devolver um ponteiro ao primeiro elemento da lista. Assuma que a posição p sempre será uma posição válida.
Uma posição igual a 0 indica o início da lista. Uma posição igual a 1 indica o nó seguinte ao início da lista e assim por diante. O ponteiro dado pode ser nulo, o que significa que a lista inicial está vazia.Obs.: Deve implementar apenas a função eliminarElementoEmUmaPosicao
Entrada Saída Descrição
511223344552
11224455
Na lista ligada de 5 nós, composta pelos elementos: 11→ 22 → 33 → 44 → 55
Deve ser eliminado o elemento da posição 2. Resultando a lista:11→ 22 → 44 → 55
35
4) Eliminar elemento em uma posição
36
5) Inverter uma lista ligada
Dado um ponteiro para o primeiro nó de uma lista ligada, crie uma função que permita inverter a ordem na lista. Isto é, as ligações devem ser invertidas. O último elemento da lista deve apontar a NULL. A função deve devolver um ponteiro ao primeiro elemento da lista.
O ponteiro dado pode ser nulo, o que significa que a lista inicial está vazia.Obs.: Deve implementar apenas a função inverterListaLigada
Entrada Saída Descrição
51122334455
5544332211
A lista ligada de 5 elementos, composta por: 11→ 22 → 33 → 44 → 55 → NULL
Deve ser transformada na lista:55→ 44 → 33 → 22 → 11 → NULL
37
5) Inverter uma lista ligada
38
6) Comparar duas listas ligadas
Dados dois ponteiros para os primeiros nós de duas listas ligadas, crie uma função que permita comparar os dados nos nós das listas para verificar se eles são iguais. As listas são iguais apenas se tiverem o mesmo número de nós e os nós correspondentes tiverem os mesmos dados. O ponteiro dado pode ser nulo, o que significa que a lista está vazia.Obs.: Deve implementar apenas a função compararListasLigadas
Entrada Saída Descrição
21122111
0 Dadas as duas listas: Lista 1: 11→ 22 → NULL Lista 2: 11→ NULL
A resposta deve ser 0 dado que são listas diferentes.
2556625566
1 Dadas as duas listas: Lista 1: 55→ 66 → NULL Lista 2: 55→ 66 → NULL
A resposta deve ser 1 dado que são listas iguais.
39
6) Comparar duas listas ligadas
40
7) Valor em uma determinada posição
Dado um ponteiro para o primeiro nó de uma lista ligada e um inteiro que representa uma posição p, crie uma função que permita obter o valor do nó dada na posição p, contando de trás para frente.Assuma que a posição p sempre será uma posição válida. Uma posição igual a 0 indica o último elemento da lista. Uma posição igual a 1 indica o penúltimo e assim por diante. O ponteiro dado pode ser nulo, o que significa que a lista está vazia.
Obs.: Deve implementar apenas a função valorEmPosicao
Entrada Saída Descrição
511223344551
44 Na lista ligada de 5 elementos, composta por: 11→ 22 → 33 → 44 → 55 → NULL
O elemento na posição 1 (de trás para frente) é44
41
7) Valor em uma determinada posição
42
8) Eliminar elementos duplicados
Dado um ponteiro para o primeiro nó de uma lista ligada com elementos organizados na ordem crescente. Crie uma função que permita eliminar o mínimo dos nós para que a lista não contenha nenhum valor repetido. A função deve devolver um ponteiro ao primeiro elemento da lista.
O ponteiro dado pode ser nulo, o que significa que a lista está vazia.Obs.: Deve implementar apenas a função eliminarElementosDuplicados
Entrada Saída Descrição
711222233444455
1122334455
A lista ligada de 7 elementos, composta por: 11→22→22→33→44→44→ 55 → NULL
Deve ser transformada na lista: 11→22→33→44→ 55 → NULL
43
8) Eliminar elementos duplicados
44
9) Intercalar duas listas ligadas
Dados dois ponteiros para os primeiros nós de duas listas ligadas, crie uma função que permita intercalar os dados nos nós das listas de tal forma a criar uma (nova) terceira lista ligada mas organizada na forma crescente. Os dados em ambas as listas iniciais estão organizados na sua forma crescente. O ponteiro dado pode ser nulo, o que significa que a lista está vazia.Obs.: Deve implementar apenas a função intercalarListasLigadas
Entrada Saída Descrição
21144422335566
112233445566
Dadas as duas listas: Lista 1: 11→44→NULL Lista 2: 22→33→55→66→NULL
O resultado de intercalar as duas listas deve ser:11→22→33→44→55→66→NULL
199199
9999
Dadas as duas listas: Lista 1: 99→NULL Lista 2: 99→NULL
O resultado de intercalar as duas listas deve ser:99→ 99→NULL
45
9) Intercalar duas listas ligadas
46
10) Segundo menor elemento
Dado um ponteiro para o primeiro nó de uma lista ligada. Crie uma função que permita devolver o valor do segundo menor elemento presente na lista ligada. Considere que a lista inicial sempre terá no mínimo 2 elementos.
Obs.: Deve implementar apenas a função segundoMenorElemento
Entrada Saída Descrição
51199443366
33 A lista ligada de 5 elementos, composta por: 11→99→44→33→66→NULL
Tem como segundo menor valor:33
3444444
44 A lista ligada de 3 elementos, composta por: 44→44→44→NULL
Tem como segundo menor valor:44
47
10) Segundo menor elemento
Resumo
Listas
Listas com arranjosListas com arranjos
Listas ligadas/encadeadas/enlaçadasListas ligadas/encadeadas/enlaçadas
- Simples para usar- Alocação em bloco contínuo- Acesso a um item em tempo constante
- Simples para usar- Alocação em bloco contínuo- Acesso a um item em tempo constante
- Não requer conhecer a quantidade de itens previamente
- Inserção e remoção não requer deslocamentos
- Não requer conhecer a quantidade de itens previamente
- Inserção e remoção não requer deslocamentos
- Requer saber a quantidade de itens previamente (para alocação)
- Inserção/Remoção requer deslocamentos- Expansão custosa (realocar e copiar)
- Requer saber a quantidade de itens previamente (para alocação)
- Inserção/Remoção requer deslocamentos- Expansão custosa (realocar e copiar)
- Acesso a uma posição necessita percorrer a lista- Memória extra para os ponteiros
- Acesso a uma posição necessita percorrer a lista- Memória extra para os ponteiros
49
listas e árvores
50
Vetor (array): Elementos contiguos na memória. Todos do mesmo tipo de dado
Listas ligadas: Elementos não necessariamente contiguos na memória.Podem ter ‘atributos’ diferentes.
Árvores:Elementos não necessariamente contiguos na memória.Podem ter ‘atributos’ diferentes.
51
Structs
Para uma lista ligada:
Para uma lista duplamente ligadae também para uma árvore em quecada nó tenha no máximo 2 ligações:
52
Varredura
Como seria a varredura e-r-d?
53
Varredura
Na figura abaixo, os nós estão numeradas na ordem da varredura e-r-d.
5
3 8
1 4
0 2
6 9
7
54
Custos de algoritmos
55
O número de comparações, no algoritmos, depende dos inteiros registrados no vetor.
No melhor caso: o elemento está na primeira posição
No pior caso: o elemento está na última posição ou não está no vetor.
No caso médio?
56
Busca de um elemento
Seja f uma função de complexidade tal que f(n) é o número de elementos consultados.
Melhor caso:
Pior caso:
Caso médio:
Quando o elemento procurado é o primeiro consultado
Quando o elemento procurado é o último consultado ouNão está presente no vetor
57(*) Fonte: http://algs4.cs.princeton.edu/14analysis/
59
Simulado
60
Q1
(a) Devolve a diferença entre o maior e o menor valor presente no vetor V.
(b) Para qualquer caso o número de comparações é proporcional a 2n.
61
Q2
62
Q3
63
Q4