Академический Документы
Профессиональный Документы
Культура Документы
3 ...
2 empilha(p, 7123);
...
1
0: Topo da pilha
struct pilha {
int elementos[MAX_ELEMENTOS];
int topo;
}
MAX_ELEMENTOS 1
void empilha(struct pilha *p, int A){
p->elementos[p->topo] = A;
p->topo = p->topo + 1;
4
}
3 ...
2 empilha(p, 7123);
...
1
0: 7123
struct pilha {
int elementos[MAX_ELEMENTOS];
int topo;
}
MAX_ELEMENTOS 1
void empilha(struct pilha *p, int A){
p->elementos[p->topo] = A;
p->topo = p->topo + 1;
4
}
3 ...
2 empilha(p, 7123);
...
1: Topo da pilha
0: 7123
struct pilha {
int elementos[MAX_ELEMENTOS];
int topo;
}
MAX_ELEMENTOS 1
int desempilha(struct pilha *p) {
p->topo = p->topo 1;
return p->elementos[p->topo];
4
}
0: 7123
struct pilha {
int elementos[MAX_ELEMENTOS];
int topo;
}
MAX_ELEMENTOS 1
int desempilha(struct pilha *p) {
p->topo = p->topo 1;
return p->elementos[p->topo];
4
}
3 ...
2: 8905 Topo da pilha int t = desempilha(p);
...
1: 1200
0: 7123
struct pilha {
int elementos[MAX_ELEMENTOS];
int topo;
}
MAX_ELEMENTOS 1
int desempilha(struct pilha *p) {
p->topo = p->topo 1;
return p->elementos[p->topo];
4
}
3 ...
2: Topo da pilha int t = desempilha(p);
/* t == 8905 */
1: 1200 ...
0: 7123
struct pilha {
int elementos[MAX_ELEMENTOS];
int topo;
}
MAX_ELEMENTOS 1
int tamanho(struct pilha *p) {
return p->topo;
}
4
2: Topo da pilha
1: 1200
0: 7123
struct pilha {
int elementos[MAX_ELEMENTOS];
int topo;
}
MAX_ELEMENTOS 1
int destroi(struct pilha *p) {
free(pilha);
}
4
2: Topo da pilha
1: 1200
0: 7123
O cdigo apresentado no testa se a pilha
est cheia antes de empilhar um elemento.
Modifique a funo empilha para que ela
imprima um erro se a pilha estiver cheia.
O cdigo apresentado no testa se a pilha
est vazia antes de desempilhar. Modifique a
funo desempilha pra que ela imprima
um erro se a pilha estiver vazia.
struct pilha {
int elementos[MAX_ELEMENTOS];
int topo;
}
MAX_ELEMENTOS 1
void empilha(struct pilha *p, int A){
if(p->topo == MAX_ELEMENTOS-1) {
printf(pilha cheia.);
4
exit(1);
}
3 p->elementos[p->topo] = A;
2 p->topo = p->topo + 1;
}
1
0: Topo da pilha
struct pilha {
int elementos[MAX_ELEMENTOS];
int topo;
}
MAX_ELEMENTOS 1
int desempilha(struct pilha *p) {
if(p->topo == 0) {
printf(pilha vazia.);
4
exit(1);
}
3: Topo da pilha p->topo = p->topo 1;
2: 8905 return p->elementos[p->topo];
}
1: 1200
0: 7123
Enfilera(A)
Operaes:
Criar uma fila
Enfileirar um elemento
Desenfileirar o primeiro elemento
Recuperar o tamanho da fila
Destruir uma fila
Primeiro elemento a entrar
A
o primeiro elemento a sair Comeo da fila
Enfilera(B)
Operaes:
Criar uma fila
Enfileirar um elemento
Desenfileirar o primeiro elemento
Recuperar o tamanho da fila
Destruir uma fila
B
Primeiro elemento a entrar
A
o primeiro elemento a sair Comeo da fila
Enfilera(C)
Operaes:
Criar uma fila
Enfileirar um elemento
Desenfileirar o primeiro elemento
Recuperar o tamanho da fila
C
Destruir uma fila
B
Primeiro elemento a entrar
A
o primeiro elemento a sair Comeo da fila
Desenfilera
Operaes:
Criar uma fila
Enfileirar um elemento
Desenfileirar o primeiro elemento
Recuperar o tamanho da fila
C
Destruir uma fila
B
Primeiro elemento a entrar
Comeo
A da fila
o primeiro elemento a sair Comeo da fila
Enfilera(D)
Operaes:
Criar uma fila
Enfileirar um elemento
Desenfileirar o primeiro elemento
D
Recuperar o tamanho da fila
C
Destruir uma fila
B
Primeiro elemento a entrar
Comeo da fila
o primeiro elemento a sair
Itens so armazenados em posies
contguas de um arranjo
Operao enfilera expande a parte de trs da
fila: marcar o ndice do ltimo elemento
Operao desenfilera retrai a parte da frente
da fila: marcar o ndice do primeiro elemento
struct fila {
int elementos[MAX_ELEMENTOS];
int primeiro;
int ultimo;
}
struct fila {
int elementos[MAX_ELEMENTOS];
int primeiro; int ultimo;
MAX_ELEMENTOS 1 }
1
...
enfilera(f, 322);
0: Primeiro | ltimo ...
struct fila {
int elementos[MAX_ELEMENTOS];
int primeiro; int ultimo;
MAX_ELEMENTOS 1 }
1: ltimo
...
enfilera(f, 322);
0: 322 Primeiro ...
struct fila {
int elementos[MAX_ELEMENTOS];
int primeiro; int ultimo;
MAX_ELEMENTOS 1 }
1: 7890
...
int p = desenfilera(f);
0: 322 Primeiro ...
struct fila {
int elementos[MAX_ELEMENTOS];
int primeiro; int ultimo;
MAX_ELEMENTOS 1 }
1: 7890 Primeiro
...
int p = desenfilera(f);
0 ...
Depois de vrias inseres e
MAX_ELEMENTOS 1
remoes, a fila pode
ultrapassar a memria dos
elementos!
4
3
Soluo: Imaginar o arranjo
2
como um crculo. A posio
1
que vem depois de
(ELEMENTOS_MAX 1)
0
a posio zero
struct fila {
int elementos[MAX_ELEMENTOS];
int primeiro; int ultimo;
MAX_ELEMENTOS 1 }
1: 7890
0: 322 Primeiro
struct fila {
int elementos[MAX_ELEMENTOS];
int primeiro; int ultimo;
MAX_ELEMENTOS 1 }
2: 819
1: 7890
0: 322 Primeiro
O cdigo apresentado no checa se a fila est
cheia antes de enfileirar um elemento.
Modifique a funo enfilera para que ela
imprima um erro se a fila estiver cheia.
O cdigo apresentado no checa se a fila est
vazia antes de desenfileirar um elemento.
Modifique a funo desenfilera para que
ela imprima um erro se a fila estiver vazia.
struct fila {
int elementos[MAX_ELEMENTOS];
int primeiro; int ultimo;
MAX_ELEMENTOS 1 }
int desenfilera(struct fila *f) {
if(f->primeiro == f->ultimo) {
printf(fila vazia.\n);
4 exit(1);
3: ltimo
}
int r = f->elementos[f->primeiro];
2: 819 f->primeiro += 1;
1: 7890 if(f->primeiro == MAX_ELEMENTOS) {
f->primeiro = 0;
0: 322 Primeiro
}
return r;
}
struct fila {
int elementos[MAX_ELEMENTOS];
int primeiro; int ultimo;
MAX_ELEMENTOS 1 }
void enfilera(struct fila *f, int A){
if(f->ultimo + 1 == f->primeiro){
printf(fila cheia.\n);
4 exit(1);
3 }
f->elementos[f->ultimo] = A;
2
f->ultimo += 1;
1 if(f->ultimo == MAX_ELEMENTOS) {
0: Primeiro | ltimo f->ultimo = 0;
}
}
struct fila {
int elementos[MAX_ELEMENTOS];
int primeiro; int ultimo;
MAX_ELEMENTOS 1 }
void enfilera(struct fila *f, int A){
if((f->ultimo + 1 == f->primeiro)
|| (f->ultimo == MAX_ELEM-1
4 && f->primeiro == 0)) {
3 printf(fila cheia.\n);
exit(1);
2
}
1 ...
0: Primeiro | ltimo
Operaes: Insere(A, O)
struct lista {
int elementos[MAX_ELEMENTOS];
int ultimo;
}
struct lista {
int elementos[MAX_ELEMENTOS];
int ultimo;
MAX_ELEMENTOS 1 }
MAX_ELEMENTOS 1
void insere(struct lista *f,
int A, int posicao){
if(f->ultimo == MAX_ELEMENTOS-1){
4 printf(lista cheia); exit(1);
3: 3412 ltimo
}
for(int i = f->ultimo; i > x; i--){
2: 3412 f->elemtos[i] = f->elemtos[i-1];
1: 7182 }
f->ultimo += 1;
0: 1876
f->elementos[x] = A;
}
insere(f, 8818, 2);
MAX_ELEMENTOS 1
void insere(struct lista *f,
int A, int posicao){
if(f->ultimo == MAX_ELEMENTOS-1){
4 ltimo printf(lista cheia); exit(1);
3: 3412
}
for(int i = f->ultimo; i > x; i--){
2: 3412 f->elemtos[i] = f->elemtos[i-1];
1: 7182 }
f->ultimo += 1;
0: 1876
f->elementos[x] = A;
}
insere(f, 8818, 2);
O(n)
MAX_ELEMENTOS 1
void insere(struct lista *f,
int A, int posicao){
if(f->ultimo == MAX_ELEMENTOS-1){
4 ltimo printf(lista cheia); exit(1);
3: 3412
}
for(int i = f->ultimo; i > x; i--){
2: 8818 f->elemtos[i] = f->elemtos[i-1];
1: 7182 }
f->ultimo += 1;
0: 1876
f->elementos[x] = A;
}
Implemente as funes
int remover(struct lista *f,
int elemento, int posicao);
2: 8818
1: 7182
0: 1876
struct lista {
O(1) int elementos[MAX_ELEMENTOS];
int ultimo;
MAX_ELEMENTOS 1 }
void tamanho(struct lista *f) {
return f->ultimo;
}
4 ltimo
3: 3412
2: 8818
1: 7182
0: 1876
struct fila {
int elementos[MAX_ELEMENTOS];
int ultimo;
MAX_ELEMENTOS 1 }
void destroi(struct lista *f) {
free(f);
}
4 ltimo
3: 3412
2: 8818
1: 7182
0: 1876
Criar uma lista O(1)
Inserir/remover no final O(1)
Inserir/remover na posio X O(N)
Recuperar o elemento na posio X O(1)
Recuperar o tamanho da lista O(1)
Destruir a lista O(1)
Suportam as mesmas operaes de criar,
inserir/remover no final, inserir/remover no
meio, recuperar o valor de um elemento, etc
Tamanho 3
Ultimo
Tamanho 43
CABECA
477
Tamanho 43
CABECA
O(1)
Cabeca
477
Ultimo
Tamanho 34
CABECA
Ultimo
Tamanho 4
CABECA
477
Ultimo
Tamanho 3
4
CABECA
477
O(1)
Temos que destruir todos os ns da lista
void destroi(struct lista *f) {
struct no *liberar;
while(f->cabeca->prox) {
liberar = f->cabeca;
f->cabeca = f->cabeca->prox;
free(liberar);
}
free(f->cabeca);
free(f);
}
Criar uma lista O(1)
Inserir/remover no final O(1)
Inserir/remover atrs de antecessor O(1)
Encontrar o anterecessor de X O(N)
Recuperar o elemento na posio X O(N)
Recuperar o tamanho da lista* O(1)
Destruir a lista O(N)
ARRANJOS PONTEIROS
Ultimo Anterior
Tamanho 3 Proximo
CABECA
Novo
125
1328 125 8645
Ultimo Anterior
Tamanho 3 Proximo
CABECA
...
/* armazenando um ponteiro pra double */
struct listadupla *f = cria_lista_dupla();
double *fracao = malloc(sizeof(double));
if(!fracao) { perror(NULL); exit(EXIT_FAILURE); }
insere_inicio(f, fracao);
/* continua processamento */
...
struct no {
struct no *ante;
struct no *prox;
void *dado;
}
void* recupera(struct listaduple *f, int posicao);
...
/* recuperando um elemento */
void *dado = recupera(f, 0);
double *fracao = (double *)dado; /* cuidado! */
/* faz operaes com a variavel fracao e depois: */
free(dado);
/* continua processamento */
...
Implemente pilha e fila com ponteiros.