You are on page 1of 26

ndice i

ndice
ndice
Captulo 1 - Introduo
1. Estruturas na linguagem C .................................................................. 1
1.1. A necessidade de utilizar Estruturas .................................................. 1
1.2. Definio de estrutura ................................................................... 1
1.3. Como aceder aos campos de uma estrutura.......................................... 2
1.4. Iniciar uma Estrutura .................................................................... 3
1.5. Atribuio de estruturas ................................................................ 3
2. Ponteiros/apontadores em C ............................................................... 4
2.1. ari!"eis est!ticas e "ari!"eis din#micas ............................................. 4
2.2. $onteiros .................................................................................. 4
2.3. $onteiros para estruturas ............................................................... 5
2.4. Dia%ramas ................................................................................. 5
2.5. &otao na lin%ua%em C ................................................................. '
2.'. $onteiro para um tipo de dados ........................................................ '
2.(. Criar e destruir "ari!"eis din#micas ................................................... '
2.). $onteiros &*++ ........................................................................... (
2.,. Apontador e apontado ................................................................... )
2.1-. .estri/es ao uso de "ari!"eis ponteiro ............................................. )
ii ndice
ndice
3. em!ria din"mica ............................................................................ #
3.1. 0em1ria est!tica ......................................................................... ,
3.2. 0em1ria din#mica ....................................................................... 11
3.2.1. A funo sizeof e o operador cast ............................................... 12
3.2.2. A funo calloc ..................................................................... 12
3.2.3. A funo malloc .................................................................... 13
3.2.4. A funo realloc .................................................................... 14
3.2.5. A funo free ....................................................................... 14
3.3. E2emplo ................................................................................... 14
4. $lgoritmos recursi%os ...................................................................... 21
4.1. 3b4eti"o .................................................................................. 21
4.2. Estrat5%ia 6para a construo de solu/es recursi"as7 ............................. 22
4.3. E2erc8cios ................................................................................. 23
&. Estruturas de 'ados ........................................................................ 23
5.1. Definio .................................................................................. 23
5.2. Estruturas Abstratas de Dados ......................................................... 24
Estruturas na linguagem C 1
Cap. 1 - Introduo
Captulo 1 ( Introduo
1. Estruturas na linguagem C
1.1. $ necessidade de utili)ar Estruturas
A estrutura 5 o conceito mais poderoso nas estruturas de dados e na lin%ua%em C.
9uando se pretende or%anizar um con4unto de dados do mesmo tipo: utiliza;se um <arra=>.
&o entanto: ?uando os dados no so do mesmo tipo e se pretende or%anizar os dados
numa cadeia de elementos: isso torna;se mais comple2o e muito ineficiente.
$or e2emplo: num @tand de autom1"eis usados: cada autom1"el tem associado um
con4unto de informao: tal comoA modelo: nome do fabricante: ano de fabrico: nome e
telefone do propriet!rio. &este caso: pode;se or%anizar cada um destes tipos de
informao utilizando um <arra=>: o ?ue torna o problema dif8cil: ineficiente e comple2o
de tratar.
Em resumo: B! a necessidade de utilizar mais con"eniente: ele%ante: eficiente e
coleti"amente: os dados de diferentes tipos como um %rupo. Isto 5 o ob4eti"o ?ue se
pretende atin%ir com o mecanismo da estrutura. As estruturas so muito Cteis: no s1
por?ue cont5m diferentes tipos de dados: mas tamb5m por?ue podem formar muitas
estruturas de dados comple2as: tais como listas li%adas: !r"ores: %r!ficos e bases de dados.
1.2. 'e*inio de estrutura
&a lin%ua%em C: uma estrutura 5 um con4unto de "ari!"eis referenciadas por um
nome: fornecendo uma maneira con"eniente de se ter informa/es relacionadas e
a%rupadas. *ma definio de estrutura forma um modelo ?ue pode ser utilizado para criar
"ari!"eis de estruturas. As "ari!"eis ?ue constituem a estrutura desi%nam;se por campos
6ou elementos7 da estrutura.
2 Estruturas na linguagem C
Cap. 1 - Introduo
A forma %eral de uma definio de estrutura 5 a se%uinteA
struct nome_estrutura D
tipoE1 campoE1F
tipoE2 campoE2F
...
tipoE& campoE&F
G variveis_estruturaF
onde nome_estrutura e variveis_estrutura podem ser omitidos: mas no ambos.
&ormalmente omite;se a declarao de variveis_estrutura.
*ma outra maneira de criar uma estrutura 5 definindo;a como um tipo 6utilizando
typedef7: da se%uinte formaA
t+pede* struct D
tipoE1 campoE1F
tipoE2 campoE2F
...
tipoE& campoE&F
G nome_tipo_estruturaF
A partir de uma definio de tipo de estrutura: esta pode ser utilizada tal como os tipos
Babituais 6int: float: cBar: H7.
A lin%ua%em C permite definir e2plicitamente no"os nomes aos tipos de dados:
utilizando a pala"ra;cBa"e t+pede*. A forma %eral de um comando typedef 5 o se%uinteA
t+pede* tipo nome;
onde tipo 5 ?ual?uer tipo de dados permitido e nome 5 o no"o nome para esse tipo.
1.3. Como aceder aos campos de uma estrutura
3 acesso a cada uma dos campos duma estrutura 5 feito atra"5s da combinao do
nome duma "ari!"el do tipo estrutura e do campo ?ue se pretende aceder: separados por
um ponto 6.7. Isto 5:
varivel_estrutura.campo
@e um campo representa um elemento estruturado 6<arra=>7: ento os elementos
desse campo podem ser acedidos incluindo os 8ndices na desi%nao de campo. $or
e2emplo: se um campo representa um <arra=> de 1 dimenso 6"etor7: um seu elemento
pode ser acedido pela e2presso
varivel_estrutura.campo[ndice]
Estruturas na linguagem C 3
Cap. 1 - Introduo
@e: por e2emplo: um campo representa um <arra=> de 2 dimens/es 6matriz7: um seu
elemento pode ser acedido pela e2presso
varivel_estrutura.campo[linha][coluna]
Identicamente: se um campo representa uma estrutura: um elemento dessa estrutura
pode ser acedido pela e2presso
varivel_estrutura.campo.subcampo
onde subcampo refere;se a um campo dentro dessa estrutura.
@e definir;se uma tabela unidimensional 6"etor7 cu4os elementos se4am estruturas: a
acesso a uma dessas estruturas 5 feito atra"5s da se%uinte formaA
tabela[ndice]
e o acesso a um determinado campo 5 feito da se%uinte formaA
tabela[ndice].campo
,otaA 3s campos de uma estrutura podem ser utilizados da mesma forma ?ue as "ari!"eis
normais. As caracter8sticas particulares ?ue se aplicam a cada campo so determinadas
pelo seu tipo.
1.4. Iniciar uma Estrutura
Iniciar uma estrutura implica atribuir "alores iniciais aos campos da estrutura. &o
entanto: de"e ter;se presente os tipos e a ordem dos campos pela ?ual esto declarados na
estrutura. Desta forma: os tipos e os "alores tero ?ue se assemelBar.
E2emploA
t+pede* struct D
int &F
*loat IF
G .e%istoF
.e%isto A J D 25: 2.( GF
Iniciar! implicitamente
A.& J 25 e A.I J 2.(
1.&. $tri-uio de estruturas
A atribuio de estruturas 5 uma caracter8stica importante da lin%ua%em C. K poss8"el
atribuir o "alor de uma "ari!"el do tipo estrutura a uma outra "ari!"el do tipo estrutura:
desde ?ue ambas se4am do mesmo tipo de estrutura. Isto na realidade atribui os "alores
4 Ponteiros/apontadores em C
Cap. 1 - Introduo
dos campos de uma "ari!"el do tipo estrutura aos correspondentes campos da outra
"ari!"el do tipo estrutura.
E2emploA
.e%isto A J D 25: 2.( G: L J AF
$roduz o se%uinteA
L.& J 25 e L.I J 2.(
2. Ponteiros/apontadores em C
2.1. .ari/%eis est/ticas e %ari/%eis din"micas
$odem ser usadas duas "ariedades de "ari!"eis durante a e2ecuo de um pro%rama
em lin%ua%em CA "ari!"eis est!ticas e "ari!"eis din#micas.
As variveis estticas so declaradas durante a escrita do pro%rama. 3 espao para
elas e2iste en?uanto o pro%rama em ?ue so declaradas esti"er a ser e2ecutado.
As variveis dinmicas so criadas 6e destru8das7 durante a e2ecuo do pro%rama.
Como s1 e2istem en?uanto o pro%rama esti"er a ser e2ecutado: no se lBes pode atribuir
um nome durante a escrita do pro%rama. A Cnica forma de referenciar uma "ari!"el
din#mica 5 usar um ponteiro.
Ap1s ser criada: a "ari!"el din#mica pode conter dados e possuir um tipo tal como
?ual?uer outra "ari!"el. $ode;se ento falar em criar uma "ari!"el din#mica do tipo x e
estabelecer um ponteiro ?ue aponta para ela: ou em mo"er um ponteiro de uma "ari!"el
din#mica do tipo x para outra 6do mesmo tipo7 ou em de"ol"er ao sistema o espao
ocupado por uma "ari!"el din#mica.
As "ari!"eis est!ticas no podem ser criadas ou destru8das durante a e2ecuo do
pro%rama e os ponteiros no podem ser usados para apontar para "ari!"eis est!ticas. As
"ari!"eis est!ticas so referenciadas usando o seu nome.
2.2. Ponteiros
*m ponteiro 6pointer7 tamb5m desi%nado por lin ou reference 5 uma "ari!"el ?ue
indica a localizao de outra "ari!"el 6normalmente uma estrutura contendo dados7. *m
ponteiro 5 uma "ari!"el cu4o "alor 5 um endereo de uma "ari!"el din#mica de um
determinado tipo. *m ponteiro cont5m uma referMncia para o endereo de uma c5lula de
mem1ria ?ue cont5m um elemento.
Ponteiros/apontadores em C &
Cap. 1 - Introduo
@e for usado um ponteiro para localizar uma estrutura ento no 5 preciso estar;se
preocupado onde este est! atualmente armazenado: pois usando o ponteiro: o sistema
computacional pode localizar a estrutura ?uando for necess!rio.
2.3. Ponteiros para estruturas
A lin%ua%em C permite ponteiros para estruturas e2atamente como o permite para
outros tipos de "ari!"eis. Nal como nos casos comuns: declara;se um ponteiro para uma
estrutura colocando um asterisco 6O7 antes do nome da "ari!"el de estrutura e depois do
nome desta: da se%uinte formaA
struct nome_estrutura OponteiroF
$ara se aceder a um campo da "ari!"el apontada pelo apontador: faz;se o se%uinteA
!"ponteiro#.campo ou ponteirocampo
2.4. 'iagramas
3s ponteiros so %eralmente desenBados como setas e as estruturas como ret#n%ulos.

r

ALE+

s



.*I
,011
t


u

A&A E0A

v



2igura 1 - Ponteiros para estruturas.
&o dia%rama da Pi%ura 1: r 5 um ponteiro para o re%isto <ALE+> e v 5 um ponteiro
para o re%isto <E0A>. Como se pode obser"ar o uso de ponteiros 5 muito fle28"el. Dois
ponteiros podem referenciar o mesmo re%isto: como t e u: ou um ponteiro pode mesmo
no referenciar re%isto al%um. Esta Cltima situao 5 representada pelo smbolo $%&&
como 5 mostrado para o ponteiro s. De"e;se ter muito cuidado na manipulao de
3 Ponteiros/apontadores em C
Cap. 1 - Introduo
ponteiros para no se perder nenBum re%isto. &a fi%ura o re%isto <.*I> foi perdido: sem
nenBum ponteiro a referenci!;lo: no Ba"endo portanto nenBuma forma de o encontrar.
2.&. ,otao na linguagem C
@e $odo denotar o tipo dos itens em ?ue se est! interessado: ento pode;se declarar
um tipo de ponteiro para ob4etos do tipo $odo com a declarao se%uinteA
t+pede* &odo O$&odoF
o ?ue si%nifica ?ue uma "ari!"el do tipo $&odo 5 um ponteiro para uma "ari!"el do tipo
&odo. 3 tipo $odo ?ue o ponteiro refere pode ser arbitr!rio mas: em muitas aplica/es: 5
uma estrutura. Nal como para ?ual?uer outro tipo de dados podem ser declaradas "ari!"eis
do tipo '$odo. Estas "ari!"eis apontam para "ari!"eis din#micas do tipo $odo.
2.3. Ponteiro para um tipo de dados
Cada ponteiro est! limitado ao tipo de "ari!"el para a ?ual ele aponta. 3 mesmo
ponteiro nunca pode ser usado para apontar para "ari!"eis de tipos diferentes. As "ari!"eis
ponteiro de tipos diferentes no podem ser misturadas umas com as outras.
A lin%ua%em C permite atribui/es entre duas "ari!"eis ponteiro apenas do mesmo
tipo: mas no entre de tipos diferentes. $or e2emplo: para as se%uintes declara/esA
,odo O$: O9F
int OA: OLF
as atribui/es $ J 9 e A J L so corretas: mas a atribuio $ J A no 5 correta.
2.4. Criar e destruir %ari/%eis din"micas
A criao e destruio de "ari!"eis din#micas so feitas usando fun/es padro. @e P
for uma "ari!"el declarada como um ponteiro para o tipo $odo 6P 5 uma "ari!"el do tipo
'$odo7: ento a funoA
ne56$7F
cria uma no"a "ari!"el din#mica do tipo $odo e atribui a sua localizao ao ponteiro P 6isto
5: coloca em P o endereo dessa "ari!"el7.
De modo similarA
*ree6$7F
de"ol"e o espao usado pela "ari!"el ao sistema. Al%uns sistemas perdem o espao e nunca
mais o reutilizam: o ?ue si%nifica ?ue e2iste um mau entendimento entre estas instru/es e
o @istema 3perati"o.
Ponteiros/apontadores em C 4
Cap. 1 - Introduo
,011
$ J &*++ F '




ne56$7 F '



$ J QA&AR F '

A&A

*ree6$7 F '

SSS A&A

2igura 2 - Criar e destruir %ari/%eis din"micas.
Depois da funo free!'# ser in"ocado: a "ari!"el ponteiro P fica indefinida: donde
no pode ser usada 6le%almente7 at5 lBe ser atribu8do um no"o "alor. Estas a/es esto
ilustradas na (i)ura *.
2.6. Ponteiros ,011
Em certas situa/es pretende;se ?ue um ponteiro no referencie ?ual?uer "ari!"el
din#mica. Esta situao pode ser estabelecida pela atribuioA
$ J &*++F
Depois pode ser efetuado um teste ao seu estadoA
i* 6$ TJ &*++7
A pala"ra ,011 5 uma pala"ra reser"ada na lin%ua%em C: sendo usada como uma
constante para os dados do tipo ponteiro.
&ote;se a distino entre uma "ari!"el ponteiro cu4o "alor 5 indefinido e uma "ari!"el
ponteiro cu4o "alor 5 $%&&A a assero $ J &*++ si%nifica ?ue P atualmente no aponta
para nenBuma "ari!"el din#mica. @e o "alor de P 5 indefinido ento P pode apontar para
?ual?uer posio aleat1ria na mem1ria.
Nal como para todas as outras "ari!"eis: ?uando comea a e2ecuo do pro%rama: o
"alor das "ari!"eis ponteiro 5 indefinido. Antes de P poder ser usado 5 necess!ria uma
cBamada a ne56$7 ou uma atribuio tal como $ J 9 ou $ J &*++. Depois de uma cBamada
a *ree6$7: o "alor de P fica indefinido: donde de"e;se fazer imediatamente $ J &*++ para
se ter a certeza ?ue P no 5 usado com um "alor indefinido.
6 Ponteiros/apontadores em C
Cap. 1 - Introduo
2.#. $pontador e apontado
A notao O$ denota a "ari!"el para a ?ual P aponta. Esta notao pode parecer um
pouco confusa: mas a sua l1%ica torna;se clara se ti"er em mente ?ue O si%nifica aponta.
Donde a declaraoA
,odo O$F
indica ?ue P aponta para um elemento do tipo $odo e *P + o elemento apontado por P.
2.17. 8estri9es ao uso de %ari/%eis ponteiro
3 Cnico uso de "ari!"eis do tipo '$odo 5 para encontrar a localizao de "ari!"eis do
tipo $odo. As "ari!"eis ponteiro podem participar em instru/es de atribuio: podem ser
testadas por i%ualdade e podem aparecer 6como par#metros7 em cBamadas de
subpro%ramas: mas no podem aparecer em ?ual?uer outro lu%ar.
&ote ?ue as restri/es no uso de ponteiros no se aplicam Us "ari!"eis din#micas ?ue
eles referem. @e P 5 um ponteiro ento O$ no 5 normalmente um ponteiro 6contudo 5
le%al um ponteiro apontar para outro ponteiro7: mas sim uma "ari!"el do tipo $odo e
portanto O$ pode ser usado em ?ual?uer utilizao le%8tima para o tipo $odo.

$ J QA&AR '

A&A O$

9 J Q.*IR ,

.*I O9
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
'

A&A O$
$ J 9
,

.*I O9
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
'

.*I O$
O$ J O9
,

.*I O9

2igura 3 - $tri-ui9es de %ari/%eis ponteiro.
&o ?ue respeita a instru/es de atribuio 5 importante lembrar a diferena entre
$ J 9 e O$ J O9. Embora ambas se4am corretas 6desde ?ue ' e , apontem para o mesmo tipo
em!ria din"mica #
Cap. 1 - Introduo
de dados7 possuem si%nificados diferentes. A primeira refere;se aos ponteiros e a se%unda
aos conteCdos apontados pelos ponteiros. A (i)ura - ilustra estas atribui/es.
A primeira instruo faz com ?ue ' aponte para o mesmo ob4eto ?ue o ponteiro , mas
no altera o "alor de nenBum dos ob4etos apontados. 3 ob4eto apontado por ' 5 perdido 6a
no ser ?ue Ba4a al%uma outra "ari!"el ponteiro ?ue ainda o referencie7.
A se%unda instruo: O$ J O9: copia o "alor do ob4eto O9 para o ob4eto O$: donde os
dois ob4etos ficam com o mesmo "alor: com ' e , a apontarem para as duas c1pias
separadamente.
Pinalmente: as instru/es de atribuio $ J O9 e O$ J 9 en"ol"em tipos de dados
diferentes: donde ambas so ile%ais 6e2ceto se tanto ' como , serem ponteiros para
ponteiros do mesmo tipo7.
3. em!ria din"mica
3.1. em!ria est/tica
As "ari!"eis locais Us fun/es so sucessi"amente criadas e libertadas numa zona de
mem1ria do processo desi%nada pilBa 6stac7. 9uando uma funo 5 cBamada: a zona da
pilBa cresce para criar local para as no"as "ari!"eis locais: ?uando uma funo retorna a
zona da pilBa decresce na mesma proporo. A declarao de "ari!"eis em fun/es le"a a
?ue se4am reser"ados "!rios endereos de mem1ria na zona da pilBa 6"ari!"eis locais7: as
?uais so libertadas lo%o ap1s o t5rmino funo onde esto declaradas.
Considere;se o se%uinte e2emploA
%oid 1er.etor :; <
int V3---W: &F
do D
printf 6<& J S>7F
scanf 6<Xd>: Y&7F
G ZBile 66& [ -7 \\ 6& ] 3---7F
for 6i J -F i [ &: i^^7 D
printf 6<Insira um inteiroA <7F
scanf 6<Xd>: YViW7F
G
=
17 em!ria din"mica
Cap. 1 - Introduo
_include [stdio.B]
Int main:; <
+eretor67F
return 1F
=
A declarao de "ari!"eis ?ue consta na funo LerVetor anterior 6int .>3777?@ ,A7
le"a a ?ue se4a reser"ada "!rios endereos de mem1ria na zona da pilBa. $ara a "ari!"el &
5 escolBido um local 6endereo7 ?ual?uer na pilBa: en?uanto os elementos do "etor so
reser"ados um con4unto 6bloco7 de 3--- endereos cont8%uos 6zona preencBida na fi%ura
?ue se se%ue7 e um endereo ao ?ual 5 atribu8do o endereo do primeiro elemento de :
V-W.

Com a e2ecuo da instruo do./hile da funo: suponBa;se ?ue 5 introduzido: por
e2emplo: o "alor 2--- para a "ari!"el &F isto si%nifica ?ue dos 3--- elementos do "etor
reser"ados apenas 2--- sero usados 6pois & ser"e como tamanBo real do "etor 7. Com a
e2ecuo da instruo for da funo iro ser atribu8dos "alores para os primeiros 2---
elementos do "etor ?ue: suponBa;se serem os apresentados na fi%ura se%uinte. Desta
forma: e2iste um con4unto de endereos aos ?uais no foram atribu8dos "alores: mas ?ue
se encontram reser"ados 6desperd8cio de mem1ria7.
em!ria din"mica 11
Cap. 1 - Introduo

Com a e2ecuo do pro%rama principal 6main7: ?uando a funo de"ol"e o controlo
para o pro%rama todas as "ari!"eis da funo +eretor so libertadas para o sistema
operati"o.
3.2. em!ria din"mica
A lin%ua%em C permite a criao din#mica de mem1ria U medida das necessidades do
pro%rama. A mem1ria din#mica 5 %erida numa zona especial da mem1ria desi%nada heap e
5 permanente: no sentido em ?ue no depende da ati"ao`desati"ao de fun/es ou
blocos de pro%rama: podendo ser libertada pelo pro%rama ?uando a sua utilizao dei2a de
ser necess!ria.
A mem1ria din#mica pode e"itar: por e2emplo: o sobredimensionamento de "etores:
permitindo a sua criao U medida das reais necessidades do pro%rama.
E2istem "!rias fun/es ?ue so usadas para %erir a mem1ria din#micaA calloc: malloc:
realloc e free. &a utilizao de al%umas destas fun/es so utilizados com muita fre?uMncia
a funo sizeof e o operador cast.
12 em!ria din"mica
Cap. 1 - Introduo
3.2.1. $ *uno sizeof e o operador cast
A funo si)eo*:; de"ol"e a dimenso do tipo especiacado: %eralmente em nCmero de
b=tesF por e2emplo: sizeof6int7 J 2 si%nifica ?ue cada "alor do tipo inteiro ocupa 2 b=tes de
mem1ria.
Al%umas fun/es de"ol"em um apontador %en5rico 6formalmente: do tipo void"7. A
sua con"erso para o tipo dese4ado efetua;se por meio de um operador de cast. &ote;se
?ue a operao de cast pode ser realizada entre tipos incompat8"eis 6por e2emplo: inteiro
e apontador: inteiro e real7: mas o resultado pode ser dependente do processador.
3.2.2. $ *uno calloc
A sinta2e da funo calloc 5 a se%uinteA
%oid Bcalloc :si)eCt nmem-@ si)eCt si)e;A
a ?ual
; reser"a um bloco de mem1ria cont8%ua com espao suficiente para armazenar nmemb
elementos de dimenso size cadaF
; de"ol"e o endereo 6apontador7 para a primeira posio do bloco ou NULL ?uando no
for poss8"el alocar mem1riaF
; size_t 5 o tipo utilizado para especificar as dimens/es num5ricas em "!rias fun/esF
; o tipo de retorno void * corresponde a um endereo %en5rico de mem1ria 6permite a
utilizao por todo o tipo de ponteiro7F
; todas as posi/es do bloco de mem1ria so inicializadas com zero.
Considere;se o se%uinte e2emploA
*loat BpA
p D :*loat B; calloc :2777@ si)eo* :*loat;;A
o ?ual
; reser"a de mem1ria para um bloco de 2000 reaisF
; a partir da?ui: p pode ser tratado como um "etor de 2000 posi/es 6para 2000 "alores
reais7F
; p 5 um ponteiro para o primeiro elemento do "etorF
; sizeof( 5 um operador ?ue de"ol"e a dimenso 6em %eral: em b=tes7 do tipo ou
"ari!"el indicado no ar%umentoF
; (float * funciona como um operador de cast 6obri%a a de"ol"er um ponteiro para um
real7.
em!ria din"mica 13
Cap. 1 - Introduo
A fi%ura se%uinte ilustra o ?ue se passa ao n8"el da mem1ria com a e2ecuo do
e2emplo anterior. A "ari!"el p 5 local 6%uarda o endereo do primeiro elemento do "etor
p7: lo%o a mem1ria reser"ada para si encontra;se na zona da pilha. A mem1ria reser"ada
para os elementos do "etor p 6pV-W: pV1W: ...: pV1,,,W ou Op: O6p^17: ...: O6p^1,,,77 so
reser"ados na zona do heap: pois so "ari!"eis din#micas.

3.2.3. $ *uno malloc
A sinta2e da funo mallos 5 a se%uinteA
%oid Bmalloc :si)eCt totalCsi)e;A
a ?ual
; reser"a um bloco de mem1ria cont8%ua de dimenso total_size e2pressa em b=tesF
; de"ol"e o endereo 6ponteiro7 para a primeira posio do bloco ou NULL ?uando no
for poss8"el alocar mem1riaF
; size_t 5 o tipo utilizado para especificar as dimens/es num5ricas em "!rias fun/esF
; o tipo de retorno void * corresponde a um endereo %en5rico de mem1ria 6permite a
utilizao por todo o tipo de ponteiro7F
; calloc(n!d pode ser simplesmente substitu8do por malloc(n*dF
; as posi/es do bloco no so inicializadas com ?ual?uer "alor.
14 em!ria din"mica
Cap. 1 - Introduo
3.2.4. $ *uno realloc
A sinta2e da funo realloc 5 a se%uinteA
%oid Brealloc :%oid Bptr@ si)eCt totalCne5Csi)e;A
na ?ual
; ptr 5 o ponteiro para o bloco de mem1ria reser"ado antesF
; total_ne"_size 5 a dimenso total ?ue se pretende a%ora para o mesmo blocoF
; retorna um apontador para o bloco de mem1ria redimensionadoF
; o se%undo ar%umento 6size_t total_ne/_size7 tem um si%nificado semelBante ao da
funo malloc 6size_t total_size7.
3.2.&. $ *uno *ree
A sinta2e da funo free 5 a se%uinteA
%oid B*ree :%oid Bptr;A
na ?ual
; ptr 5 o ponteiro para o bloco de mem1ria reser"ado antes: o ?ual foi de"ol"ido por
malloc: calloc ou realloc.
3.3. EEemplo
Considere;se o se%uinte e2emploA
int Op: &F
do D
printf 6<Insira a dimenso do "ectorA <7F
scanf 6<Xd>: Y&7F
G ZBile 6& [ -7F
p J 6int O7 malloc 6& O sizeof 6int77F
for 6i J -F i [ &F i^^7 D
printf 6<Inserir um "alor inteiroA <7F
scanf 6<Xd>: YpViW7F
G
p J 6int O7 realloc 6p: 6&^1---7 O sizeof 6int77F
free 6p7F
Considere;se a an!lise: e ilustrao atra"5s de es?uemas: do resultado da e2ecuo
de cada subcon4unto de instru/es do bloco anterior: ?ue se se%ue.
em!ria din"mica 1&
Cap. 1 - Introduo
int Bp@ ,A

do <
print* :FInsira a dimenso do %etorG F;A
scan* :FHdI@ J,;A
= 5Kile :, L 7;A `` por e2emplo: & J 2---
p D :int B; malloc :, B si)eo* :int;;A


13 em!ria din"mica
Cap. 1 - Introduo
*or :i D 7A i L ,A iMM; <
print*:FInserir um %alor inteiroG F;A
scan*:FHdI@ Jp>i?;A
=

em!ria din"mica 14
Cap. 1 - Introduo
p D :int B; realloc :p@ :,M1777; B si)eo* :int;;A
1b casoA a zona imediatamente a se%uir ao Cltimo elemento de p est! "azia e pode
receber os 1--- elementos adicionais.

