Buscar

Estruturas de Dados - Vetores e Ponteiros (Guilherme)

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 7 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 7 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Estruturas de Dados
Vetores & Ponteiros
Guilherme N. Ramos
gnramos@cic.unb.br
Departamento de Cieˆncia da Computac¸a˜o
Universidade de Bras´ılia
gnramos (CIC/UnB) 116319 - Estruturas de Dados 1/28
Estruturas de Dados
Introduc¸a˜o
Exemplos de problemas:
- manipular arquivos com informac¸o˜es de alunos
- soluc¸a˜o: ordenar por nu´mero de matr´ıcula
- operac¸o˜es poss´ıveis: inserir/remover, pesquisar, etc.
- qual ED seria adequada? Lista
- corrigir provas
- soluc¸a˜o: analisar cada uma individualmente
- operac¸o˜es poss´ıveis: colocar/retirar prova
- qual ED seria adequada? Pilha
- lidar com alunos que querem revisar a prova
- soluc¸a˜o: ordernar por ordem de chegada
- operac¸o˜es poss´ıveis: entrar (ao fim)/sair (do comec¸o)
- qual ED seria adequada? Fila
gnramos (CIC/UnB) 116319 - Estruturas de Dados 2/28
Estruturas de Dados
Introduc¸a˜o
Estruturas de Dados e Algoritmos
Temas fundamentais da Cieˆncia da Computac¸a˜o, utilizados em diversas
a´reas do conhecimento e com diferentes propo´sitos de aplicac¸a˜o
- Estrutura de Dados: modo particular de armazenar/organizar dados
- Algoritmo: sequ¨eˆncia finita de instruc¸o˜es (para resolver uma tarefa)
Exemplo - problema: descobrir o telefone de um conhecido
- Algoritmo: pesquisa sequ¨encial por nome (chave de ordenac¸a˜o)
- Estrutura de dados: lista telefoˆnica - [nome] : [nu´mero de telefone]
- E se quise´ssemos pesquisar pelo peso?
Uma estrutura de dados adequada pode aumentar a eficieˆncia do
algoritmo
gnramos (CIC/UnB) 116319 - Estruturas de Dados 3/28
Estruturas de Dados
Tipos de Dados
Termos:
- Tipo de Dado: associado a um me´todo de interpretar um padra˜o de
bits (linguagem de programac¸a˜o)
- boolean (bit - 0/1)
- Tipo Abstrato de Dado (TAD): modelo de dado e operac¸o˜es
definidas sobre ele
- N e {+, -, /, *}
- Estrutura de Dados (ED): forma concreta de se implementar um
TAD → representac¸a˜o computacional do modelo matema´tico
Uma ED pode ser:
- homogeˆnea: conjuntos de dados do mesmo tipo
- heterogeˆnea: conjuntos de dados de diferentes tipos
gnramos (CIC/UnB) 116319 - Estruturas de Dados 4/28
Estruturas de Dados
Tipos de Dados - Primitivos
Dependem da linguagem de programac¸a˜o usada
Integer
Tamanho Intervalo
4 bits [-8, 7]
8 bits [-128, 127]
16 bits [-32768, 32767]
· · · · · ·
- Boolean: valor lo´gico
- b ← falso
- Integer: valor nume´rico (∈ Z)
- i ← 2010
- Float: valor nume´rico (∈ R)
- f ← 3.14
- Character: letras, d´ıgitos, s´ımbolos
- c ←’@’
- String: sequeˆncia de caracteres
- s ← “#2: Geˆnio e´ 1% inspirac¸a˜o e 99% de transpirac¸a˜o (T. Edison)”
- Ponteiro
gnramos (CIC/UnB) 116319 - Estruturas de Dados 5/28
Estruturas de Dados
Tipos de Dados - Compostos
Criados a partir dos tipos primitivos
- Registro: 2 ou mais primitivos
struct numero complexo t{
float re ;
float im;
};
- Unia˜o: diferentes tipos primitivos em um u´nico espac¸o de memo´ria
union valor u {
int iVal
float fVal
char cVal
};
- Simples: o programador precisa saber qual o tipo esta´ usando
- Variante: o computador sabe o tipo utilizado
gnramos (CIC/UnB) 116319 - Estruturas de Dados 6/28
Estruturas de Dados
Tipos de Dados - Abstratos
Modelo matema´tico para EDs similares
- Definido (indiretamente) pelas operac¸o˜es que pode realizar
Forma de organizar e relacionar dados na memo´ria do sistema, de modo
a permitir certas operac¸o˜es sobre esses dados, independentemente do
modo como essas estruturas sa˜o implementadas.
Exemplo: Pilha
- Push (inserir)
- Pop (remover)
gnramos (CIC/UnB) 116319 - Estruturas de Dados 7/28
Estruturas de Dados Lineares
Vetor
- Conjunto de dados do mesmo tipo (estrutura homogeˆnea)
- Cada elemento pode ser acessado por sua posic¸a˜o (´ındice)
- Alocac¸a˜o esta´tica e sequ¨encial
Vantagens:
- Simplicidade
- Acesso direto
Desvantagens:
- Tamanho fixo
a b c d e f
gnramos (CIC/UnB) 116319 - Estruturas de Dados 8/28
Estruturas de Dados Lineares
Vetor
Inserc¸a˜o no fim
void append(tipo item ∗vetor , int n, tipo item novo item) {
int i ; // n: numero de elementos do vetor
tipo item ∗ vetor antigo = vetor;
vetor = (tipo item ∗)malloc((n + 1) ∗ sizeof( tipo item )) ;
for ( i = 0; i < numero elementos; ++i)
vetor [ i ] = vetor antigo [ i ];
vetor [numero elementos] = novo item;
free( vetor antigo ) ;
}
gnramos (CIC/UnB) 116319 - Estruturas de Dados 9/28
Estruturas de Dados Lineares
Matriz
- Conjunto de dados do mesmo tipo (estrutura homogeˆnea)
- Cada elemento pode ser acessado por sua posic¸a˜o (´ındice)
- Alocac¸a˜o esta´tica e sequ¨encial
Vantagens:
- Simplicidade
- Acesso direto
Desvantagens:
- Tamanho fixo
gnramos (CIC/UnB) 116319 - Estruturas de Dados 10/28
Estruturas de Dados Lineares
Alocac¸a˜o esta´tica x Alocac¸a˜o dinaˆmica
Varia´veis esta´ticas
Tem seu enderec¸o fixado antes do in´ıcio da execuc¸a˜o do programa. A
a´rea de memo´ria ocupada se mante´m durante toda a execuc¸a˜o.
Varia´veis dinaˆmicas
Sa˜o criadas e eliminadas durante a execuc¸a˜o do programa, ocupando
memo´ria somente quando sa˜o utilizadas
Alocac¸a˜o esta´tica
int vetor [10];
Alocac¸a˜o dinaˆmica
int ∗vetor = (int ∗)malloc(10 ∗ sizeof( int)) ;
// verificar se houve erro
gnramos (CIC/UnB) 116319 - Estruturas de Dados 11/28
Estruturas de Dados Lineares
Alocac¸a˜o esta´tica x Alocac¸a˜o dinaˆmica
E´ poss´ıvel criar vetores de tamanho varia´vel usando alocac¸a˜o dinaˆmica?
- Elementos do vetor sa˜o criados somente quando necessa´rios
- esta˜o espac¸ados na memo´ria
- Como saber onde esta´ o pro´ximo elemento do vetor?
- Ponteiros! Cada elemento do vetor guarda a posic¸a˜o do pro´ximo
- Um ponteiro indica o primeiro elemento
- Um ponteiro indica o u´ltimo elemento
- Cada elemento possui uma ligac¸a˜o para o pro´ximo elemento
Tipo data t
typedef struct {
key t key;
// etc .
} data t ;
Elemento do vetor dinaˆmico
typedef struct slist node t {
data t data;
struct slist node t ∗next;
} slist node t ;
gnramos (CIC/UnB) 116319 - Estruturas de Dados 12/28
Estruturas de Dados Lineares
Alocac¸a˜o esta´tica x Alocac¸a˜o dinaˆmica
Ana´lise de complexidade:
Considere um vetor esta´tico e um vetor com alocac¸a˜o dinaˆmica conforme
definido anteriormente:
- Qual a complexidade de inserc¸a˜o de um ı´tem novo no in´ıcio do
vetor?
Vetor esta´tico O(n)
1 criar novo vetor
2 inserir novo item
3 copiar items do velho para o
novo vetor
Vetor dinaˆmico O(1)
1 definir o primeiro item como
pro´ximo do novo item
2 definir o primeiro item como o
novo item
gnramos (CIC/UnB) 116319 - Estruturas de Dados 13/28
Estruturas de Dados Lineares
Ponteiros (apontador)
Tipo de dado de uma linguagem de programac¸a˜o. O valor armazenado se
refere diretamente a um outro valor alocado em outra a´rea da memo´ria -
e´ o enderec¸o deste.
1048736
ptr int
2010
int
2011
int
CIC
char
UnB
char
2014
int
ED
char
O Ministe´rio da Programac¸a˜o adverte
O descuido com ponteiros pode levar a se´rios bugs, perda de tempo e a
dores de cabec¸a.
gnramos (CIC/UnB) 116319 - Estruturas de Dados 14/28
Estruturas de Dados Lineares
Ponteiros - Falha de segmentac¸a˜o
gnramos (CIC/UnB) 116319 - Estruturas de Dados 15/28
Estruturas de Dados Lineares
Ponteiros - Ponteiro selvagem
gnramos (CIC/UnB) 116319 - Estruturas de Dados 16/28
Estruturas de Dados Lineares
Ponteiros
Em C:
key t key; // estrutura qualquer
// inicializacao de key
key t ∗ptr = NULL; // ponteiro para tipo key t
ptr = &key; // ptr recebe o endereco de memoria de key
key t key2 = ∗ptr; // key2 recebe o conteudo de ptr
if ( key2 != key)
// tela azul?
gnramos (CIC/UnB) 116319 - Estruturas de Dados 17/28
Estruturas de Dados Lineares
Ponteiros
MaisC:
int array [5]; // Declaracao estatica de 5 inteiros consecutivos
int ∗ptr = array; // Um vetor pode ser usado como ponteiro
ptr [0] = 1; // Ponteiros podem ser indexados como um vetor
∗(array + 1) = 2; /∗ Vetores podem ser referenciados com a sintaxe de
ponteiro (mesmo que array[1] = 2;) ∗/
∗(1 + array) = 3; /∗ Adicao de ponteiros e comutativa (mesmo que
array [1] = 3;) ∗/
2[ array ] = 4; // Indexacao e comutativa (mesmo que array[2] = 4;)
gnramos (CIC/UnB) 116319 - Estruturas de Dados 18/28
Estruturas de Dados Lineares
Ponteiros - Exemplos
void ptr 1 () {
int x, y, ∗p1, ∗p2;
x = 5;
y = 7;
p1 = &x;
printf (” p1 = %d | ∗p1 = %d\n”, p1, ∗p1);
p2 = &y;
printf (” p2 = %d | ∗p2 = %d\n”, p2, ∗p2);
}
Resultado
p1 = 1606416876 | *p1 = 5
p2 = 1606416872 | *p2 = 7
gnramos (CIC/UnB) 116319 - Estruturas de Dados 19/28
Estruturas de Dados Lineares
Ponteiros - Exemplos
void ptr 2 () {
int x, y, ∗p1, ∗p2;
x = 5;
y=7;
p1 = &x;
printf (” p1 = %d | ∗p1 = %d\n”, p1, ∗p1);
p2 = &y;
printf (” p2 = %d | ∗p2 = %d\n”, p2, ∗p2);
∗p2 = ∗p1;
printf (” p2 = %d | ∗p2 = %d\n”, p2, ∗p2);
}
Resultado
p1 = 1606416876 | *p1 = 5
p2 = 1606416872 | *p2 = 7
p2 = 1606416872 | *p2 = 5
gnramos (CIC/UnB) 116319 - Estruturas de Dados 20/28
Estruturas de Dados Lineares
Ponteiros - Exemplos
void ptr 3 () {
int ∗p1, ∗p2;
p1 = malloc(sizeof(int)) ;
p2 = malloc(sizeof(int)) ;
∗p1 = 10;
∗p2 = 20;
printf (” p1 = %d | ∗p1 = %d\n”, p1, ∗p1);
printf (” p2 = %d | ∗p2 = %d\n”, p2, ∗p2);
}
Resultado
p1 = 1048704 | *p1 = 10
p2 = 1048720 | *p2 = 20
gnramos (CIC/UnB) 116319 - Estruturas de Dados 21/28
Estruturas de Dados Lineares
Ponteiros - Exemplos
void ptr 4 () {
int ∗p1, ∗p2;
p1 = malloc(sizeof(int)) ;
p2 = malloc(sizeof(int)) ;
∗p1 = 10;
∗p2 = 20;
printf (” p1 = %d | ∗p1 = %d\n”, p1, ∗p1);
printf (” p2 = %d | ∗p2 = %d\n”, p2, ∗p2);
∗p2 = ∗p1;
printf (” p2 = %d | ∗p2 = %d\n”, p2, ∗p2);
}
Resultado
p1 = 1048736 | *p1 = 10
p2 = 1048752 | *p2 = 20
p2 = 1048752 | *p2 = 10
gnramos (CIC/UnB) 116319 - Estruturas de Dados 22/28
Estruturas de Dados Lineares
Ponteiros - Exemplos
void ptr 5 () {
int ∗p1, ∗p2;
p1 = malloc(sizeof(int)) ;
p2 = malloc(sizeof(int)) ;
∗p1 = 10;
∗p2 = 20;
printf (” p1 = %d | ∗p1 = %d\n”, p1, ∗p1);
printf (” p2 = %d | ∗p2 = %d\n”, p2, ∗p2);
p2 = p1;
printf (” p2 = %d | ∗p2 = %d\n”, p2, ∗p2);
}
Resultado
p1 = 1048768 | *p1 = 10
p2 = 1048784 | *p2 = 20
p2 = 1048768 | *p2 = 10
gnramos (CIC/UnB) 116319 - Estruturas de Dados 23/28
Estruturas de Dados Lineares
Ponteiros - Exemplos
void ptr 6 () {
int ∗p1, ∗p2;
p1 = malloc(sizeof(int)) ;
p2 = malloc(sizeof(int)) ;
∗p1 = 10;
∗p2 = 20;
printf (” p1 = %d | ∗p1 = %d\n”, p1, ∗p1);
printf (” p2 = %d | ∗p2 = %d\n”, p2, ∗p2);
free(p2);
p2 = p1;
printf (” p2 = %d | ∗p2 = %d\n”, p2, ∗p2);
}
Resultado
p1 = 1048800 | *p1 = 10
p2 = 1048816 | *p2 = 20
p2 = 1048800 | *p2 = 10
gnramos (CIC/UnB) 116319 - Estruturas de Dados 24/28
Estruturas de Dados Lineares
Ponteiros - Exemplos
void ptr 7 () {
int ∗p1;
float ∗p2;
void ∗p3;
p1 = malloc(sizeof(int)) ;
∗p1 = 5;
p3 = p1;
printf (” p1 = %d | ∗p1 = %d\n”, p1, ∗p1);
printf (” p3 = %d | ∗p3 = %d\n”, p3, ∗((int ∗)p3));
p2 = malloc(sizeof(float)) ;
∗p2 = 6.2;
p3 = p2;
printf (” p2 = %d | ∗p2 = %f\n”, p2, ∗p2);
printf (” p3 = %d | ∗p3 = %f\n”, p3, ∗((float ∗)p3));
}
gnramos (CIC/UnB) 116319 - Estruturas de Dados 25/28
Resultado
p1 = 1049296 | *p1 = 5
p3 = 1049296 | *p1 = 5
p2 = 1049312 | *p2 = 6.2
p3 = 1049312 | *p1 = 6.2
Estruturas de Dados Lineares
Ponteiros - Exemplos
void ptr 8 () {
typedef struct {
int x;
float y;
} reg ;
reg ∗p1, ∗p2;
p1 = malloc(sizeof(reg));
p2 = malloc(sizeof(reg));
(∗p1).x = 3;
p1−>y = 5.3;
printf (” p1 = %d | (∗p1).x = %d | p1−>y = %f\n”, p1, (∗p1).x, p1−>y);
∗p2 = ∗p1;
printf (” p2 = %d | (∗p2).x = %d | p2−>y = %f\n”, p2, (∗p2).x, p2−>y);
}
gnramos (CIC/UnB) 116319 - Estruturas de Dados 26/28
Resultado
p1 = 1048848 | (*p1).x = 3 | p1->y = 5.3
p2 = 1048864 | (*p2).x = 3 | p2->y = 5.3
Estruturas de Dados Lineares
Ponteiros - Exemplos
void ptr 9 () {
slist node t ∗p1, ∗ first = NULL;
p1 = malloc(sizeof(struct slist node t )) ;
p1−>data = 0; p1−>next = first;
first = p1;
p1 = malloc(sizeof(struct slist node t )) ;
p1−>data = 2; p1−>next = first;
first = p1;
p1 = malloc(sizeof(struct slist node t )) ;
p1−>data = 4; p1−>next = first;
first = p1;
printf (” 1o elemento %d \n”, first−>data);
printf (” 2o elemento %d \n”, first−>next−>data);
printf (” 3o elemento %d \n”, first−>next−>next−>data) ;
p1 = NULL;
printf (” elemento1 %d \n”, p1−>data);
}
gnramos (CIC/UnB) 116319 - Estruturas de Dados 27/28
typedef struct slist node t{
int data;
struct slist node t ∗next;
} slist node t ;
Resultado
1o elemento 4
2o elemento 2
3o elemento 0
Segmentation fault
Estruturas de Dados Lineares
Exerc´ıcios - func¸a˜o swap
Dado um vetor e dois ı´ndices, troque os elementos das posic¸o˜es.
1 Para um vetor esta´tico (ex1, ex2)
2 Para um vetor dinaˆmico (ex3, ex4)
Assinatura da func¸a˜o:
- void swap(char *, int, int)
gnramos (CIC/UnB) 116319 - Estruturas de Dados 28/28
	Estruturas de Dados
	
	
	Estruturas de Dados Lineares

Continue navegando