REVISÃO DE C. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Documentos relacionados
Módulo 5 Vetores e Alocação Dinâmica

INF1007: Programação 2. 2 Alocação Dinâmica. 17/02/2014 (c) Dept. Informática - PUC-Rio 1

Módulo 8 Tipos Estruturados

INF1007: Programação 2. 4 Tipos Estruturados. 10/23/09 (c) Dept. Informática - PUC-Rio 1

Programação de Computadores II. Cap. 5 Alocação Dinâmica

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

INF 1007 Programação II

Programação II. Vetores e Alocação Dinâmica. Bruno Feijó Dept. de Informática, PUC-Rio

Programação II. Vetores e Alocação Dinâmica. Bruno Feijó Dept. de Informática, PUC-Rio

5. Vetores e alocação dinâmica

Alocação Dinâmica em C

Estruturas de Dados. Módulo 4 Funções. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

Programação de Computadores II. Cap. 5 Vetores

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

Módulo 10 Listas Encadeadas

INF1007: Programação 2 8 Listas Encadeadas. (c) Dept. Informática - PUC-Rio 1

Exercícios. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

Exercício. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

Revisão: Ponteiros e Alocação Dinámica

Métodos Computacionais. Tipos Estruturados

Instituto de C. Linguagem C: Listas. Luis Martí Instituto de Computação Universidade Federal Fluminense -

ESTRUTURA DE DADOS (TCC )

Introdução a Programação. Ponteiros e Vetores, Alocação Dinâmica

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: ponteiros e alocação dinâmica

1/34 GESTÃO DINÂMICA DE MEMÓRIA

Algoritmos e Estruturas de dados

Introdução à Programação

ALGORITMOS E ESRUTRA DE DADOS I. Ponteiros Passagem por Valor e Referência Alocação de Memória

Linguagem C. Ponteiros. Alex Vidigal Bastos.

Métodos Computacionais. Listas Encadeadas

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

Introdução a Programação. Listas Encadeadas

INF 1007 Programação II

Alocação de Memória. Lucas Ferrari de Oliveira Professor Adjunto Universidade Federal do Paraná (UFPR)

Métodos Computacionais. Vetores e Matrizes Dinâmicas

Programação II. Listas Encadeadas (Linked Lists) Bruno Feijó Dept. de Informática, PUC-Rio

Alocação Dinâmica. Introdução à Computação

Estruturas de Dados. Profa. Juliana Pinheiro Campos

INF 1007 Programação II

Aula 25: Alocação Dinâmica

Programação de Computadores II. Cap. 4 Funções

PONTEIROS E LISTAS. Kalinka Regina Lucas Jaquie Castelo Branco

13. ALOCAÇÃO DINÂMICA DE MEMÓRIA

Ponteiros e Alocação de Memória

Referências. Programação de Computadores II. Cap. 6 Matrizes. Tópicos. Alocação Estática versus Dinâmica. Alocação Estática versus Dinâmica

Estruturas de Dados. Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C

Ponteiros - Parte I. Ponteiros, Ponteiros e Vetores, Algoritmo Bubble Sort, Alocação Dinâmica de Memória

Introdução a Programação. Ponteiros e Strings, Alocação Dinâmica

Linguagem C: Ponteiros - Alocação Dinâmica

Estruturas de Dados. Módulo 6 Matrizes. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

Programação de Computadores II. Cap. 7 Cadeias de Caracteres

Estruturas. struct são coleções de dados heterogêneos agrupados em uma mesma estrutura de dados. Ex: armazenar as coordenadas (x,y) de um ponto:

INF 1007 Programação II

Reinaldo Gomes Alocação Dinâmica

Ponteiros em C. Adriano Joaquim de Oliveira Cruz 21 de julho de Instituto de Matemática Departamento de Ciência da Computação UFRJ

Introdução a Programação. Tipos Estruturados de Dados

Universidade de São Paulo São Carlos Instituto de Ciências Matemáticas e de Computação. Estruturas em C