2b casoA a zona imediatamente a se%uir ao Cltimo elemento de p est! ocupada e no
pode receber os 1--- elementos adicionais.

16 em!ria din"mica
Cap. 1 - Introduo
2b caso 6cont7A como a zona imediatamente a se%uir ao Cltimo elemento de p no pode
receber os 1--- elementos adicionais: todo o "etor ter! ?ue ser realocado para uma
zona ?ue possa receber os 3--- elementos.

em!ria din"mica 1#
Cap. 1 - Introduo
*ree :p;A
3 bloco de mem1ria reser"ado para todo o "etor p 5 libertado.


Considere;se o mesmo e2emplo nas "ers/es com mem1ria est!tica e mem1ria din#mica.
_include [stdio.B]
main :; <
int V3---W: &F
do D
printf 6<& J S>7F
scanf 6<Xd>: Y&7F
G ZBile 66& [ -7 \\ 6& ] 3---7F
for 6i J -F i [ &: i^^7 D
printf 6<Insira um inteiroA <7F
scanf 6<Xd>: YViW7F
G
=
_include [stdio.B]
_include [stdlib.B]
int main :; <
int O: &F
do D
printf 6<& J S>7F
scanf 6<Xd>: Y&7F
G ZBile 6& [ -7F
J 6intO7 malloc 6&Osizeof 6int77F
if 6 JJ &*++7
return 1F
for 6i J -F i [ &: i^^7 D
printf 6<Insira um inteiroA <7F
scanf 6<Xd>: YViW7F
G
free 67F
=

27 em!ria din"mica
Cap. 1 - Introduo
9uando se usa mem1ria est!tica: 5 necess!rio reser"ar um %rande bloco de mem1ria:
mesmo parte dela no ser necess!ria.

9uando se usa mem1ria din#mica: a mem1ria apenas 5 reser"ada ?uando 5 necess!ria
e na ?uantidade e2ata.


$lgoritmos recursi%os 21
Cap. 1 - Introduo
4. $lgoritmos recursi%os
4.1. N-Oeti%o
3bter uma soluo para um problema atra"5s da soluo de outro com idMntica
natureza: mas de menor dimenso. A dimenso do problema 5 sucessi"amente reduzida at5
se atin%ir um caso especial cu4a soluo se4a imediata. Este caso especial denomina;se
0aso 1e)enerado. Considere;se o se%uinte e2emploA
$rocurar 6pala"ra: dicion!rio7
Pe dicion!rio est! na 1c p!%ina Ento
+ocalizar pala"ra
Peno
Abrir pr12imo do meio
Determinar a metade ?ue interessa
Pe pala"ra est! na 1c metade Ento
$rocurar 6pala"ra: 1c metade7
Peno
$rocurar 6pala"ra: 2c metade7
&a matem!tica: a funo fatorial de um inteiro no ne%ati"o 5 usualmente definida
pela f1rmula se%uinteA
nT J n 2 6n17 2 ... 2 1
As reticMncias presentes nesta f1rmula si%nificam <continuar na mesma forma>. $ara
calcular o fatorial 5 necess!ria uma definio mais precisa: como a se%uinteA

>
=
=
- n se 7T 1 n 6 n
- n se 1
T n
E2emploA 4T J 4 O 3T
J 4 O 63 O 2T7
J 4 O 63 O 62 O 1T77
J 4 O 63 O 62 O 61 O -T777
J 4 O 63 O 62 O 61 O 1777
J 4 O 63 O 62 O 177
J 4 O 63 O 27
J 4 O '
J 24
22 $lgoritmos recursi%os
Cap. 1 - Introduo
Estes c!lculos ilustram a essMncia do modo como a recurso funciona. *m m5todo
%eral para obter a resposta para um problema: 5 reduzir este a um ou mais problemas de
natureza idMntica: mas de menor dimenso. 3 mesmo m5todo 5 usado para estes
subproblemas. A recurso continua at5 ?ue a dimenso dos subproblemas se4a reduzido um
caso especial onde a soluo se4a obtida diretamente sem usar a recurso.
$or outras pala"ras: ?ual?uer processo recursi"o consiste de duas partesA
1. *m caso de%enerado: ?ue 5 tratado sem recursoF
2. *m m5todo %eral ?ue reduz o problema a um ou mais problemas menores:
fazendo com ?ue o processo a"ance at5 atin%ir o caso de%enerado.
E2emploA Dado um inteiro positi"o &: determinar o fatorial de & &T J & 2 6&17T
long *atorial :int ,; <
i* 6& JJ -7
return 1F
return & O fatorial6&;17F
=
Como se pode "er a partir deste e2emplo: a definio recursi"a e a soluo recursi"a
podem ser ambas concisas e ele%antes: mas os detalBes computacionais podem re?uerer
muitos c!lculos parciais antes do processo estar conclu8do.
K sempre importante "alidar as entradas. 0as de"er! esse c1di%o ser inclu8do no corpo
do subpro%rama: ou ser! melBor escre"er um outro subpro%rama ?ue "alide as entradas e
de se%uida in"ocar o subpro%rama recursi"o para fazer o trabalBo CtilS
4.2. EstratQgia :para a construo de solu9es recursi%as;
1. Definir o problema em termos de outro do mesmo tipo com menor dimenso.
2. Determinar a inst#ncia do problema ?ue ser"e como caso de%enerado`particular.
3. Estabelecer o modo como cada cBamada recursi"a diminui a dimenso do problema:
asse%urando ?ue o caso de%enerado 5 sempre atin%ido.
Estruturas de 'ados 23
Cap. 1 - Introduo
4.3. EEerccios
1. @ucesso de PibonacciA 1: 1: 2: 3. 5: ): 13: 21: H f6n7 J f6n;17 ^ f6n;27: n 3.
int *i-onacci :int ,; <
i* 6& [J 27
return 1F
return fibonacci6&;17 ^ fibonacci6&;27F
=
2. Determinar o m!2imo di"isor comum entre dois nCmeros inteiros positi"os.
int mdc :int a@ int -; <
i* 6b JJ -7
return aF
return mdc6b: aXb7F
=
3. $es?uisar um elemento num "etor: utilizando o al%oritmo da $es?uisa Lin!ria.
int PesRuisaSinaria :int Elem@ int in*@ int sup@ int .>?; <
int dF
i* 6sup [ inf7
return -F
d J 6sup^inf;17`2 ^ 1F
i* 6Elem JJ VdW7
return dF
i* 6Elem ] VdW7
return $es?uisaLinaria6Elem: d^1: sup: 7F
return $es?uisaLinaria6Elem: inf: d;1: 7F
=
&. Estruturas de 'ados
&.1. 'e*inio
*ma estrutura de dados 5 uma coleo de tipos de dados: composta por tipos no
estruturados b!sicos: tipos estruturados ou uma mistura de ambos os tipos: e um con4unto
de opera/es definidas sobre os tipos de dados.
24 Estruturas de 'ados
Cap. 1 - Introduo
$or outras pala"ras: uma estrutura de dados 5 composta por 3 partesA
1. *m con4unto de opera/esF
2. *ma estrutura de armazenamento especificando as classes de dados
relacionados e as cole/es de "ari!"eisF
3. *m con4unto de al%oritmos: uma para cada operao.
Cada al%oritmo procura e modifica a estrutura de armazenamento para alcanar o
resultado definido pela operao.
*m con4unto de "ari!"eis inteiras e o con4unto de opera/es aritm5ticas simples
6adio: subtrao: multiplicao: di"iso: ne%ao: "alor absoluto: etc.7 sobre elas 5 um
e2emplo de uma estrutura de dados b!sica.
E2istem 2 classes de estrutura de dados: ?ue esto relacionadas com o tamanBo do
armazenamento e2i%idoA
1. 2sttica !fixa#A estrutura cu4o tamanBo e atribuio de mem1ria associadas so
fi2adas a?uando da compilao do pro%ramaF
2. 1inmicaA estrutura cu4o tamanBo aumenta ou diminu8 consoante as necessidades
durante a e2ecuo do pro%rama: e em ?ue a localizao da mem1ria a si associada
poder! ser alterada.
&.2. Estruturas $-stratas de 'ados
*ma Estrutura Abstrata de Dados 6EAD7: muitas "ezes tamb5m referida como tipo
abstrato de dados 6ADN ; <Abstract Data N=pe>7: 5 um con4unto de opera/es sobre uma
coleo de dados armazenados. A definio funcional de uma EAD 5 independente da
estrutura de dados escolBida para a sua representao. 3u se4a: as opera/es a
implementar de"em ser aplicadas a ?ual?uer tipo de estrutura de dados.
A utilizao de EAD esconde os dados e d! Mnfase Us opera/es 6a/es7 sobre os
dados. A EAD esconde os dados como uma c!psula esconde o seu conteCdo. A EAD fornece
ao utilizador interfaces atra"5s das fun/es ?ue implementam as opera/es na EAD.
A representao interna dos dados: o armazenamento e a implementao das
opera/es sobre os dados so escondidos dos utilizadores: os ?uais acedem e manipulam os
dados. $or e2emplo: n1s usamos a EAD das opera/es aritm5ticas de inteiros ^: : O: etc.
sem conBecer como o inteiro 5 representado internamente num sistema computacional.
E2emplos de Estruturas Abstratas de Dados soA +istas: $ilBas: Pilas e er"ores.

You might also like