Curso de C - olimpiada.ic.unicamp.br · 25/05/2011 14:39 4 Curso C -IC/UNICAMP Conceitos: memória...
Transcript of Curso de C - olimpiada.ic.unicamp.br · 25/05/2011 14:39 4 Curso C -IC/UNICAMP Conceitos: memória...
-
25/05/2011 14:39 1
Curso de C
Memria Dinmica
-
25/05/2011 14:39 @Arnaldo V. Moura, Daniel F. Ferber 2
Curso C - IC/UNICAMP
Memria Dinmica
Memria dinmica
Vetores dinmicos
Listas ligadas
Roteiro:
>
-
25/05/2011 14:39 3
Curso C - IC/UNICAMP
Conceitos: memria dinmica e esttica
Memria esttica:
Variveis declaradas no cdigo
Tamanho fixo
Nmero limitado de variveis
Memria esttica:
Variveis declaradas no cdigo
Tamanho fixo
Nmero limitado de variveis
Programa
Memria esttica:int a;int b;
>
-
25/05/2011 14:39 4
Curso C - IC/UNICAMP
Conceitos: memria dinmica e esttica
Memria esttica:
Variveis declaradas no cdigo
Tamanho fixo
Nmero limitado de variveis
Memria esttica:
Variveis declaradas no cdigo
Tamanho fixo
Nmero limitado de variveis
Programa
Memria esttica:int a;int b;int *p;
Memria dinmica: Memria dinmica:
Espaos adicionais de memria
Memria alocada/liberada quando
necessrio
Memria dinmica:
Espaos adicionais de memria
Memria alocada/liberada quando
necessrio
>
-
25/05/2011 14:39 5
Curso C - IC/UNICAMP
Memria dinmica:
Conceitos
Solicitar memria dinmica Solicitar memria dinmica
Passo a passo no programa:
Programa
Memria esttica:int a;int b;int *p;
>
???
-
25/05/2011 14:39 6
Curso C - IC/UNICAMP
Memria dinmica:
Conceitos
Solicitar memria dinmica
Guardar apontador para
espao obtido
Solicitar memria dinmica
Guardar apontador para
espao obtido
Passo a passo no programa:
Programa
Memria esttica:int a;int b;int *p;
>
???
-
25/05/2011 14:39 7
Curso C - IC/UNICAMP
Memria dinmica:
Conceitos
Solicitar memria dinmica
Guardar apontador para
espao obtido
Armazenar dados
Qualquer contedo
Solicitar memria dinmica
Guardar apontador para
espao obtido
Armazenar dados
Qualquer contedo
Passo a passo no programa:
Programa
Memria esttica:int a;int b;int *p;
>
xyz
-
25/05/2011 14:39 8
Curso C - IC/UNICAMP
Memria dinmica:
Conceitos
Solicitar memria dinmica
Guardar apontador para
espao obtido
Armazenar dados
Qualquer contedo
Liberar memria obtida
Solicitar memria dinmica
Guardar apontador para
espao obtido
Armazenar dados
Qualquer contedo
Liberar memria obtida
Passo a passo no programa:
Programa
Memria esttica:int a;int b;int *p;
>
xyz
-
25/05/2011 14:39 9
Curso C - IC/UNICAMP
Conceitos: obter memria
Chamar funo malloc
Parmetro: tamanho desejado, em bytes
Resultado: apontador para espao na memria
Chamar funo malloc
Parmetro: tamanho desejado, em bytes
Resultado: apontador para espao na memria
Programa
Memria esttica:int a;int b;int *p;
Memria dinmica:
>
-
25/05/2011 14:39 10
Curso C - IC/UNICAMP
Conceitos: obter memria
Chamar funo malloc
Parmetro: tamanho desejado, em bytes
Resultado: apontador para espao na memria
Chamar funo malloc
Parmetro: tamanho desejado, em bytes
Resultado: apontador para espao na memria
Programa
Memria esttica:int a;int b;int *p;
Memria dinmica:int *p;p = (int*)malloc(4);
int *p;p = (int*)malloc(4);
>
??
-
25/05/2011 14:39 11
Curso C - IC/UNICAMP
Conceitos: obter memria
Chamar funo malloc
Parmetro: tamanho desejado, em bytes
Resultado: apontador para espao na memria
Chamar funo malloc
Parmetro: tamanho desejado, em bytes
Resultado: apontador para espao na memria
Programa
Memria esttica:int a;int b;int *p;
Memria dinmica:int *p;p = (int*)malloc(4);*p = 5;printf("%d", *p);
int *p;p = (int*)malloc(4);*p = 5;printf("%d", *p);
>
5
-
25/05/2011 14:39 12
Curso C - IC/UNICAMP
Conceitos: liberar memria
Chamar funo free:
Parmetro: endereo j alocado
Resultado: libera a rea alocada
Chamar funo free:
Parmetro: endereo j alocado
Resultado: libera a rea alocada
Programa
Memria esttica:int a;int b;int *p;
Memria dinmica:
int *p;p = (int*)malloc(4);*p = 5;
int *p;p = (int*)malloc(4);*p = 5;
>
5
TesteMalloc
-
25/05/2011 14:39 13
Curso C - IC/UNICAMP
Conceitos: liberar memria
Chamar funo free:
Parmetro: endereo j alocado
Resultado: libera a rea alocada
Chamar funo free:
Parmetro: endereo j alocado
Resultado: libera a rea alocada
Programa
Memria esttica:int a;int b;int *p;
Memria dinmica:
int *p;p = (int*)malloc(4);*p = 5;free(p);
int *p;p = (int*)malloc(4);*p = 5;free(p);
>
5
TesteMalloc
-
25/05/2011 14:39 14
Memria Dinmica
Vetor dinmico
-
25/05/2011 14:39 15
Curso C - IC/UNICAMP
Vetor dinmico
sizeof(variavel) Retorna quantidade de memria ocupada pela varivel
sizeof(tipo) Retorna quantidade de memria ocupada por uma varivel com este tipo
sizeof(variavel) Retorna quantidade de memria ocupada pela varivel
sizeof(tipo) Retorna quantidade de memria ocupada por uma varivel com este tipo
Funo sizeof:
>
-
25/05/2011 14:39 16
Curso C - IC/UNICAMP
Sada:Sada:
Vetor dinmico
sizeof(variavel) Retorna quantidade de memria ocupada pela varivel
sizeof(tipo) Retorna quantidade de memria ocupada por uma varivel com este tipo
sizeof(variavel) Retorna quantidade de memria ocupada pela varivel
sizeof(tipo) Retorna quantidade de memria ocupada por uma varivel com este tipo
Funo sizeof:
int a;printf(%d, sizeof(int));printf(%d, sizeof(a));
int a;printf(%d, sizeof(int));printf(%d, sizeof(a));
>
-
25/05/2011 14:39 17
Curso C - IC/UNICAMP
Sada:44
Sada:44
Vetor dinmico
sizeof(variavel) Retorna quantidade de memria ocupada pela varivel
sizeof(tipo) Retorna quantidade de memria ocupada por uma varivel com este tipo
sizeof(variavel) Retorna quantidade de memria ocupada pela varivel
sizeof(tipo) Retorna quantidade de memria ocupada por uma varivel com este tipo
Funo sizeof:
int a;printf(%d, sizeof(int));printf(%d, sizeof(a));
int a;printf(%d, sizeof(int));printf(%d, sizeof(a));
>
-
25/05/2011 14:39 18
Curso C - IC/UNICAMP
Vetor dinmico
Calcular tamanho do vetor com sizeof Calcular tamanho do vetor com sizeof
Passo a passo:
>
-
25/05/2011 14:39 19
Curso C - IC/UNICAMP
Vetor dinmico
Calcular tamanho do vetor com sizeof
Reservar memria com malloc
Calcular tamanho do vetor com sizeof
Reservar memria com malloc
Passo a passo:
>
-
25/05/2011 14:39 20
Curso C - IC/UNICAMP
Vetor dinmico
Calcular tamanho do vetor com sizeof
Reservar memria com malloc
Acessar elementos com [ ] ou ponteiros
Calcular tamanho do vetor com sizeof
Reservar memria com malloc
Acessar elementos com [ ] ou ponteiros
Passo a passo:
>
-
25/05/2011 14:39 21
Curso C - IC/UNICAMP
Vetor dinmico
Calcular tamanho do vetor com sizeof
Reservar memria com malloc
Acessar elementos com [ ] ou ponteiros
Liberar memria do vetor com free
Calcular tamanho do vetor com sizeof
Reservar memria com malloc
Acessar elementos com [ ] ou ponteiros
Liberar memria do vetor com free
Passo a passo:
>
-
25/05/2011 14:39 22
Curso C - IC/UNICAMP
Vetor dinmico
Exemplo:
int *v;int tamanho;
scanf(%d, &tamanho);v = (int*)malloc(sizeof(int)*tamanho);
v[1] = v[2] + v[3];
*(v+1) = *(v+2) + *(v+3);
free(v);
Vetor01
>
-
25/05/2011 14:39 23
Curso C - IC/UNICAMP
Conceito: alterar tamanho de memria
Chamar funo realloc:
Parmetros: apontador para espao antigo, tamanho desejado
Resultado: apontador para novo espao
Chamar funo realloc:
Parmetros: apontador para espao antigo, tamanho desejado
Resultado: apontador para novo espao
Programa
Memria esttica:int a;int b;int *p;
Memria dinmica:
>
-
25/05/2011 14:39 24
Curso C - IC/UNICAMP
Conceito: alterar tamanho de memria
Chamar funo realloc:
Parmetros: apontador para espao antigo, tamanho desejado
Resultado: apontador para novo espao
Chamar funo realloc:
Parmetros: apontador para espao antigo, tamanho desejado
Resultado: apontador para novo espao
Programa
Memria esttica:int a;int b;int *p;
Memria dinmica:int *p;p = (int*)malloc(4);...
int *p;p = (int*)malloc(4);...
>
-
25/05/2011 14:39 25
Curso C - IC/UNICAMP
Conceito: alterar tamanho de memria
Chamar funo realloc:
Parmetros: apontador para espao antigo, tamanho desejado
Resultado: apontador para novo espao
Chamar funo realloc:
Parmetros: apontador para espao antigo, tamanho desejado
Resultado: apontador para novo espao
Programa
Memria esttica:int a;int b;int *p;
Memria dinmica:int *p;p = (int*)malloc(4);...p = (int*)realloc(p, 8);
int *p;p = (int*)malloc(4);...p = (int*)realloc(p, 8);
>
-
25/05/2011 14:39 26
Curso C - IC/UNICAMP
Vetor dinmico
Exemplo:
int *v;int tamanho, n_tamanho;
scanf(%d, &tamanho);v=(int*)malloc(sizeof(int)*tamanho);
scanf("%d", &n_tamanho);v=(int*)realloc(v,sizeof(int)*n_tamanho);
free(v);Vetor02
>
-
25/05/2011 14:39 27
Curso C - IC/UNICAMP
Estrutura dinmica
Calcular tamanho da estrutura comsizeof
Calcular tamanho da estrutura comsizeof
>
-
25/05/2011 14:39 28
Curso C - IC/UNICAMP
Estrutura dinmica
Calcular tamanho da estrutura comsizeof
Reservar memria com malloc
Calcular tamanho da estrutura comsizeof
Reservar memria com malloc
>
-
25/05/2011 14:39 29
Curso C - IC/UNICAMP
Estrutura dinmica
Calcular tamanho da estrutura comsizeof
Reservar memria com malloc
Acessar membros da estrutura com ->
Calcular tamanho da estrutura comsizeof
Reservar memria com malloc
Acessar membros da estrutura com ->
>
-
25/05/2011 14:39 30
Curso C - IC/UNICAMP
Estrutura dinmica
Calcular tamanho da estrutura comsizeof
Reservar memria com malloc
Acessar membros da estrutura com ->
Liberar memria da estrutura com free
Calcular tamanho da estrutura comsizeof
Reservar memria com malloc
Acessar membros da estrutura com ->
Liberar memria da estrutura com free
>
-
25/05/2011 14:39 31
Curso C - IC/UNICAMP
Estrutura dinmica
struct complexo {float real;float imaginario;
}
struct complexo *numero;
numero = (struct complexo *)malloc(sizeof(struct complexo));
numero->real = 10.0;numero->imaginario = 5.0;
free(numero);
>
NumComlexo
-
25/05/2011 14:39 32
Apontadores
Listas Ligadas
-
25/05/2011 14:39 33
Curso C - IC/UNICAMP
Vetor:
Um nico grande bloco de memria
Elementos consecutivos adjacentes
Vetor:
Um nico grande bloco de memria
Elementos consecutivos adjacentes
Listas Ligadas
Idia principal :
>
-
25/05/2011 14:39 34
Curso C - IC/UNICAMP
Vetor: Um nico grande bloco de memria
Elementos consecutivos adjacentes
Lista ligada: Cada elemento em posio de memria separada
Posies desordenadas e no consecutivas
Vetor: Um nico grande bloco de memria
Elementos consecutivos adjacentes
Lista ligada: Cada elemento em posio de memria separada
Posies desordenadas e no consecutivas
Listas Ligadas
Idia principal :
dados dados dados
>
-
25/05/2011 14:39 35
Curso C - IC/UNICAMP
Vetor:
Um nico grande bloco de memria
Elementos consecutivos adjacentes
Lista ligada:
Cada elemento em posio de memria separada
Posies desordenadas e no consecutivas
Apontadores para indicar seqncia correta
Vetor:
Um nico grande bloco de memria
Elementos consecutivos adjacentes
Lista ligada:
Cada elemento em posio de memria separada
Posies desordenadas e no consecutivas
Apontadores para indicar seqncia correta
Listas Ligadas
Idia principal :
inicio_lista dados dados NULLdados
>
-
25/05/2011 14:39 36
Curso C - IC/UNICAMP
struct elemento {
int valor;
struct elemento *prox;
}
struct elemento {
int valor;
struct elemento *prox;
}
Listas Ligadas: declarao
Nome da estrutura
>
-
25/05/2011 14:39 37
Curso C - IC/UNICAMP
struct elemento {
int valor;
struct elemento *prox;
}
struct elemento {
int valor;
struct elemento *prox;
}
Listas Ligadas: declarao
Nome da estrutura
Apontador para prximo
elemento na seqncia
>
-
25/05/2011 14:39 38
Curso C - IC/UNICAMP
struct elemento {
int valor;
struct elemento *prox;
}
struct elemento {
int valor;
struct elemento *prox;
}
Listas Ligadas: declarao
Nome da estrutura
Apontador para prximo
elemento na seqncia
inicio_lista
>
dados
valor prox
dados
valor prox
NULLdados
valor prox
-
25/05/2011 14:39 39
Curso C - IC/UNICAMP
Listas Ligadas: percorrer
inicio_lista dados dados NULLdados
>
-
25/05/2011 14:39 40
Curso C - IC/UNICAMP
Listas Ligadas: percorrer
struct elemento *atual;atual = inicio_lista;
while (atual != null) {
}
printf( ...,atual->valor);
atual = atual->proximo;
inicio_lista dados dados NULLdados
>
-
25/05/2011 14:39 41
Curso C - IC/UNICAMP
Listas Ligadas: inserir em lista vazia
inicio_lista NULL
>
NULL
-
25/05/2011 14:39 42
Curso C - IC/UNICAMP
novo=(. . . *)malloc(sizeof(. . .));novo=(. . . *)malloc(sizeof(. . .));
Listas Ligadas: inserir em lista vazia
novo
inicio_lista NULL
>
-
25/05/2011 14:39 43
Curso C - IC/UNICAMP
novo=(. . . *)malloc(sizeof(. . .));novo->valor = . . . ;novo->proximo = NULL;
novo=(. . . *)malloc(sizeof(. . .));novo->valor = . . . ;novo->proximo = NULL;
Listas Ligadas: inserir em lista vazia
novo
inicio_lista NULL
>
dados NULL
NULL
-
25/05/2011 14:39 44
Curso C - IC/UNICAMP
novo=(. . . *)malloc(sizeof(. . .));novo->valor = . . . ;novo->proximo = NULL;inicio_lista = novo;
novo=(. . . *)malloc(sizeof(. . .));novo->valor = . . . ;novo->proximo = NULL;inicio_lista = novo;
Listas Ligadas: inserir em lista vazia
novo
inicio_lista NULL
>
dados NULL
-
25/05/2011 14:39 45
Curso C - IC/UNICAMP
novo=(. . . *)malloc(sizeof(. . .));novo=(. . . *)malloc(sizeof(. . .));
Listas Ligadas: inserir no incio, no vazia
novo
inicio_listainicio_lista dados dados NULLdados
>
-
25/05/2011 14:39 46
Curso C - IC/UNICAMP
novo=(. . . *)malloc(sizeof(. . .));novo->valor = . . . ;
novo=(. . . *)malloc(sizeof(. . .));novo->valor = . . . ;
Listas Ligadas: inserir no incio, no vazia
novo
inicio_listainicio_lista dados dados NULLdados
>
dados
-
25/05/2011 14:39 47
Curso C - IC/UNICAMP
novo=(. . . *)malloc(sizeof(. . .));novo->valor = . . . ;novo->proximo = inicio_lista;
novo=(. . . *)malloc(sizeof(. . .));novo->valor = . . . ;novo->proximo = inicio_lista;
Listas Ligadas: inserir no incio, no vazia
novo
inicio_listainicio_lista dados dados NULLdados
>
dados
-
25/05/2011 14:39 48
Curso C - IC/UNICAMP
novo=(. . . *)malloc(sizeof(. . .));novo->valor = . . . ;novo->proximo = inicio_lista;inicio_lista = novo;
novo=(. . . *)malloc(sizeof(. . .));novo->valor = . . . ;novo->proximo = inicio_lista;inicio_lista = novo;
Listas Ligadas: inserir no incio, no vazia
novo
inicio_listainicio_lista dados dados NULLdados
>
dados
-
25/05/2011 14:39 49
Curso C - IC/UNICAMP
Listas Ligadas: inserir no fim
inicio_lista dados dados NULLdados
struct elemento *ultimo;ultimo = inicio_lista;
>
ultimo
NULL
-
25/05/2011 14:39 50
Curso C - IC/UNICAMP
Listas Ligadas: inserir no fim
inicio_lista dados dados NULLdados
struct elemento *ultimo;ultimo = inicio_lista;while (ultimo->proximo != null) {
ultimo = ultimo->proximo; }
>
ultimo
NULL
-
25/05/2011 14:39 51
Curso C - IC/UNICAMP
Listas Ligadas: inserir no fim
novo
inicio_lista dados dados NULLdados
struct elemento *ultimo;ultimo = inicio_lista;while (ultimo->proximo != null) {
ultimo = ultimo->proximo; }
novo=(. . . *)malloc(sizeof(. . .));
>
ultimo
NULL
-
25/05/2011 14:39 52
Curso C - IC/UNICAMP
Listas Ligadas: inserir no fim
novo
inicio_lista dados dados NULLdados
struct elemento *ultimo;ultimo = inicio_lista;while (ultimo->proximo != null) {
ultimo = ultimo->proximo; }
novo=(. . . *)malloc(sizeof(. . .));novo->valor = . . . ;novo->proximo = NULL;
>
ultimo
dados NULL
NULL
-
25/05/2011 14:39 53
Curso C - IC/UNICAMP
Listas Ligadas: inserir no fim
novo
inicio_lista dados dados NULLdados
struct elemento *ultimo;ultimo = inicio_lista;while (ultimo->proximo != null) {
ultimo = ultimo->proximo; }
novo=(. . . *)malloc(sizeof(. . .));novo->valor = . . . ;novo->proximo = NULL;ultimo->proximo = novo;
>
ultimo
dados NULL
-
25/05/2011 14:39 54
Curso C - IC/UNICAMP
Listas Ligadas: inserir no meio (ordenado)
inicio_listainicio_lista dados dados NULLdadosdados
>
novo=(. . . *)malloc(sizeof(. . .));novo->valor = . . . ;
novo dados
anterior
-
25/05/2011 14:39 55
Curso C - IC/UNICAMP
Listas Ligadas: inserir no meio (ordenado)
inicio_listainicio_lista dados dados NULLdadosdados
>
novo=(. . . *)malloc(sizeof(. . .));novo->valor = . . . ;
// ordenada por valorstruct elemento *anterior; anterior = inicio_lista;
novo dados
anterioranterior
-
25/05/2011 14:39 56
Curso C - IC/UNICAMP
Listas Ligadas: inserir no meio (ordenado)
while ((anterior-> proximo != NULL) && (anterior->proximo->valor < novo->valor)) {anterior = anterior->proximo;}
inicio_listainicio_lista dados dados NULLdadosdados
anterior
>
novo=(. . . *)malloc(sizeof(. . .));novo->valor = . . . ;
// ordenada por valorstruct elemento *anterior; anterior = inicio_lista;
novo dados
anterior
-
25/05/2011 14:39 57
Curso C - IC/UNICAMP
Listas Ligadas: inserir no meio (ordenado)
while ((anterior-> proximo != NULL) && (anterior->proximo->valor < novo->valor)) {anterior = anterior->proximo;}
novo->proximo = anterior->proximo;anterior->proximo = novo;
inicio_listainicio_lista dados dados NULLdadosdados
anterior
>
novo=(. . . *)malloc(sizeof(. . .));novo->valor = . . . ;
// ordenada por valorstruct elemento *anterior; anterior = inicio_lista;
novo dados NULL
anterior
-
25/05/2011 14:39 58
Curso C - IC/UNICAMP
Listas Ligadas: remover do inicio (no vazia)
alvo
>
alvo = inicio_lista;
inicio_lista dados dados NULLdados
-
25/05/2011 14:39 59
Curso C - IC/UNICAMP
Listas Ligadas: remover do inicio (no vazia)
alvo
>
alvo = inicio_lista;inicio_lista = inicio_lista->proximo;// ou: inicio_lista = alvo->proximo;
inicio_lista dados dados NULLdados
-
25/05/2011 14:39 60
Curso C - IC/UNICAMP
Listas Ligadas: remover do inicio (no vazia)
alvo
>
free(alvo);
alvo = inicio_lista;inicio_lista = inicio_lista->proximo;// ou: inicio_lista = alvo->proximo;
inicio_lista dados dados NULLdados
-
25/05/2011 14:39 61
Curso C - IC/UNICAMP
Listas Ligadas: remover no meio ou fim
inicio_lista dados dados NULLdados
alvoanterior
>
// anterior aponta para o elemento// imediatamente antes de alvo
-
25/05/2011 14:39 62
Curso C - IC/UNICAMP
Listas Ligadas: remover no meio ou fim
inicio_lista dados dados NULLdados
alvoanterior
>
// anterior aponta para o elemento// imediatamente antes de alvo
anterior->proximo = alvo->proximo;
-
25/05/2011 14:39 63
Curso C - IC/UNICAMP
Listas Ligadas: remover no meio ou fim
inicio_lista dados dados NULLdados
alvoanterior
>
// anterior aponta para o elemento// imediatamente antes de alvo
anterior->proximo = alvo->proximo;
free(alvo);
-
25/05/2011 14:39 64
Curso C - IC/UNICAMP
Vantagens: Fcil aumento/diminuio no tamanho da lista
Reserva memria exatamente sob medida
Permite mais de um critrio de ordenao
Vantagens: Fcil aumento/diminuio no tamanho da lista
Reserva memria exatamente sob medida
Permite mais de um critrio de ordenao
Listas Ligadas
Vantagens/Desvantagens:
inicio_lista dados dados NULLdados
>
-
25/05/2011 14:39 65
Curso C - IC/UNICAMP
Vantagens:
Fcil aumento/diminuio no tamanho da lista
Reserva memria exatamente sob medida
Permite mais de um critrio de ordenao
Desvantagens:
Para cada elemento, armazena um apontador
No possvel acessar diretamente um elemento
Vantagens:
Fcil aumento/diminuio no tamanho da lista
Reserva memria exatamente sob medida
Permite mais de um critrio de ordenao
Desvantagens:
Para cada elemento, armazena um apontador
No possvel acessar diretamente um elemento
Listas Ligadas
Vantagens/Desvantagens:
inicio_lista dados dados NULLdados
>
-
25/05/2011 14:39 66
Memria Dinmica
Vetor2Lista
Vetor2ListaRec
ConcatListas
ConcatListasRec
InverteLista
InverteListaRec
InverteListaNaMemoria
Vetor2ListaOrd
Vetor2ListaOrdRec
OperaListasRec
OperaComFilas
Lista2ListaDupla
Express2Arvore
DicionarioBinario