Escolar Documentos
Profissional Documentos
Cultura Documentos
Dados
ICEx/UFF
Volta Redonda-RJ
© 2002-2020
Estrutura de Dados
Sumário
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 2
Estrutura de Dados
p info prox
Onde:
Considere:
struct lista{
int info;
struct lista *prox;
};
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 4
Estrutura de Dados
3) Imprimir a lista:
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 6
Estrutura de Dados
z->prox=y;
return x;
}
Exercícios:
1) Escreva uma função para criar uma cópia de uma LSE. Retorne ponteiro
para o início da cópia da lista.
3) Escreva um programa que crie uma LSE com n (lido via teclado) nós de
inteiros. Imprima a lista. Conte os nós da lista e imprima na tela. Crie uma
cópia da lista e imprima a cópia. Remova o k-ésimo (lido via teclado) nó da
lista. Imprima a lista resultante.
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 7
Estrutura de Dados
if(!p) {
q->prox=NULL;
return q;
}
else{
r=p;
while(p && valor > p->info) {
t=p;
p=p->prox;
}
if(!p)
{
t->prox=q;
q -> prox=NULL;
return r;
}
if(valor<p->info)
{
q->prox=p;
if(p!=r) {
t->prox=q;
return r;
}
return q;
}
}
}
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 8
Estrutura de Dados
if(!p)
return NULL;
else {
if(buscaOrd(p,valor)==NULL)
{
printf("\nElemento não existente.");
return p;
}
else {
q=p;
while(q→info < valor)
{
t=q;
q=q->prox;
}
if(p!=q)
t->prox=q->prox;
else
p=p->prox;
free(q);
return p;
}
}
}
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 9
Estrutura de Dados
Exercícios:
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 10
Estrutura de Dados
Não existe mais um primeiro e ultimo nós. Em virtude desse fato, foi
adotada uma convenção que considera como último nó aquele apontado pelo
ponteiro externo.
Considere:
struct lista {
int info;
};
Ex:
info prox
p
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 11
Estrutura de Dados
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 12
Estrutura de Dados
int cont=1;
if(!p)
return 0;
q=p;
while(p->prox!=q){
cont++;
p=p->prox;
return cont;
q->info=valor;
if(!p) {
q->prox=q;
return q;
q->prox=p->prox;
p->prox=q;
return p;
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 13
Estrutura de Dados
if(!p)
return NULL;
if(p == p->prox) {
free(p);
return NULL;
q=p->prox;
p->prox=q->prox;
free(q);
return p;
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 14
Estrutura de Dados
else{
cont=1;
q=p->prox;
while(k!=cont) {
t=q;
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 15
Estrutura de Dados
q=q->prox;
cont++;
}
t->prox=q->prox;
if(p==q){
free(q);
return t;
}
free(q);
return p;
}
}
{
struct lista *q, *r;
int cont=1, valor;
printf("\nDigite o valor a ser inserido: ");
scanf("%d", &valor);
r=(struct lista*) malloc(sizeof(struct lista));
r -> info=valor;
q=p->prox;
while(cont!=k) {
cont++;
q=q->prox;
}
r->prox=q->prox;
q -> prox=r;
if(q==p)
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 16
Estrutura de Dados
return r;
else
return p;
}
Exercícios:
1) Escreva um programa que crie uma LSEC com n (lidos via teclado) nós.
Em seguida, crie um menu com as seguintes opções:
1 – Imprimir a lista
5 – Sair
3) Escrava uma função para concatenar duas LSEC. Retornar ponteiro para
a lista resultante.
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 17
Estrutura de Dados
Nas LDEs pode-se ir para frente ou para trás com igual facilidade.
eprox info
dprox
Considere:
struct dupla{
int info;
};
int valor, i;
ult=NULL;
if(ult)
else
ini = p;
ult = p;
return ini;
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 19
Estrutura de Dados
if(!p){
q→dprox=NULL;
return q;
else{
q -> dprox = p;
p -> eprox = q;
return q;
if(!p){
return q;
else{
t=p;
t= t -> dprox;
t -> dprox = q;
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 21
Estrutura de Dados
q -> eprox = t;
return p;
int cont;
if(k == 1)
if(!p →dprox){
free(p);
return NULL;
else{
q=p;
p=p→dprox;
p → eprox = NULL;
free(q);
return p;
else{
cont=1;
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 22
Estrutura de Dados
q=p;
while(cont != k)
{ q = q -> dprox;
cont++;
r -> dprox = t;
if(t != NULL)
t -> eprox = r;
free(q);
return(p);
p -> eprox = x;
x -> dprox = p;
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 23
Estrutura de Dados
if(y == x)
y = NULL;
else{
y = y -> dprox;
else{
else{
free(x);
return y;
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 24
Estrutura de Dados
Exercícios:
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 25
Estrutura de Dados
Recursividade
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 26
Estrutura de Dados
Ex. 1: Fatorial
Iterativo:
Recursivo:
int fatorial(int n)
{
if(n==0) //condição de parada da função
return 1;
return(n*fatorial(n-1)); //chamada recursiva
}
Chamada: z=fatorial(4);
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 27
Estrutura de Dados
int fibo(int n)
{
int x, y, z, i;
i=1;
x=0;
y=1;
while(i<n) {
z=x+y;
x=y;
y=z;
i++;
}
return x;
}
Recursivo:
F1=0
F2=1
Fn=Fn-1+Fn-2, n>2
int fibo(int n)
{
if(n==1)
return 0;
if(n==2)
return 1;
if(n>2)
return(fibo(n-1) + fibo(n-2));
}
Chamada: y=fibo(6);
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 28
Estrutura de Dados
4) Verifique o término
É importante verificar que a recursividade terminará.
Comece com uma situação geral e verifique se em um número
finito de passos, a condição de parada será satisfeita e a
recursividade irá terminar.
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 29
Estrutura de Dados
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 30
Estrutura de Dados
int somatorio(int n)
{
if(n==0)
return 0;
return(n + somatorio(n-1));
}
Exercícios:
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 31
Estrutura de Dados
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 32
Estrutura de Dados
Divisão e Conquista
P1 P2 Pn
...
...
...
..
P11 P12 P1n P21
P22 P2n Pn1 Pn2 Pnn
.
Ideia:
menor (L)
Se L tem um só elemento
o menor é ele.
Caso contrário:
Divide L em L1 e L2
N1=menor(L1);
N2=menor(L2);
decidir entre N1 e N2
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 33
Estrutura de Dados
Em C:
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 34
Estrutura de Dados
Em C:
z= estaOrdenada(v, 0, 5)
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 35
Estrutura de Dados
Exercício:
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 36
Estrutura de Dados
Considere:
i => haste inicial → no. 1 ou A
a => haste auxiliar → no. 2 ou B
f => haste final → no. 3 ou C
Ideia:
move(n, i, a, f)
se n=1
mova disco do topo da haste i para a haste f
caso contrário
aplique move(n-1, i, f, a)
mova disco do topo da haste i para a haste f
aplique move(n-1,a, i, f)
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 37
Estrutura de Dados
Em C:
else{
move(n-1, i, f, a);
printf(“Mova disco da haste %d para a haste %d \n”, i, f);
move(n-1, a, i, f);
}
}
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 38
Estrutura de Dados
a) move(3, 1, 2, 3)
move(2, 1, 3, 2) move(2, 1, 3, 2)
1→ 3 (IV) move(1, 1, 2, 3) move(1, 1, 2, 3)
move(2, 2, 1, 3) 1→ 2 (II) 1 → 3 (I)
move(1, 3, 1, 2) move(1, 3, 1, 2)
3→ 2 (III)
move(2, 2, 1, 3)
move(1, 2, 3, 1) move(1, 2, 3, 1)
2→ 3 (VI) 2 → 1 (V)
move(1, 1, 2, 3) move(1, 1, 2, 3)
1 → 3 (VII)
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 39
Estrutura de Dados
Desenvolvendo a equação:
T(n) = 2.(2.T(n-2) + 1) + 1=
T(n) = 4.T(n-2) + 3 (2)
T(n) = 22.T(n - 2) + 22- 1
T(n-2) = 2.T(n-3) + 1
T(n) = 4.(2.T(n-3) + 1) + 3
T(n) = 8.T(n-3) + 7 (3)
T(n) = 23.T(n - 3) + 23- 1
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 40
Estrutura de Dados
T(n-3) = 2.T(n - 4) + 1
T(n) = 8.(2.T(n - 4) + 1) + 7
T(n) = 16.T(n - 4) + 15 (4)
T(n) = 24.T(n - 4) + 24 - 1
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 41
Estrutura de Dados
Ordenação Avançada
1) Mergesort
É uma ordenação por intercalação. O mergesort é uma ordenação que
é diferente dos outros métodos. Ele combina dois vetores ordenados em um
só.
Ideia:
mergesort(L)
Se L é vazia ou unitária
a resposta é L
Caso contrario
Divida L em L1 e L2
L1= mergesort(L1)
L2 = mergesort(L2)
a resposta é o merge(junção) de L1 < L2
Ex:
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 42
Estrutura de Dados
Em C:
int meio;
if(ini == fim)
return;
else{
Exercício:
T(1) = 1
T(n) = 2.T(n/2) + n
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 43
Estrutura de Dados
T(n) = 2k.T(n/2k) + kn
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 44
Estrutura de Dados
2) Quicksort
Ideia:
- Escolhe-se qualquer elemento para ser o pivô;
- Reorganiza-se a lista tal que os elementos fiquem da seguinte forma:
pivô
elementos elementos
menores que maiores que
o pivô o pivô
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 45
Estrutura de Dados
Quicksort(L)
Se L é vazia o unitária
a resposta é L
Caso contrário
L1 = Quicksort(L1)
L2 = Quicksort(L2)
Ex:
Quicksort(L)
3 2 5 1 7 6
(1 2 3 e 5 e 7 6)
1 2 3 5 6 7
Pivô = 5
L1 = 3 2 1 L2 = 7 6
L1 = 1 2 3 L2 = 6 7
L= 3 2 1 (1 e 2 e 3) L = 7 6 ( 6 e 7)
pivô = 2 pivô = 6
L1 = 1 L2=3 L1 = L2 = 7
L1 =1 L2=3 L1= L2=7
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 46
Estrutura de Dados
Em C:
int i, j, x;
i=esq;
j=dir;
x=v[(esq+dir)/2];
do{
while(v[i] < x && i<dir)
i++;
while(x<v[j] && j> esq)
j--;
if(i<=j)
{
troca(&v[i], &v[j]); //mesma função usada na ordenação simples
i++;
j--;
}
}while(i<=j);
if(esq<j)
quicksort(v,esq, j);
if(i<dir)
quicksort(v,i, dir);
}
Exercício:
quicksort(v, 0, 5)
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 47
Estrutura de Dados
T(0) = T(1) = 1
T(n) = T(i) + T(n - i -1) + c.n
Suponha que o pivô está dividindo duas partes, sendo uma delas a
sequência Si. Então, vamos entender cada termo da equação:
T(i) → é o tempo para ordenar Si, ou seja, os elementos menores que o pivô.
Conclusão:
Logo,
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 48
Estrutura de Dados
… …
T(n) = T(1) + c.2 + c.3 + c.4 + … + c.(n -3) + c.(n -2) + c.(n – 1) + c.n
Sn= (2 + n) . (n-1)
2
S n= n 2 + n - 2
2
Assim,
T(n) = T(1) + c. n2 + n - 2
2
T(n) ≈ 1 + c. (n2 + n – 2)
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 49
Estrutura de Dados
Exercícios:
a) QuickSort
b) MergeSort
b) T(n) = 2T(n/2) + n
T(1) = 1
c) T(n) = T(n-1) + 1
T(0) = 1
b) int fatorial(int n)
{
if(n==0)
return 0;
return(n*fatorial(n-1));
}
© 2002– 2020 Prof. Dra. Vera Lúcia Prudência dos Santos Caminha – VFI/ICEx/UFF – Volta Redonda-RJ 50