Ponteiros. prof. Fabrício Olivetti de França

Introdução a Programação. Ponteiros e Passagem de Argumentos por Referência

Estruturas de Dados Aula 12: Outras Implementações de Listas 18/04/2011

Estrutura de dados 2. Ponteiro. Prof. Jesuliana N. Ulysses

Módulo 7 Cadeias de Caracteres

Fontes Bibliográficas. Listas Circulares. Função Imprime

Alocação Estática e Dinâmica. Prof. M.Sc. Mariella Berger

INF 1007 Programação II

8. Tipos estruturados

Estruturas de Dados Aula 10: Listas (parte 2) 19/04/2011

Ponteiros. Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista

Aula 17: Ponteiros e Alocação Dinâmica em C

Estrutura de dados 1. Ponteiros

BCC202 - Estrutura de Dados I

Exercícios Capítulos 5 e 6

O que é um apontador em C (type pointer in C)?

Instituto de C. Filas. Luis Martí Instituto de Computação Universidade Federal Fluminense -

Estruturas de Dados. Módulo 12 - Filas. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

Ponteiros de Variáveis

Ponteiros e Tabelas. K&R: Capitulo 5 IAED, 2012/2013

Ponteiros e Tabelas. K&R: Capitulo 5 IAED, 2012/2013

Lista Encadeada (Linked List)

SSC304 Introdução à Programação Para Engenharias. Alocação Dinâmica. GE4 Bio

Ponteiros & tabelas (cont.) K&R: Capítulo 5

Ponteiros. Embora o programador não tenha acesso ao endereço de uma variável, existem algumas situações onde é necessário a utilização deste endereço.

Tipos Básicos. Operadores de Incremento e Decremento. Operador Sizeof. Estruturas de Dados Aula 2: Estruturas Estáticas

Linguagem C: Elementos fundamentais

Cap. 3 Entrada e Saída e Controle de Fluxo

Professora Jeane Melo

Estruturas de Dados Aula 2: Estruturas Estáticas. Tipos Básicos. Quantos valores distintos podemos representar com o tipo char?

Estruturas de Dados Aulas 3 e 4: Uso da. 14/03/2011 e 16/03/2011

Estruturas de Dados Aula 2: Estruturas Estáticas 02/03/2011

Estruturas de Dados. Módulo 11 Pilhas. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

Introdução à Ciência da Computação I. Alocação Dinâmica. Prof. Claudio Fabiano Motta Toledo

Programação de Computadores II. Cap. 7 Cadeias de Caracteres 1/2

REVISÃO DE PILHAS E FILAS. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Ponteiros. Baseado nos slides do Prof. Mauro.

Programação de Computadores II. Cap. 9 Tipos Abstratos de Dados (TAD)

Transcrição:

REVISÃO DE C Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

REVISÃO DE C Ponteiros Alocação dinâmica de memória Recursão INSTITUTO DE COMPUTAÇÃO - UFF 2

PONTEIROS

PONTEIROS C permite o armazenamento e manipulação de valores de endereço de memória Para cada tipo de dados existente, há um tipo de ponteiro que pode armazenar endereços de memória onde existem valores daquele tipo armazenados INSTITUTO DE COMPUTAÇÃO - UFF 4

EXEMPLO Memória Principal /* variável inteiro */ int a; /* variável ponteiro p/ inteiro */ int *p; p - 108 a - 104 INSTITUTO DE COMPUTAÇÃO - UFF 5

OPERADORES Operador Unário & Endereço de Aplicado a uma variável x, resulta no endereço da posição de memória reservada para a variável x Operador Unário * Conteúdo de Aplicado a variáveis do tipo ponteiro, acessa o conteúdo do endereço de memória armazenado pela variável ponteiro INSTITUTO DE COMPUTAÇÃO - UFF 6

