Algoritmos e Estruturas de Dados I
IEC012
Linguagem C
Linguagem C
Estruturas
Estruturas
-Prof. César Melo
Slides preparados pelo Prof. Leandro Galvão galvao@dcc.ufam.edu.br
Estruturas de dados
Estruturas de dados
❖ Uma estrutura (structUma estrutura (struct) é uma coleção de uma ou ) é uma coleção de uma ou mais variáveis, possivelmente de tipos diferentes,
mais variáveis, possivelmente de tipos diferentes,
agrupadas sob um único nome.
agrupadas sob um único nome.
❖ Estruturas (ou registros) são classificados como Estruturas (ou registros) são classificados como
variáveis compostas heterogêneas
variáveis compostas heterogêneas, pois podem, pois podem
agrupar variáveis de tipos diferentes.
agrupar variáveis de tipos diferentes.
❖ Em contraposição, temos os vetores e matrizes Em contraposição, temos os vetores e matrizes classificados como variáveis compostas
classificados como variáveis compostas
homogêneas
❖
Exemplo:
Exemplo:
struct data { int dia; int mes; int ano; };Estruturas de dados
Estruturas de dados
❖ A palavra-chave structA palavra-chave struct informa ao compilador informa ao compilador
que um modelo de estrutura está sendo definido.
que um modelo de estrutura está sendo definido. ❖ ““data”data” é uma etiqueta é uma etiqueta que dá nome à que dá nome à definiçãodefinição
da estrutura.
da estrutura.
❖ Uma definição de estrutura é um comandoUma definição de estrutura é um comando, por , por
isso deve terminar em ponto-e-vírgula.
isso deve terminar em ponto-e-vírgula.
Estruturas de dados
❖ Os nomes declarados entre as chaves são os Os nomes declarados entre as chaves são os campos (ou membros)
campos (ou membros) da estrutura.da estrutura.
❖ Os campos de uma mesma estrutura devem ter Os campos de uma mesma estrutura devem ter nomes diferentes
nomes diferentes..
❖ Porém, estruturas diferentes podem conter Porém, estruturas diferentes podem conter campos com o mesmo nome
campos com o mesmo nome..
Estruturas de dados
Estruturas de dados
Estruturas de dados
❖ A definição de uma estrutura não reservaA definição de uma estrutura não reserva
qualquer
qualquer espaço na memóriaespaço na memória..
❖ Note que, no exemplo dado, nenhuma variável Note que, no exemplo dado, nenhuma variável
foi declarada de fato, apenas a forma dos dados
foi declarada de fato, apenas a forma dos dados
foi definida.
foi definida.
❖ Essa definição, porém, cria um novo tipo de Essa definição, porém, cria um novo tipo de dados
dados, que pode ser usado para declarar , que pode ser usado para declarar variáveis.
struct data { int dia; int mes; int ano; }; ... struct data x;
❖ Duas maneiras de declarar a variável xDuas maneiras de declarar a variável x do tipo data do tipo data::
struct data { int dia; int mes; int ano; } x; ou Dois comandos: Dois comandos:
•DefineDefine estruturaestrutura como como novo tipo
novo tipo
•Declara variávelDeclara variável do do novo tipo definido novo tipo definido
Um comando: Um comando:
•DefineDefine estruturaestrutura e e declara variável
declara variável do do novo tipo definido novo tipo definido
Declarando uma estrutura
Declarando uma estrutura
❖ Os campos de uma estrutura podem ser de Os campos de uma estrutura podem ser de qualquer tipo
qualquer tipo, inclusive uma estrutura , inclusive uma estrutura previamente definida.
previamente definida.
❖ Porém, o tipo dos campos não podem ser o do Porém, o tipo dos campos não podem ser o do
próprio tipo que está sendo definido.
próprio tipo que está sendo definido.
Declarando uma estrutura
❖ A definição do formato de uma estrutura pode A definição do formato de uma estrutura pode
ser feita dentro da função principal (
ser feita dentro da função principal (mainmain) ou fora ) ou fora dela.
dela.
❖ Usualmente, declara-se fora da função principalUsualmente, declara-se fora da função principal, ,
de modo que outras funções também possam
de modo que outras funções também possam
“enxergar” a estrutura definida.
“enxergar” a estrutura definida.
Declarando uma estrutura
❖ Forma geral de definição de uma estrutura:Forma geral de definição de uma estrutura: struct <etiqueta> { <tipo> campo_1; <tipo> campo_2; ... <tipo> campo_n; } <variáveis>;
Estruturas de dados
Estruturas de dados
❖ Novos tipos de dados podem ser definidos Novos tipos de dados podem ser definidos
utilizando-se a palavra-chave
utilizando-se a palavra-chave typedeftypedef..
Declarando uma estrutura utilizando
Declarando uma estrutura utilizando
typedef
typedef
struct nome_da_estrutura { <tipo> campo_1; <tipo> campo_2; ... <tipo> campo_n; };❖ Exemplo:Exemplo:
Declarando uma estrutura utilizando
Declarando uma estrutura utilizando
typedef
typedef
struct data { int dia; int mes; int ano; };Declarando uma estrutura utilizando
Declarando uma estrutura utilizando
typedef
typedef
❖ O uso mais comum de typedefO uso mais comum de typedef é com estruturas é com estruturas
de dados, pois evita que a palavra-chave
de dados, pois evita que a palavra-chave structstruct
tenha de ser colocada toda vez que uma
tenha de ser colocada toda vez que uma
estrutura é declarada.
estrutura é declarada.
struct data dia_de_hoje; TData dia_de_hoje;
<nome_da_variável>
<nome_da_variável>..<campo><campo>
Acessando os campos de uma estrutura
Acessando os campos de uma estrutura
102
❖
Podemos acessar individualmente
Podemos acessar
individualmente
os
os
campos de uma determinada estrutura
campos de uma determinada estrutura
como se fossem variáveis comuns.
como se fossem variáveis comuns.
❖
A sintaxe para acessar
A sintaxe para
acessar
e manipular
e
manipular
campos de estruturas é a seguinte:
campos de estruturas é a seguinte:
printf (“Digite o nome do aluno: ”); scanf (“%s”, aluno.nome);
printf (“Digite a idade do aluno: ”); scanf (“%d”, &aluno.idade);
❖ A leitura dos campos de uma estrutura a partir A leitura dos campos de uma estrutura a partir
do teclado deve ser feita campo a campo, como
do teclado deve ser feita campo a campo, como
se fosse variáveis independentes.
se fosse variáveis independentes.
Leitura dos campos de uma estrutura
❖ Um campo de uma estrutura pode ser uma outra Um campo de uma estrutura pode ser uma outra
estrutura.
estrutura.
❖ Quando isso ocorre, temos uma estrutura Quando isso ocorre, temos uma estrutura aninhada
aninhada..
❖ O padrão ANSI C especifica que as estruturas O padrão ANSI C especifica que as estruturas
podem ser aninhadas até
podem ser aninhadas até 15 níveis15 níveis, mas a , mas a maioria dos compiladores permite mais.
maioria dos compiladores permite mais.
Estruturas aninhadas
Estruturas aninhadas
Ponteiros para estruturas
Ponteiros para estruturas
❖ Como outros tipos de dados, ponteiros para Como outros tipos de dados, ponteiros para
estruturas são declarados colocando-se o
estruturas são declarados colocando-se o
operador
operador * * na frente do nome da variável na frente do nome da variável estrutura:
estrutura:
struct data *ap_ontem; TData *ap_amanha;
Ponteiros para estruturas
Ponteiros para estruturas
104
❖
Para acessar uma estrutura com ponteiros
Para acessar uma estrutura com ponteiros
pode-se usar duas sintaxes:
pode-se usar duas sintaxes:
◗ Operador ponto:Operador ponto:
◗ Operador seta:Operador seta:
(*<ponteiro_estrutura>).<campo>
Vetor de estruturas
Vetor de estruturas
105
❖ Usado quando precisamos de diversas cópias de Usado quando precisamos de diversas cópias de
uma estrutura.
uma estrutura.
❖ Por exemplo, cada cliente de uma locadora de Por exemplo, cada cliente de uma locadora de
vídeo constitui um elemento de um vetor, cujo
vídeo constitui um elemento de um vetor, cujo
tipo é uma estrutura de dados que define as
tipo é uma estrutura de dados que define as
características de cada cliente.
características de cada cliente.
struct
Passando estruturas para funções
Passando estruturas para funções
❖ Podemos passar estruturas inteiras ou apenas Podemos passar estruturas inteiras ou apenas campos
campos destas como argumento para funções ou destas como argumento para funções ou procedimentos.
procedimentos.
❖ Tal passagem pode ser realizada por valorTal passagem pode ser realizada por valor ou por ou por referência
referência..
❖ As estruturas manipuladas por mais de uma As estruturas manipuladas por mais de uma
função devem ser declaradas globalmente,
função devem ser declaradas globalmente, antesantes
da definição da função.
Passando estruturas para funções
Passando estruturas para funções
:: Passando
:: Passando
campos por valor
campos por valor
❖ Este processo é realizado da mesma forma que Este processo é realizado da mesma forma que para variáveis simples
para variáveis simples, atentando-se para as , atentando-se para as peculiaridades das estruturas de dados.
peculiaridades das estruturas de dados.
106
// Chamada
funcao(estrutura.campo, ...); // Definicao formal
Passando estruturas para funções
Passando estruturas para funções
:: Passando
:: Passando
campos por referência
campos por referência
❖ Da mesma forma que acontece para variáveis Da mesma forma que acontece para variáveis
simples, deve-se pôr o operador
simples, deve-se pôr o operador && antes do nome antes do nome da estrutura na chamada da função.
da estrutura na chamada da função.
107
// Chamada
funcao(&estrutura.campo, ...); // Definicao formal
Passando estruturas para funções
Passando estruturas para funções
:: Passando
:: Passando
estruturas inteiras por valor
estruturas inteiras por valor
❖ Ao contrário de arrays, estruturas podem ser Ao contrário de arrays, estruturas podem ser
passadas
passadas por valorpor valor como argumentos de função. como argumentos de função.
❖ Para estruturas grandes, há o problema da cópia Para estruturas grandes, há o problema da cópia
de valores na pilha de memória.
de valores na pilha de memória.
108
// Chamada
funcao(estrutura, ...); // Definicao formal
Passando estruturas para funções
Passando estruturas para funções
:: Passando
:: Passando
estruturas inteiras por
estruturas inteiras por
referência
referência
❖ Permite alteração da estrutura sem necessidade Permite alteração da estrutura sem necessidade
de criação de uma cópia na memória.
de criação de uma cópia na memória.
109
// Chamada
funcao(&estrutura, ...); // Definicao formal
Passando estruturas para funções
Passando estruturas para funções
:: Passando
:: Passando
vetor de estruturas
vetor de estruturas
❖ Funciona de forma semelhante a vetor de Funciona de forma semelhante a vetor de
variáveis simples.
variáveis simples.
❖ Permite apenas passagem de parâmetros por Permite apenas passagem de parâmetros por
referência, pois trata-se, afinal, de um vetor.
referência, pois trata-se, afinal, de um vetor.
110
// Chamada
funcao(vetor, ...); // Definicao formal