int a, *p, c; /* a recebe o valor 5 */ a = 5; Memória Principal c - 112 p - 108 a 5 104 INSTITUTO DE COMPUTAÇÃO - UFF 7

int a, *p, c; /* a recebe o valor 5 */ a = 5; /* p recebe o endereço de a, ou seja, p aponta para a */ p = &a; Memória Principal c - 112 p 104 108 a 5 104 INSTITUTO DE COMPUTAÇÃO - UFF 8

int a, *p, c; /* a recebe o valor 5 */ a = 5; /* p recebe o endereço de a, ou seja, p aponta para a */ p = &a; /* posição de memória apontada por p recebe 6 */ *p = 6; Memória Principal c - 112 p 104 108 a 6 104 INSTITUTO DE COMPUTAÇÃO - UFF 9

int a, *p, c; /* a recebe o valor 5 */ a = 5; /* p recebe o endereço de a, ou seja, p aponta para a */ p = &a; /* posição de memória apontada por p recebe 6 */ *p = 6; /* c recebe o valor armazenado na posição de memória apontada por p */ c = *p; Memória Principal c 6 112 p 104 108 a 6 104 INSTITUTO DE COMPUTAÇÃO - UFF 10

EXEMPLO Memória Principal int main ( void ) { int a; int *p; p = &a; *p = 2; printf(" %d ", a); return; 112 p 108 a 104 INSTITUTO DE COMPUTAÇÃO - UFF 11

EXEMPLO Memória Principal int main ( void ) { int a; int *p; p = &a; *p = 2; printf(" %d ", a); return; 112 p 104 108 a 104 INSTITUTO DE COMPUTAÇÃO - UFF 12

EXEMPLO Memória Principal int main ( void ) { int a; int *p; p = &a; *p = 2; printf(" %d ", a); return; 112 p 104 108 a 2 104 INSTITUTO DE COMPUTAÇÃO - UFF 13

EXEMPLO Memória Principal int main ( void ) { int a; int *p; p = &a; *p = 2; printf(" %d ", a); return; Imprime o valor 2 112 p 104 108 a 2 104 INSTITUTO DE COMPUTAÇÃO - UFF 14

EXEMPLO COM ERRO Memória Principal int main ( void ) { int a, b, *p; a = 2; *p = 3; b = a + (*p); printf(" %d ", b); return 0; Erro na atribuição *p = 3 - Utiliza a memória apontada por p para armazenar o valor 3, sem que p tivesse sido inicializada - Armazena 3 num espaço de memória desconhecido 3 116 112 p 108 a 2 104 INSTITUTO DE COMPUTAÇÃO - UFF 15

EXEMPLO CORRIGIDO int main ( void ) { int a, b, c, *p; a = 2; p = &c; *p = 3; b = a + (*p); printf(" %d ", b); return 0; Atribuição *p = 3 - p aponta para c - Atribuição armazena 3 no espaço de memória da variável c Memória Principal 114 c 3 112 p 112 108 a 2 104 INSTITUTO DE COMPUTAÇÃO - UFF 16

PASSAGEM DE PONTEIROS PARA FUNÇÕES Quando uma função g chama uma função f f não pode alterar diretamente os valores das variáveis de g, porém Se g passar para f os valores dos endereços de memória onde as variáveis de g estão armazenadas, f pode alterar, indiretamente, os valores das variáveis de g INSTITUTO DE COMPUTAÇÃO - UFF 17

#include <stdio.h> void troca (int *px, int *py ) { int temp; temp = *px; *px = *py; *py = temp; Memória Principal int main ( void ) { int a = 5, b = 7; troca(&a, &b); /* passamos os endereços das variáveis */ printf("%d %d \n", a, b); 112 b 7 108 a 5 104 return 0; INSTITUTO DE COMPUTAÇÃO - UFF 18

#include <stdio.h> void troca (int *px, int *py ) { int temp; temp = *px; *px = *py; *py = temp; int main ( void ) { int a = 5, b = 7; troca(&a, &b); /* passamos os endereços das variáveis */ printf("%d %d \n", a, b); Memória Principal 120 py 108 116 px 104 112 b 7 108 a 5 104 return 0; INSTITUTO DE COMPUTAÇÃO - UFF 19

#include <stdio.h> void troca (int *px, int *py ) { int temp; temp = *px; *px = *py; *py = temp; int main ( void ) { int a = 5, b = 7; troca(&a, &b); /* passamos os endereços das variáveis */ printf("%d %d \n", a, b); Memória Principal temp - 120 py 108 116 px 104 112 b 7 108 a 5 104 return 0; INSTITUTO DE COMPUTAÇÃO - UFF 20

#include <stdio.h> void troca (int *px, int *py ) { int temp; temp = *px; *px = *py; *py = temp; int main ( void ) { int a = 5, b = 7; troca(&a, &b); /* passamos os endereços das variáveis */ printf("%d %d \n", a, b); Memória Principal temp 5 120 py 108 116 px 104 112 b 7 108 a 5 104 return 0; INSTITUTO DE COMPUTAÇÃO - UFF 21

#include <stdio.h> void troca (int *px, int *py ) { int temp; temp = *px; *px = *py; *py = temp; int main ( void ) { int a = 5, b = 7; troca(&a, &b); /* passamos os endereços das variáveis */ printf("%d %d \n", a, b); Memória Principal temp 5 120 py 108 116 px 104 112 b 7 108 a 7 104 return 0; INSTITUTO DE COMPUTAÇÃO - UFF 22

#include <stdio.h> void troca (int *px, int *py ) { int temp; temp = *px; *px = *py; *py = temp; int main ( void ) { int a = 5, b = 7; troca(&a, &b); /* passamos os endereços das variáveis */ printf("%d %d \n", a, b); Memória Principal temp 5 120 py 108 116 px 104 112 b 5 108 a 7 104 return 0; INSTITUTO DE COMPUTAÇÃO - UFF 23

#include <stdio.h> void troca (int *px, int *py ) { int temp; temp = *px; *px = *py; *py = temp; int main ( void ) { int a = 5, b = 7; troca(&a, &b); /* passamos os endereços das variáveis */ printf("%d %d \n", a, b); Memória Principal 120 116 112 b 5 108 a 7 104 return 0; Imprime 7 5 INSTITUTO DE COMPUTAÇÃO - UFF 24

ALOCAÇÃO DINÂMICA DE MEMÓRIA INSTITUTO DE COMPUTAÇÃO - UFF 25

EXEMPLO PARA EXPLICAR O CONCEITO DE ALOCAÇÃO DINÂMICA: VETORES Memória Principal Um vetor é alocado em posições contíguas de memória Exemplo: Seja v um vetor de 10 elementos inteiros Espaço de memória de v = 10 x valores inteiros de 4 bytes = 40 bytes Alocação estática! (espaço de memória é reservado no momento da declaração do vetor) int v[10]; 144 140 136 132 128 124 120 116 112 108 v 104 INSTITUTO DE COMPUTAÇÃO - UFF 26

VETORES E PONTEIROS Memória Principal Nome do vetor é um ponteiro, que aponta para o endereço inicial do vetor C permite aritmética de ponteiros Exemplo: v + 0: primeiro element de v v + 1: segundo element de v v + 9: último element de v 144 v+9 140 v+8 136 v+7 132 v+6 128 v+5 124 v+4 120 v+3 116 v+2 112 v+1 108 v+0 v 104 INSTITUTO DE COMPUTAÇÃO - UFF 27

VETORES E PONTEIROS Formas de Acesso: &v[i] é equivalente a v+i *(v+i) é equivalente a v[i] Memória Principal 144 v+9 140 v+8 136 v+7 132 v+6 128 v+5 124 v+4 120 v+3 116 v+2 112 v+1 108 v+0 v 104 INSTITUTO DE COMPUTAÇÃO - UFF 28

/* Cálculo da média de 10 números reais */ #include <stdio.h> Memória Principal int main ( void ) { float v[10]; float med = 0.0; int i; /* leitura dos valores */ for (i = 0; i < 10; i++) scanf("%f", &v[i]); /* cálculo da média */ for (i = 0; i < 10; i++) med = med + v[i]; med = med / 10; /* exibição do resultado */ printf ( "Media = %f \n", med ); return 0; Acesso ao endereço da i-ésima posição de v Acesso ao conteúdo de v[i] (equivalente a *(v+i)) i - 148 med 0.0 144 v+9 140 v+8 136 v+7 132 v+6 128 v+5 124 v+4 120 v+3 116 v+2 112 v+1 108 v+0 v 104 INSTITUTO DE COMPUTAÇÃO - UFF 29

PASSAGEM DE PARÂMETRO VETOR PARA FUNÇÃO Deve-se passar o endereço da primeira posição do vetor Função deve ter parâmetro do tipo ponteiro para armazenar o valor passado como parâmetro Passar um vetor para uma função é equivalente a passar o endereço inicial do vetor Elementos do vetor não são copiados para a função Argumento copiado é apenas o endereço do primeiro elemento do vetor INSTITUTO DE COMPUTAÇÃO - UFF 30

/* Cálculo da média de 10 números reais */ #include <stdio.h> float media (int n, float *v) { int i; float s = 0.0; for (i = 0; i < n; i++) s += v[i]; return s/n; int main ( void ) { float v[10]; float med; int i; for ( i = 0; i < 10; i++ ) scanf("%f", &v[i]); med = media(10,v); printf ( "Media = %.2f \n", med); return 0; Parâmetro do tipo ponteiro para float INSTITUTO DE COMPUTAÇÃO - UFF 31

FUNÇÃO PODE ALTERAR VALORES DO VETOR Como o que é passado é o endereço do vetor, e não uma cópia dos valores, a função pode alterar os valores do vetor e as alterações serão refletidas no programa principal INSTITUTO DE COMPUTAÇÃO - UFF 32

/* Incrementa elementos de um vetor */ #include <stdio.h> void incr_vetor ( int n, int *v ) { int i; for (i = 0; i < n; i++) v[i]++; int main ( void ) { int a[ ] = {1, 3, 5; incr_vetor(3, a); printf("%d %d %d \n", a[0], a[1], a[2]); return 0; Imprime 2 4 6 INSTITUTO DE COMPUTAÇÃO - UFF 33

ALOCAÇÃO DINÂMICA DE MEMÓRIA Alocação dinâmica é usada quando não se sabe de antemão quanto espaço de memória será necessário Exemplo, quando não é possível determinar o tamanho do vetor de antemão Alocação dinâmica Espaço de memória é requisitado em tempo de execução Espaço permanece alocado até que seja explicitamente liberado Depois de liberado, espaço pode ser disponibilizado para outros usos e não pode mais ser acessado Espaço alocado e não liberado explicitamente é liberado ao final da execução do programa INSTITUTO DE COMPUTAÇÃO - UFF 34

ALOCAÇÃO ESTÁTICA X ALOCAÇÃO DINÂMICA Alocação Estática Alocação Dinâmica Memória Principal: Código do Programa Memória Principal: Código do Programa Variáveis Globais e Locais estáticas Variáveis Globais e Locais estáticas Variáveis Alocadas Dinamicamente Memória Livre que pode ser alocada pelo programa INSTITUTO DE COMPUTAÇÃO - UFF 35

BIBLIOTECA STDLIB.H A biblioteca stdlib.h contém funções e constantes para alocação dinâmica de memória INSTITUTO DE COMPUTAÇÃO - UFF 36

FUNÇÕES IMPORTANTES DA STDBLI.H sizeof(tipo) Retorna o número de bytes ocupado por um tipo malloc(tamanho) Recebe como parâmetro o tamanho do espaço de memória (em bytes) se deseja alocar Retorna um ponteiro genérico para o endereço inicial da área de memória alocada, se houver espaço livre Ponteiro genérico é representado por void* Ponteiro é convertido automaticamente para o tipo apropriado Ponteiro pode ser convertido explicitamente Retorna um endereço nulo (NULL) se não houver espaço livre INSTITUTO DE COMPUTAÇÃO - UFF 37

EXEMPLO Memória Principal Alocação dinâmica de um vetor de inteiros com 10 elementos malloc retorna o endereço do espaço de memória alocado ponteiro de inteiro (v) recebe endereço inicial do espaço de memória alocado int *v; Código do Programa Variáveis Globais e Locais estáticas (40 bytes) 504 v = (int*) malloc(10 * sizeof(int)); no programa, v pode ser tratado como um vetor alocado estaticamente Memória Livre v 504 INSTITUTO DE COMPUTAÇÃO - UFF 38

TRATAMENTO DE ERRO v = (int*) malloc(10*sizeof(int)); if (v == NULL) { printf("memoria insuficiente.\n"); exit(1); /* aborta o programa e retorna 1 para o sist. operacional */ INSTITUTO DE COMPUTAÇÃO - UFF 39

LIBERAÇÃO DE MEMÓRIA free(ponteiro) Libera a memória apontada por ponteiro A posição de memória apontada por ponteiro deve ter sido alocada dinamicamente INSTITUTO DE COMPUTAÇÃO - UFF 40

/* Cálculo da média de um número n de números reais */ #include <stdio.h> #include <stdlib.h> int main ( void ) { int i,n; float *v; float med; scanf("%d", &n); /* leitura do número n de valores */ v = (float*) malloc(n*sizeof(float)); /* alocação dinâmica */ if (v==null) { printf("memoria insuficiente.\n ); return 1; for (i = 0; i < n; i++) scanf("%f", &v[i]); med = media(n,v); /* chama a função de cálculo de média */ printf("media = %.2f \n", med); free(v); //libera memória */ return 0; INSTITUTO DE COMPUTAÇÃO - UFF 41

PONTEIROS E TIPOS ESTRUTURADOS INSTITUTO DE COMPUTAÇÃO - UFF 42

TIPO ESTRUTURA Tipo de dado com elementos (campos) compostos por tipos mais simples Campos são acessados através do operador de acesso ponto (.) struct ponto2d { /* declara ponto2d do tipo struct */ float x; float y; ;... struct ponto2d p; /* declara p como variável do tipo struct ponto2d */... p.x = 10.0; /* acessa os elementos de ponto2d */ p.y = 5.0; INSTITUTO DE COMPUTAÇÃO - UFF 43

EXEMPLO COMPLETO /* Captura e imprime as coordenadas de um ponto qualquer */ #include <stdio.h> struct ponto2d { float x; float y; ; int main (void) { struct ponto2d p; printf("digite as coordenadas do ponto(x y): "); scanf("%f %f", &p.x, &p.y); printf("o ponto fornecido foi: (%.2f,%.2f)\n", p.x, p.y); return 0; INSTITUTO DE COMPUTAÇÃO - UFF 44

PONTEIROS PARA ESTRUTURAS Acesso ao valor de um campo x de uma variável estrutura p: p.x Acesso ao valor de um campo x de uma variável ponteiro pp: pp->x ou (*pp).x Acesso ao endereço do campo x de uma variável ponteiro pp: &pp->x struct ponto2d *pp;... (*pp).x = 12.0; /* formas equivalentes de acessar o valor de um campo x */ pp->x = 12.0; INSTITUTO DE COMPUTAÇÃO - UFF 45

ALOCAÇÃO DINÂMICA DE ESTRUTURAS Tamanho do espaço de memória alocado dinamicamente é dado pelo operador sizeof aplicado sobre o tipo estrutura A função malloc retorna o endereço do espaço alocado, que é então convertido para o tipo ponteiro da estrutura struct ponto2d* p; p = (struct ponto2d*) malloc (sizeof(struct ponto2d));... p->x = 12.0; INSTITUTO DE COMPUTAÇÃO - UFF 46

É MAIS SIMPLES DEFINIR UM NOME PARA O TIPO typedef permite criar nomes de tipos útil para abreviar nomes de tipos e para tratar tipos complexos struct ponto2d { /* ponto2d representa uma estrutura com 2 campos float */ ; float x; float y; typedef struct ponto2d TPonto2d; /* Ponto2d representa a estrutura ponto2d */ typedef struct ponto2d *TPonto2d; /* PPonto2d representa o tipo de ponteiro para a estrutura ponto2d */ INSTITUTO DE COMPUTAÇÃO - UFF 47

COMANDOS EQUIVALENTES struct ponto2d { /* ponto2d representa uma estrutura com 2 campos float */ float x; float y; ; typedef struct ponto2d TPonto2d; // TPonto2d representa a estrutura ponto2d typedef struct ponto2d { /* ponto2d representa uma estrutura com 2 campos float */ float x; float y; TPonto2d; INSTITUTO DE COMPUTAÇÃO - UFF 48

/* Exemplo com estruturas aninhadas */ #include <stdio.h> #include <math.h> typedef struct ponto2d { /* ponto2d representa uma estrutura com 2 campos float */ float x; float y; TPonto2d; typedef struct circulo { TPonto2d p; /* centro do círculo */ float r; /* raio do círculo */ TCirculo; /* Função para a calcular distância entre 2 pontos: entrada: ponteiros para os pontos saída: distância correspondente */ float distancia (TPonto2d* p, TPonto2d* q) { float d = sqrt((q->x - p->x)*(q->x - p->x) + (q->y - p->y)*(q->y - p->y)); return d; INSTITUTO DE COMPUTAÇÃO - UFF 49

/* Função para determinar se um ponto está ou não dentro de um círculo: */ entrada: ponteiros para um círculo e para um ponto saída: 1 = ponto dentro do círculo 0 = ponto fora do círculo int interior (TCirculo* c, TPonto2d* p) { float d = distancia(&c->p, p); return (d < c->r); &c->p: ponteiro para o centro de c p: ponteiro para o ponto int main (void) { TCirculo c; TPonto2d p; printf("digite as coordenadas do centro e o raio do circulo:\n"); scanf("%f %f %f", &c.p.x, &c.p.y, &c.r); printf("digite as coordenadas do ponto:\n"); scanf("%f %f", &p.x, &p.y); printf("pertence ao interior = %d\n", interior(&c,&p)); return 0; INSTITUTO DE COMPUTAÇÃO - UFF 50

EXEMPLO PRÁTICO: LISTA SIMPLESMENTE ENCADEADA

DEFINIÇÃO DA LISTA Vamos usar um exemplo onde a lista tem um campo inteiro info, e um ponteiro prox para o próximo nó da lista struct lista { int info; struct lista* prox; ; typedef struct lista TLista; INSTITUTO DE COMPUTAÇÃO - UFF 52

FUNÇÕES DE MANIPULAÇÃO DA LISTA cria_lista Cria uma lista vazia, representada pelo ponteiro NULL TLista* cria_lista (void) { return NULL; INSTITUTO DE COMPUTAÇÃO - UFF 53

FUNÇÕES DE MANIPULAÇÃO DA LISTA insere_inicio Insere um elemento no início da lista Retorna a lista atualizada novo li 4 5 3 2 TLista* insere_inicio (TLista* li, int i) { TLista* novo = (TLista*) malloc(sizeof(tlista)); novo->info = i; novo->prox = li; return novo; INSTITUTO DE COMPUTAÇÃO - UFF 54

FUNÇÕES DE MANIPULAÇÃO DA LISTA imprime Imprime os elementos da lista void imprime (TLista* li) { TLista* p; for (p = li; p!= NULL; p = p->prox) printf("info = %d\n", p->info); INSTITUTO DE COMPUTAÇÃO - UFF 55

FUNÇÕES DE MANIPULAÇÃO DA LISTA insere_fim Insere um elemento no fim da lista Retorna ponteiro para a lista atualizada novo li 4 5 3 2 INSTITUTO DE COMPUTAÇÃO - UFF 56

FUNÇÕES DE MANIPULAÇÃO DA LISTA insere_fim Insere um elemento no fim da lista Retorna ponteiro para a lista atualizada novo li 4 5 3 2 Implementem a função insere_fim: TLista* insere_fim (TLista* li, int i) INSTITUTO DE COMPUTAÇÃO - UFF 57

TLista* insere_fim (TLista* li, int i) { TLista* novo = (TLista*) malloc(sizeof(tlista)); novo->info = i; novo->prox = NULL; TLista* p = li; TLista* q = li; while (p!= NULL) { /* encontra o ultimo elemento */ q = p; p = p->prox; if (q!= NULL) /* se a lista original não estiver vazia */ q->prox = novo; else novo 4 li = novo; return li; li 5 3 2 INSTITUTO DE COMPUTAÇÃO - UFF 58

FUNÇÕES DE MANIPULAÇÃO DA LISTA insere_ordenado Insere um elemento na lista de forma que ela esteja sempre ordenada Retorna ponteiro para a lista atualizada novo 4 li 2 3 5 INSTITUTO DE COMPUTAÇÃO - UFF 59

FUNÇÕES DE MANIPULAÇÃO DA LISTA insere_ordenado Insere um elemento na lista de forma que ela esteja sempre ordenada Retorna ponteiro para a lista atualizada novo 4 li 2 3 5 Implementem a função insere_ordenado: TLista* insere_ordenado (TLista* li, int i) INSTITUTO DE COMPUTAÇÃO - UFF 60

TLista* insere_ordenado (TLista* li, int i) { TLista* novo; TLista* ant = NULL; /* ponteiro para elemento anterior */ TLista* p = li; /* ponteiro para percorrer a lista */ /* procura posição de inserção */ while (p!= NULL && p->info < i) { ant = p; p = p->prox; /* cria novo elemento */ novo = (TLista*) malloc(sizeof(tlista)); novo->info = i; /* encadeia elemento */ if (ant == NULL) { /* insere elemento no início */ novo->prox = li; li = novo; else { /* insere elemento no meio da lista */ novo->prox = ant->prox; ant->prox = novo; return li; INSTITUTO DE COMPUTAÇÃO - UFF 61

FUNÇÕES RECURSIVAS

FUNÇÕES RECURSIVAS Quando uma função chama a si mesma, dizemos que a função é recursiva Pontos importantes: Forma fácil de dividir para conquistar trata-se um item e chama-se recursivamente para os demais É preciso ter um critério de parada para evitar loop infinito de chamadas Exercícios: Função recursiva para inserção no final da lista TLista* insere_fim_recursivo (TLista* li, int i) Função recursiva para inserção ordenada TLista *insere_ordenado_recursivo(tlista *li, TLista* ant, int i) INSTITUTO DE COMPUTAÇÃO - UFF 63

EXERCÍCIOS Função para excluir um elemento da lista: TLista* exclui(tlista* li, int i) Função para alterar o valor de um elemento da lista: TLista* altera(tlista* li, int vantigo, int vnovo) INSTITUTO DE COMPUTAÇÃO - UFF 66

AGRADECIMENTOS Material baseado nos slides de Waldemar Celes e Marcelo Gattass Departamento de Informática, PUC-Rio Waldemar Celes, Renato Cerqueira, José Lucas Rangel. Introdução a Estruturas de Dados. Editora Campus, 2004. INSTITUTO DE COMPUTAÇÃO - UFF 67