Você está na página 1de 152

CDIGO DE BARRAS

ISBN

Curso Tcnico em Informtica
Estrutura de Dados
Ndia Mendes dos Santos
Geraldo Nunes da Silva Jnior
Otlio Paulo da Silva Neto
Estrutura de Dados
Ndia Mendes dos Santos
Geraldo Nunes da Silva Jnior
Otlio Paulo da Silva Neto
2013
Teresina - PI
Presidncia da Repblica Federativa do Brasil
Ministrio da Educao
Secretaria de Educao a Distncia
Equipe de Elaborao
Instituto Federal de Educao, Cincia e Tecno-
logia do Piau IFPI
Coordenao do Curso
Thiago Alves Elias da Silva/IFPI
Professores-autores
Ndia Mendes dos Santos/IFPI
Geraldo Nunes da Silva Jnior/IFPI
Otlio Paulo da Silva Neto/IFPI
Comisso de Acompanhamento e Validao
Universidade Federal de Santa Catarina UFSC
Coordenao Institucional
Araci Hack Catapan/UFSC
Coordenao do Projeto
Silvia Modesto Nassar/UFSC
Coordenao de Design Instrucional
Beatriz Helena Dal Molin/UNIOESTE e UFSC
Coordenao de Design Grfco
Juliana Tonietto/UFSC
Design Instrucional
Eleonora Schlemper Mendona/UFSC
Gustavo Pereira Mateus/UFSC
Web Master
Rafaela Lunardi Comarella/UFSC
Web Design
Beatriz Wilges/UFSC
Mnica Nassar Machuca/UFSC
Diagramao
Brbara Zardo/UFSC
Roberto Colombo/UFSC
Projeto Grfco
e-Tec/MEC
Catalogao na fonte pela Biblioteca Universitria da
Universidade Federal de Santa Catarina
Instituto Federal de Educao, Cincia e Tecnologia do Piau
Este Caderno foi elaborado em parceria entre o Instituto Federal de Educao,
Cincia e Tecnologia do Piau e a Universidade Federal de Santa Catarina para a
Rede e-Tec Brasil.
S237e Santos, Ndia Mendes dos
Estrutura de dados / Ndia Mendes dos Santos,
Geraldo Nunes da Silva Jnior, Otlio Paulo da Silva Neto.
Teresina : Instituto Federal de Educao, Cincia e Tecnologia do
Piau, 2013.
150 p. : il., tabs.
Inclui bibliografa
1. Estruturas de dados (Computao). 2. Linguagem de
programao(Computadores). 3. Programao (Computadores). I.
Silva Jnior, Geraldo Nunes da. II. Silva Neto, Otlio Paulo da. III.
Ttulo.
CDU: 681.31:061.6
e-Tec Brasil 33
Apresentao e-Tec Brasil
Bem-vindo a Rede e-Tec Brasil!
Voc faz parte de uma rede nacional de ensino, que por sua vez constitui
uma das aes do Pronatec - Programa Nacional de Acesso ao Ensino Tc-
nico e Emprego. O Pronatec, institudo pela Lei n 12.513/2011, tem como
objetivo principal expandir, interiorizar e democratizar a oferta de cursos de
Educao Profssional e Tecnolgica (EPT) para a populao brasileira propi-
ciando caminho de o acesso mais rpido ao emprego.
neste mbito que as aes da Rede e-Tec Brasil promovem a parceria entre a
Secretaria de Educao Profssional e Tecnolgica (SETEC) e as instncias promo-
toras de ensino tcnico como os Institutos Federais, as Secretarias de Educao
dos Estados, as Universidades, as Escolas e Colgios Tecnolgicos e o Sistema S.
A educao a distncia no nosso pas, de dimenses continentais e grande
diversidade regional e cultural, longe de distanciar, aproxima as pessoas ao
garantir acesso educao de qualidade, e promover o fortalecimento da
formao de jovens moradores de regies distantes, geografcamente ou
economicamente, dos grandes centros.
A Rede e-Tec Brasil leva diversos cursos tcnicos a todas as regies do pas,
incentivando os estudantes a concluir o ensino mdio e realizar uma forma-
o e atualizao contnuas. Os cursos so ofertados pelas instituies de
educao profssional e o atendimento ao estudante realizado tanto nas
sedes das instituies quanto em suas unidades remotas, os polos.
Os parceiros da Rede e-Tec Brasil acreditam em uma educao profssional
qualifcada integradora do ensino mdio e educao tcnica, - capaz de
promover o cidado com capacidades para produzir, mas tambm com auto-
nomia diante das diferentes dimenses da realidade: cultural, social, familiar,
esportiva, poltica e tica.
Ns acreditamos em voc!
Desejamos sucesso na sua formao profssional!
Ministrio da Educao
Janeiro de 2013
Nosso contato
etecbrasil@mec.gov.br
e-Tec Brasil 5
Indicao de cones
Os cones so elementos grfcos utilizados para ampliar as formas de
linguagem e facilitar a organizao e a leitura hipertextual.
Ateno: indica pontos de maior relevncia no texto.
Saiba mais: oferece novas informaes que enriquecem o
assunto ou curiosidades e notcias recentes relacionadas ao
tema estudado.
Glossrio: indica a defnio de um termo, palavra ou expresso
utilizada no texto.
Mdias integradas: sempre que se desejar que os estudantes
desenvolvam atividades empregando diferentes mdias: vdeos,
flmes, jornais, ambiente AVEA e outras.
Atividades de aprendizagem: apresenta atividades em
diferentes nveis de aprendizagem para que o estudante possa
realiz-las e conferir o seu domnio do tema estudado.
e-Tec Brasil 7
Sumrio
Palavra do professor-autor 9
Apresentao da disciplina 11
Projeto instrucional 13
Aula 1 Introduo a linguagem de programao C 15
1.1 Apresentao 15
1.2 Introduo 15
1.3 Estrutura bsica de um programa em C 17
1.5 Viso geral: instrues de entrada e sada 17
1.6 Fundamentos em C 18
1.7 Comandos bsicos 19
1.8 Tipos de dados 22
1.9 Variveis 23
1.10 Operadores 25
1.11 Tomada de deciso 28
1.12 Laos 32
Aula 2 Funes, matrizes, ponteiros e arquivos 37
2.1 Funes 37
2.2 Matrizes 41
2.3 Ponteiros 43
2.4 Arquivos 46
Aula 3 Viso geral de estrutura de dados e lista linares 59
3.1 Introduo 59
3.2 Conceitos bsicos 59
Aula 4 Pilhas 97
4.1.Introduo 97
4.2.Pilha esttica 97
4.3. Pilha dinmica 102
Aula 5 Filas e rvores 111
5.1 Introduo fla 111
5.2 Fila esttica 113
5.3 Fila dinmica 119
5.4 Introduo rvore 126
5.5 rvore binria 128
Aula 6 Ordenao e pesquisa 135
6.1 Introduo ordenao 135
6.2 Mtodo da bolha ou bubblesort 136
6.3 Introduo pesquisa 141
6.4 Pesquisa sequencial 141
6.4 Pesquisa binria 144
Referncias 148
Currculo dos professores-autores 149
e-Tec Brasil 8
e-Tec Brasil 9
Palavra do professor-autor
Caro estudante!
Bem-vindo disciplina de Estrutura de Dados. O objetivo desta disciplina
apresentar a Linguagem de Programao C e os seus principais conceitos, bem
como uma viso geral acerca de Estrutura de Dados abordando Listas (pilhas,
flas) e rvores e uma introduo ordenao de dados, enfocando o Mtodo
da Bolha (BubbleSort) e estratgias de pesquisa, especifcamente Pesquisa Se-
quencial e Binria, conceitos, aplicaes e implementaes, na linguagem C.
Aproveite o curso e a disciplina, pesquise, troque informaes com seus co-
legas e tire dvidas com seu tutor, pois ele tem muito mais informaes para
compartilhar com voc.
Bons estudos!
Professores
Ndia Mendes dos Santos
Geraldo Nunes da Silva Jnior
Otlio Paulo da Silva Neto
e-Tec Brasil 11
Apresentao da disciplina
As estruturas de dados tm larga aplicao na computao em geral. Siste-
mas Operacionais e aplicativos as utilizam para vrias atividades importants-
simas, como gerenciamento de memria, execuo de processos, armazena-
mento e gerenciamento de dados no disco, etc.
As estruturas de dados defnem a organizao, mtodos de acesso e opes
de processamento para a informao manipulada pelo programa. A defni-
o da organizao interna de uma estrutura de dados tarefa do projetista
da estrutura, que defne tambm qual a API para a estrutura, ou seja, qual
o conjunto de procedimentos que podem ser usados para manipular os da-
dos na estrutura. esta API que determina a viso funcional da estrutura
de dados, que a nica informao relevante para um programador que v
utilizar uma estrutura de dados pr-defnida.
Portanto, no faltam motivos para um estudante da rea ou qualquer de-
senvolvedor/programador saberem a fundo e com funcia sobre o assunto.
e-Tec Brasil 13
Disciplina: Estrutura de Dados (carga horria: 90h).
Ementa: Estrutura de um programa em C. Constantes e Variveis; Operado-
res, Expresses e Funes; Entrada e Sada. Estruturas de Controle; Funes
e Procedimentos. Vetores e Registros; Ponteiros. Estrutura de Dados do Tipo
TADs: Listas Lineares Estticas e Dinmicas. Pilhas Estticas e Dinmicas. Filas
Estticas e Dinmicas. rvores: Binrias e Balanceadas. Algoritmos de Percur-
so. Ordenao e Pesquisa de Dados.
AULA
OBJETIVOS DE
APRENDIZAGEM
MATERIAIS
CARGA
HORRIA
(horas)
1. Introduo
linguagem de
programa-
o C
Conhecer e identicar a estrutura bsica de
um programa em C.
Implementar programas bsicos na lingua-
gem C.
Implementar programas em C utilizando as
estruturas de deciso e as estrutura em laos.
Ambiente Virtual de Ensino
Aprendizagem (AVEA):
http://cefetpi.nucleoead.net/
etapi/;
Webconferncia;
15
2. Funes,
matrizes,
ponteiros e
arquivos
Implementar matrizes, funes na linguagem C.
Conceituar e implementar ponteiros.
Implementar e classicar os mtodos de
manipulao de ponteiros.
Conceituar e manipular arquivos.
Ambiente Virtual de Ensino
Aprendizagem (AVEA):
http://cefetpi.nucleoead.net/
etapi/;
Webconferncia;
15
3. Viso geral de
estruturas e
lista lineares
Conceituar Estrutura de Dados.
Descrever os tipos de Estrutura de Dados.
Implementar as operaes bsicas da
Estrutura de Dados do tipo Lista esttica e
dinmica de ordenao e desordenao.
Ambiente Virtual de Ensino
Aprendizagem (AVEA):
http://cefetpi.nucleoead.net/
etapi/;
Webconferncia;
15
4. Pilhas
Conhecer o funcionamento de uma Pilha.
Implementar as operaes bsicas em uma
Estrutura Pilha Esttica e dinmica.
Ambiente Virtual de Ensino
Aprendizagem (AVEA):
http://cefetpi.nucleoead.net/
etapi/;
Webconferncia;
15
5. Filas e rvores
Conhecer e identicar uma Fila Esttica e
Dinmica.
Implementar Fila Esttica e Dinmica na
linguagem C.
Conceituar rvore e rvore Binria; Reconhe-
cer os percursos em rvores binrias.
Ambiente Virtual de Ensino
Aprendizagem (AVEA):
http://cefetpi.nucleoead.net/
etapi/;
Webconferncia;
15
6. Ordenao e
pesquisa
Classicar ou ordenar dados.
Implementar o mtodo da Bolha ou Bub-
bleSort.
Conceituar e implementar diferentes estrat-
gias de pesquisa.
Ambiente Virtual de Ensino
Aprendizagem (AVEA):
http://cefetpi.nucleoead.net/
etapi/;
Webconferncia;
15
Projeto instrucional
e-Tec Brasil
Aula 1 Introduo a linguagem
de programao C
Objetivos
Conhecer e identifcar a estrutura bsica de um programa em C.
Implementar programas bsicos na linguagem C.
Implementar programas em C utilizando as estruturas de deciso
e as estrutura em laos.
1.1 Apresentao
Habitualmente antes de resolvermos exemplos ou exerccios, elaboraremos o
algoritmo, que nada mais que uma sequncia de operaes cuja execuo
produz um resultado que a resposta de um problema proposto.
Um programa de computador nada mais que a codifcao de um algorit-
mo numa linguagem de programao. Linguagens como C, Pascal, BASIC,
ALGOL, Clipper, COBOL, etc., so chamadas procedurais, devido ao fato
das instrues serem executadas de forma sequencial, enquanto que as lin-
guagens baseadas no conceito de eventos como C++, Visual BASIC, Visual
Objects, utilizam outra estratgia de programao (Programao Orientada
ao Objeto), em C utilizaremos a metodologia estruturada.
1.2 Introduo
A linguagem C foi desenvolvida inicialmente por Dennis M. Ritchie e Ken
Tompson no laboratrio Bell no ano de 1972. Baseada na linguagem B cria-
da por Tompson, esta linguagem evoluiu da linguagem BCPL, dando origem
as duas linguagens anteriores.
C foi inicialmente projetada para ser utilizada no sistema operacional Unix.
Podemos defnir a linguagem C como sendo uma linguagem de progra-
mao robusta e multiplataforma, projetada para aplicaes modulares de
rpido acesso.
e-Tec Brasil Aula 1 Introduo a linguagem de programao C 15
Veremos aqui a estrutura ANSI C, verso padro defnida pelo comit ame-
ricano ANSI e suportada praticamente por todos os compiladores C.
Podendo ser considerada como uma linguagem de mdio nvel, pois possui
instrues que a tornam ora uma linguagem de alto nvel e estruturada como
o Pascal, se assim se fzer necessrio, ora uma linguagem de baixo nvel, pois
possui instrues to prximas da mquina, que s o Assembler possui.
De fato com a linguagem C podemos construir programas organizados e con-
cisos (como o Pascal), ocupando pouco espao de memria com alta velocida-
de de execuo (como o Assembler). Infelizmente, dada toda a fexibilidade da
linguagem, tambm poderemos escrever programas desorganizados e difceis
de serem compreendidos (como usualmente so os programas em BASIC).
Devemos lembrar que a linguagem C foi desenvolvida a partir da necessida-
de de se escrever programas que utilizassem recursos prprios da linguagem
de mquina de uma forma mais simples e portvel que o Assembler.
Linguagem C case sensitive, ou seja, diferencia letras maisculas de minsculas.
As inmeras razes para a escolha da linguagem C como a predileta para os
desenvolvedores profssionais. As caractersticas da Linguagem C serviro
para mostrar o porqu de sua ampla utilizao.
1.2.1 Caractersticas da linguagem C
Portabilidade entre mquinas e sistemas operacionais.
Dados compostos em forma estruturada.
Programas Estruturados.
Total interao com o Sistema Operacional.
Cdigo compacto e rpido, quando comparado ao cdigo de outras lin-
guagem de complexidade anloga.
ANSI
a sigla para American National
Standards Institute e designa
uma organizao americana
que tem a funo de estabelecer
quais normas desenvolvidas
devem virar padro.
Estrutura de Dados e-Tec Brasil 16
1.3 Estrutura bsica de um programa em C
Um programa em C consistem em uma ou vrias funes. Vamos comear
pelo menor programa possvel em C:
main ( ) {
}
Todo programa em C tem necessariamente a funo main.
Este programa compe-se de uma nica funo chamada main.
Instrues de programa
Vamos adicionar uma instruo ao nosso programa.
main ( ){
printf(ol); /* mostra na tela a mensagem Ol*/
}
1.4.1 Comentrios
Os comentrios servem principalmente para documentao do programa e
so ignorados pelo compilador, portanto no iro afetar o programa execu-
tvel gerado. Os comentrios iniciam com o smbolo /* e se estendem at
aparecer o smbolo */. Um comentrio pode aparecer em qualquer lugar no
programa onde possa aparecer um espao em branco e pode se estender
por mais de uma linha.
1.5 Viso geral: instrues de entrada e sada
Toda linguagem de programao de alto nvel suporta o conceito de Tipo
de dado, que defne um conjunto de valores que a varivel pode armaze-
nar, e os tipos mais comuns encontrados nas linguagens de programao,
ou seja, inteiro, real e caractere. Diferentemente do Pascal que fortemente
tipada onde a mistura entre um nmero inteiro e um real pode causar erros,
C suporta livremente tipos caracteres e inteiros na maioria das expresses!
e-Tec Brasil Aula 1 Introduo a linguagem de programao C 17
Por ser capaz de manipular bits, bytes e endereos, C se adapta bem a pro-
gramao em nvel de sistema. E tudo isto realizado por apenas 43 palavras
reservadas no Turbo C, 32 nos compiladores padro ANSI e 28 no C Padro.
Como curiosidade, o IBM BASIC que um interpretador BASIC com fns pu-
ramente educativos tem 159 comandos.
1.6 Fundamentos em C
Desta forma a orientao que adotaremos neste incio do curso se deter
mais na compreenso geral do programa, do que a anlise detalhada de
cada comando ou funo utilizada. De fato apresentaremos alguns coman-
dos fundamentais para a escrita de programas bsicos e apenas nos utilizare-
mos sua sintaxe mais elementar (posteriormente estudaremos cada um deles
mais detidamente), construiremos os primeiros programas do curso.
Exemplo 1: Programa mostra a idade.
/* Exemplo Idade */
main ( ) {
int idade;
idade = 40;
printf(Sua idade e %d anos. \n, idade);
}
Este programa simplesmente imprime Sua idade e 40 anos. saltando uma
linha (/n) em seu trmino.
1.6.1 Diretiva #include
Toda a diretiva, em C, comea com o smbolo # no incio da linha. A diretiva
#include inclui o contedo de outro arquivo dentro do programa atual, ou
seja, a linha que contm a diretiva substituda pelo contedo do arquivo
especifcado.
Sintaxe:
#include <nome do arquivo>
ou
#include nome do arquivo
Estrutura de Dados e-Tec Brasil 18
O primeiro caso o mais utilizado. Ele serve para incluir alguns arquivos que
contm declarao das funes da biblioteca padro, entre outras coisas.
Estes arquivos, normalmente, possuem a extenso .h e se encontram em
algum diretrio pr-defnido pelo compilador (/usr/include no Linux; c:\dev-
-c++\include no Windows com o Dev-C++). Sempre que o programa utilizar
alguma funo da biblioteca-padro deve ser includo o arquivo correspon-
dente. A tabela a seguir apresenta alguns dos principais . h da linguagem C:
Arquivo Descrio -
stdio.h ->Funes de entrada e sada (I/O)
string.h ->Funes de tratamento de strings
math.h ->Funes matemticas
ctype.h ->Funes de teste e tratamento de caracteres
stdlib.h ->Funes de uso genrico
A segunda forma, onde o nome do arquivo aparece entre aspas duplas,
serve normalmente para incluir algum arquivo que tenha sido criado pelo
prprio programador ou por terceiros e que se encontre no diretrio atual,
ou seja, no mesmo diretrio do programa que est sendo compilado.
1.7 Comandos bsicos
As instrues de entrada e sada so comandos quase que obrigatrios em
qualquer programa na linguagem C. Na maioria dos programas em C, o
usurio necessita entrar com algumas informaes e tambm saber o resul-
tado de algum processamento. Descreve-se a seguir os comandos bsicos
da linguagem C.
1.7.1 Instrues de entrada e sada
O objetivo de escrevermos programas em ltima anlise, a obteno de
resultados (Sadas) depois da elaborao de clculos ou pesquisas (Processa-
mento) atravs do fornecimento de um conjunto de dados ou informaes
conhecidas (Entradas).
e-Tec Brasil Aula 1 Introduo a linguagem de programao C 19
1.7.2 A funo printf ( )
um dos mais poderosos recursos da linguagem C, printf( ) servir basica-
mente para a apresentao de dados no monitor.
Sua forma geral ser: printf (string de controle, lista de argumentos);
Necessariamente voc precisar ter tantos argumentos quantos forem os
comandos de formatao na string de controle. Se isto no ocorrer, a tela
exibir sujeira ou no exibir qualquer dado.
Exemplo: Dado um nmero, calcule seu quadrado.
#include <stdio.h>
#include <conio.h>
main ( ) {
int numero;
numero=10;
printf(O %d elevado ao quadrado resulta em %d. \n,
numero,numero*numero);
getch ( );
}
A diretiva #include foi utilizada, pois usamos o comando printf (stdio.h) e o
comando getch (conio.h).
Observemos o Quadro de Operadores Especiais suportados por printf( ):
Cdigo Signifcado
\b Retrocesso (BackSpace)
\f Salto de Pgina (Form Feed)
\n Linha Nova (Line Feed)
\t Tabulao Horizontal (TAB)
\x Representao de byte na base hexadecimal
Exemplo: printf(\x41); causa a impresso da letra A na tela.
Estrutura de Dados e-Tec Brasil 20
1.7.3 A funo scanf ( )
Uma das mais importantes e poderosas instrues, servir basicamente para
promover leitura de dados (tipados) via teclado.
Sua forma geral ser: scanf(string de controle, lista de argumentos);
Posteriormente ao vermos sua sintaxe completa, abordaremos os recursos
mais poderosos da <string de controle>, no momento bastar saber que:
%c - leitura de caracter;
%d - leitura de nmeros inteiros;
%f - leitura de nmeros reais;
%s - leitura de caracteres.
A lista de argumentos deve conter exatamente o mesmo nmero de argu-
mentos quantos forem os cdigos de formatao na <string de controle>.
Se este no for o caso, diversos problemas podero ocorrer - incluindo at
mesmo a queda do sistema - quando estivermos utilizando programas com-
pilados escritos em C.
Cada varivel a ser lida, dever ser precedida pelo caracter &, por razes que
no momento no convm explicarmos, mas que sero esclarecidas no de-
correr do curso. Para sequncia de caracteres (%s), o caracter & no dever
ser usado.
Exemplo: Programa para ler e mostrar uma idade.
/* Exemplo L e Mostra Idade */
main ( ) {
int idade;
char nome[30];
printf(Digite sua Idade: );
scanf(%d,&idade);
printf(Seu Nome: );
e-Tec Brasil Aula 1 Introduo a linguagem de programao C 21
scanf(%s,nome); /* Strings no utilizar & na leitura */
printf(%s sua idade e %d anos. \n, nome, idade);
}
Faa um programa em C para perguntar sua profsso e mostrar na tela.
Poste no AVEA da disciplina o arquivo de sua atividade.
1.8 Tipos de dados
No momento dispomos de conhecimento para elaborao de programas b-
sicos para construo de pequenos programas, pois conhecemos instrues
de entrada de dados (scanf) e de sada (printf).
Veremos a seguir Tipos de Dados da linguagem C, variveis, operadores, e
demais instrues bsicas. Devemos procurar compreender a utilidade das
declaraes que sero exibidas a seguir, relacionando estes recursos com os
exemplos e exerccios vistos anteriormente.
Semelhante ao BASIC, Pascal e COBOL, a linguagem C necessita que todas
as variveis tenham seus tipos defnidos. C aceita tipos bsicos (caractere,
inteiro, ponto futuante, dupla preciso e sem valor) e modifcadores (sinal,
sem sinal, longo e curto) que podem alterar os tipos bsicos. Observemos o
Quadro 1.1 para melhor entendimento.
Quadro 1.1: Tabela de tamanhos e escala de tipos bsicos
Tipo Extenso Escala Numrica em bits
Char 8 0 a 255
Int 16 -32768 a 32767
Float 32 3.4E-38 a 3.4E+38
Double 64 1.7E-308 a 1.7E+308
Void 0 Sem valor
Fonte: Schildt H, 1997
Exemplo: Mesmo nmero com duas representaes diferentes.
main ( ) {
foat a;
printf(Digite um numero: );
Estrutura de Dados e-Tec Brasil 22
scanf(%f,&a);
printf(%f %e,a,a);
}
Simulando obtemos:
Digite um nmero: 65
65.000000 6.500000E+01
1.9 Variveis
As variveis tem uma importncia fundamental na linguagem C. So utiliza-
das como depsitos temporrios de informaes a serem processados pelo
programa escrito na linguagem C.
1.9.1 Variveis
De maneira semelhante as demais linguagens estruturadas, em C as vari-
veis tem seus valores localizados nas rotinas onde foram declaradas (escopo).
Todas as variveis devem ser declaradas desta forma:
tipo nome_de_variaveis;
Exemplos:
int i,j,l;
short int si;
double balanco, consolidacao;
char nome[30];
Basicamente, as variveis podem ser declaradas fora das funes (globais) que
valem para todas as funes do programa. Podem ser declaradas dentro de
uma funo (locais) sendo desconhecida no restante do programa. Alm disso
podem ser usadas para passagem de valores entre funes (parmetros).
e-Tec Brasil Aula 1 Introduo a linguagem de programao C 23
1.9.2 Inicializando variveis
Em C podemos criar uma varivel e logo em seguida utilizarmos o operador de
atribuio para inicializarmos o valor de uma varivel. Este processo denomina-
-se inicializao de variveis. Vejamos abaixo como fazemos tal procedimento.
int i=0;
double x=10.5;
Exemplo: Criando trs variveis e inicializando-as em tempo de criao.
main ( ) {
int evento = 5;
char corrida = c;
foat tempo = 27.25;
printf ( o melhor tempo da eliminatria % c, corrida);
printf ( \ n do evento %d foi % f, evento, tempo);
}
Simulando obtemos:
o melhor tempo da eliminatria c
do evento 5 foi 27.25
1.9.3 Nomes de variveis
A escolha de nomes de variveis em C pode conter quantos caracteres qui-
ser, sendo o primeiro caractere obrigatoriamente uma letra ou o caractere
sublinhado. Outra caracterstica marcante em C, que os nomes de variveis
podem ser criadas com nomes iguais, desde que contenham letras maiscu-
las ou minsculas, para diferenci-las. isso mesmo, C fazer distino entre
letras maisculas e minsculas.
int valor;
double Valor;
Observem que as variveis possuem os mesmos nomes, s que a primeiro
denominada valor escrita em minsculo e a segunda denominada Valor,
sendo o primeiro caractere escrito em maiscula.
Estrutura de Dados e-Tec Brasil 24
1.10 Operadores
C uma das linguagens com maior nmero de operadores, devido possuir
todos os operadores comuns de uma linguagem de alto nvel, porm tam-
bm possuindo os operadores mais usuais a linguagens de baixo nvel. Para
fns didticos, dividiremos os operadores em aritmticos, lgicos e de bits.
No momento abordaremos apenas as duas primeiras classes.
1.10.1 Operadores aritmticos
Os operadores aritmticos so utilizados para efetuar as operaes mate-
mticas bsicas como adio, multiplicao, diviso, resto de diviso inteira,
subtrao o menos unrio, decremento e incremento. O Quadro 1.2 estabe-
lece o operador aritmtico e a ao de cada um.
Quadro 1.2: Operadores Aritmticos
Operador Ao
+ Adio
* Multiplicao
/ Diviso
% Resto de Diviso Inteira
- Subtrao o menos unrio
-- Decremento
++ Incremento
Fonte: Schildt H, 1997
1.10.2 Operadores relacionais e lgicos
Os operadores relacionais e lgicos so utilizados para efetuar as operaes
matemticas relacionais e lgicos que so os seguintes: como maior que,
maior ou igual que, menor que, menor ou igual que, igual a, diferente de
condio e. O Quadro 1.3 estabelece os operadores relacionais e lgicos e a
ao de cada um.
Quadro 1.3: Operadores relacionais e lgicos
Operador Ao
> Maior que
>= Maior ou igual que
< Menor que
<= Menor ou igual que
== Igual a
!= Diferente de
&& Condio E
Fonte: Schildt H, 1997
e-Tec Brasil Aula 1 Introduo a linguagem de programao C 25
Em C o resultado da comparao ser ZERO se resultar em FALSO e DIFE-
RENTE DE ZERO no caso de obtermos VERDADEIRO num teste qualquer. Pro-
gramadores experientes utilizam-se desta concluso em alguns programas,
onde inexplicavelmente algo testado contra ZERO.
Exemplo: Ir calcular a mdia de um aluno sendo que ele possua trs notas,
a mdia a soma das notas dividida por trs.
#include <stdio.h>
#include <conio.h>
void main ( )
{
clrscr ( );
foat nota1;
foat nota2;
foat nota3;
foat media;
printf(\n Digite a primeira nota..: );
scanf(%f,&nota1);
printf(\n Digite a segunda nota...: );
scanf(%f,&nota2);
printf(\n Digite a terceira nota..: );
scanf(%f,&nota3);
media=(nota1+nota2+nota3)/3;
printf(\n\n Sua mdia ............:%6.2f,media);
getch ( );
}
Faa um programa em C onde dado 5 nmeros, imprima-os em ordem cres-
cente. Poste no AVEA da disciplina o arquivo de sua atividade.
Estrutura de Dados e-Tec Brasil 26
1.10.3 Incremento e decremento
Para efetuar o incremento de uma varivel deste tipo, s acrescentarmos
(++) seguido do nome da varivel e para decrementar utilizamos (--) seguido
do nome da varivel. Outra maneira de usarmos o incremento e decremento
colocar o (++) ou (--) antecedendo o nome da varivel.
Na ocorrncia de (++) ou (--) aps o nome da varivel, denominados ps-f-
xado, e antecedendo o nome da varivel, denominados prefxado. Vejamos
alguns exemplos:
n = n + 1; /* adiciona 1 a n */
//seria o mesmo que
++n; /* adiciona 1 a n */

//ou
n++; /* adiciona 1 a n */

O que muda nas operaes a cima, apenas o uso dos incrementos, ps-
-fxados e prefxados, mas que fazem bastante diferenas quando utilizados
em conjunto com outras instrues.
Vejamos o exemplo:
n = 10;
m = ++n
printf (\n N=%d M=%d, n, m);
a = 10
x = a++
printf(\n A=%d X=%d, a, x);
e-Tec Brasil Aula 1 Introduo a linguagem de programao C 27
Simulando obtemos:
N=10 M=11
A=10 X=10
1.11 Tomada de deciso
A tomada de deciso e um dos procedimentos mais comuns em programas
de computadores, pois atravs deles que o computador decide que pro-
cedimento executar. A linguagem C nos permite utilizar trs comando de
deciso:
if
if-else
switch
1.11.1 Comando if-else
Anlogo a outras linguagens, sua forma geral ser:
if <condio>
<comando>;
else
<comando>;
Exemplo 1: Programa Adulto, Jovem ou Velho.
main ( ) {
int i;
printf(Digite sua idade: );
scanf(%d,&i);
if (i > 70)
printf(Esta Velho!);
else
if (i > 21)
Estrutura de Dados e-Tec Brasil 28
printf(Adulto);
else
printf(Jovem);
}

A expresso avaliada dever obrigatoriamente estar entre parnteses.
Exemplo 2: Maior entre trs nmeros.
main ( ) {
int a,b,c;
clrscr();
printf(Digite o 1 Nmero: );
scanf(%d,&a);
printf(\nDigite o 2 Nmero: );
scanf(%d,&b);
printf(\nDigite o 3 Nmero: );
scanf(%d,&c);
if (a > b)
if (a > c)
printf(\nO Maior %d,a);
else
printf(\nO Maior %d,c);
else
if (b > c)
printf(\nO Maior %d,b);
else
printf(\nO Maior %d,c);
}
e-Tec Brasil Aula 1 Introduo a linguagem de programao C 29
Exemplo 3: Maior entre trs nmeros (segunda soluo).
main ( ) {
int a,b,c,d;
clrscr();
printf(Digite o 1 Nmero: );
scanf(%d,&a);
printf(\nDigite o 2 Nmero: );
scanf(%d,&b);
printf(\nDigite o 3 Nmero: );
scanf(%d,&c);
if (a > b)
d = a;
else
d = b;
if (c > d)
printf(\nO Maior %d,c);
else
printf(\nO Maior %d,d);
}
1.11.2 Comando switch
Este comando nos permite selecionar uma opo entre vrias alternativas.
A varivel ser validada e conforme seu valor executar a opo na qual se
enquadra. Sua forma geral ser:
Estrutura de Dados e-Tec Brasil 30
switch (opol) {
case <valor1>: instruo;
break;
case <valor2>: instruo;
break;
case <valor3>: instruo;
break;
default : instruo;
}
Exemplo 1: Programa adulto ou velho.
#include <stdio.h>
#include <stdlib.h>
int main ( )
{
int i;
char sn;
printf(Voce tem mais de 70 anos ? (S/N) );
scanf(%c,&sn);
switch (sn) {
case s : printf(Voce Esta Velho! \n); break;
case S : printf(Voce Esta Velho! \n); break;
case n : printf(Voce Esta Adulto! \n); break;
case N : printf(Voce Esta Velho! \n); break;
}
system (pause);
}
e-Tec Brasil Aula 1 Introduo a linguagem de programao C 31
1.12 Laos
Um dos grandes benefcios dos sistemas de processamento de dados est em
sua confabilidade (preciso nos clculos) e rapidez (infnitamente superior
ao ser humano), desta forma ideal para processamento de elevado nmero
de operaes repetitivas. O processamento de uma Folha de Pagamentos,
a Emisso de Notas Fiscais, a Gerao de Estatsticas de Faturamento, so
tpicas tarefas a serem realizadas por processamento eletrnico de dados.
1.12.1 Comando for
O lao for a instruo mais poderosa na criao de estruturas de repetio.
Neste momento, abordaremos apenas sua sintaxe simplifcada, Sua forma
mais simples :
for (<incio>;<condio>;<incremento>) comando;
Exemplo 1: Contagem de 1 a 100 fcaria.
main ( ) {
int cont;
for (cont = 1; cont <= 100; cont++)
printf(%d,cont);
}
Exemplo 2: Elaborar programa que imprima a tabuada de um nmero dado.
main ( ) {
int cont,num;
printf(Digite um Numero: ); scanf(%d,&num);
for (cont = 0; cont <= 10; cont++)
printf(%2d * %2d = %2d \n,num,cont,num * cont);
}
Estrutura de Dados e-Tec Brasil 32
O nmero 2 antes do d causa a representao em vdeo de 2 casas, per-
mitindo o alinhamento da tabuada!.
Exerccio1: Elabore tabela de Converso de temperaturas entre as escalas
Celsius e Fahrnheit.
#include <stdio.h>
#include <stdlib.h>
main ( ) {
int fahr;
foat celsius;
for (fahr = 0; fahr <= 300; fahr = fahr + 20) {
printf(%4d, fahr);
celsius = (5.0/9.0)*(fahr-32);
printf(\t%6.1f\n,celsius);
}
}
Quando dois ou mais comandos devam ser executados, devemos obrigatoria-
mente utilizar chaves para delimitar a sequncia de instrues a ser observada.
1.12.2 Comando while
O lao while signifca enquanto, e um comando utilizado para se realizar
repeties quando no se pode determinar a quantidade de vezes que ser
repetido o lao. Diferente do for que se determina qual a quantidade de
vezes o lao se repete. Neste momento, abordaremos apenas sua sintaxe
simplifcada, Sua forma mais simples :
e-Tec Brasil Aula 1 Introduo a linguagem de programao C 33
while (<condio>) {
<instruo>;
}
Exemplo 1: Contagem de 1 a 100 fcaria.
main ( ) {
int cont=0;
while (cont = 100)
cont++;
printf(%d,cont);
}
1.12.3 Comando do-while
O lao do-while signifca faa enquanto, e um comando utilizado para se
realizar repeties com um diferencial que a execuo de pelo menos uma
vez a instruo do lao, mesmo que a condio inicial seja falsa, pois a vali-
dao da condio s feita depois da execuo do lao. Neste momento,
abordaremos apenas sua sintaxe simplifcada, Sua forma mais simples :
do {
<instruo>;
} while (<condio>);
Estrutura de Dados e-Tec Brasil 34
Exemplo 1: Contagem de 1 a 100 fcaria:
#include <stdio.h>
#include <stdlib.h>
int main() {
int cont=0;
do {
cont++;
printf(%d ,cont);
} while (cont < 100);
system(pause);
}
Resumo
Nesta aula abordamos conceitos da linguagem de programao C, a sua
estrutura bsica de um programao, suas caractersticas, vantagens, des-
vantagens, operaes, declaraes e manipulaes de variveis e as imple-
mentaes das estruturas condicionais, bem como as implementaes de
programas das estruturas de lao. Alm de exemplos prticos do nosso dia-
-a-dia, a fm de um entendimento melhor por parte do leitor aumentando
assim seu conhecimento terico.
Assista video-aula da disciplina
de Estrutura de Dados disponvel
em http://cefetpi.nucleoead.
net/etapi/. Aproveite para revisar
os contedos da aula sobre
Introduo a Linguagem de
Programao C. Depois disto,
anote em um documento Word
suas dvidas e poste estas
anotaes no frum do AVEA,
para que voc compartilhe
dvidas e sane diculdades.
e-Tec Brasil Aula 1 Introduo a linguagem de programao C 35
Atividades de aprendizagem
1. Elabore um programa em C que faa o seguinte:
a) Mostre na tela o seu nome.
b) Some 10 com 15 e imprima na tela a seguinte frase: O resultado da
soma : mostrando o resultado.
c) Faa a multiplicao entre 10 e 15 e mostre na tela o resultado.
d) Pergunte o seu nome e imprima na tela.
e) Pergunte o nome da pessoa e o sobrenome e imprimir os mesmos.
f) Leia dois nmeros e apresente seu produto.
g) Leia dois nmeros e apresenta a sua subtrao.
h) Leia o nome e as duas notas de um aluno e apresente ambos na tela.
Estrutura de Dados e-Tec Brasil 36
e-Tec Brasil
Aula 2 Funes, matrizes, ponteiros
e arquivos
Objetivos
Implementar matrizes, funes na linguagem C.
Conceituar e implementar ponteiros.
Implementar e classifcar os mtodos de manipulao de ponteiros.
Conceituar e manipular arquivos.
2.1 Funes
Conceitualmente, C baseada em blocos de construo. Assim sendo, um pro-
grama em C nada mais que um conjunto de funes bsicas ordenadas pelo
programador. As instrues printf( ) e scanf( ), vistas anteriormente, no fazem
parte do conjunto de palavras padres da linguagem (instrues), pois no pas-
sam elas mesmas de funes escritas em C! Esta abordagem permite a portabi-
lidade da linguagem, pois seus comandos de entaada e sada, no so parte do
conjunto bsico da linguagem, livrando-a desta forma dos problemas de supor-
te aos diversos padres de vdeos, teclados e sistemas operacionais existentes.
Cada funo C na verdade uma sub-rotina que contm um ou mais co-
mandos em C e que executa uma ou mais tarefas. Em um programa bem
escrito, cada funo deve executar uma tarefa. Esta funo dever possuir
um nome e a lista de argumentos que receber. As funes em C so muito
semelhantes s usadas no Pascal, com a diferena que o prprio programa
principal apenas uma funo que se inicia com a palavra reservada main ( )
podendo receber parmetros diretamente do DOS, por exemplo.
Exemplo: Programa principal chamando funo alo.
main ( ) {
alo ( );
}
e-Tec Brasil Aula 2 Funes, matrizes, ponteiros e arquivos 37
alo ( ) {
printf (Al!\n\n);
}
Retomemos o exemplo do clculo de um nmero elevado ao quadrado.
Exemplo: Quadrado com funo.
main ( ) {
int num;
printf(Digite um numero: );
scanf(%d,&num);
sqr(num); /* sqr recebe num do programa principal */
}
sqr ( ) {
int x; /* x um parmetro recebido do programa principal
no caso x vale o contedo de num */
printf(%d ao quadrado e %d ,x,x*x);
}
O argumento simplesmente o valor (em num) digitado no programa
principal (em scanf) e enviado a funo sqr.
Um conceito importante e normalmente confundido a diferena conceitual en-
tre argumento e parmetro que em resumo pode ser defnido da seguinte
forma: Argumento se refere ao valor que usado para chamar uma funo.
O termo Parmetro se refere varivel em uma funo que recebe o valor dos
argumentos usados na funo. A distino que deve ser compreendida que a
varivel usada como argumento na chamada de uma funo no tem nenhuma
relao com o parmetro formal que recebe o valor dessa varivel.
Estrutura de Dados e-Tec Brasil 38
Exerccio: Passagem de variveis entre rotinas.
int x;
main ( ) {
int a;
printf(Digite um valor: );
scanf(%d,&a);
x = 2 * a + 3;
printf(%d e %d,x,soma(a));
}
soma (z) {
int z;
x = 2 * x + z;
return(x);
}
2.1.1 Prottipo de uma funo
A declarao de uma funo quando feita no inicio de um programa em C
dita prottipo da funo. Esta declarao deve ser feita sempre antes da
funo main, defnindo-se o tipo, o nome e os argumentos desta mesma
funo. Exemplo:
foat soma (foat, foat);
Defnindo-se o prottipo de uma funo no necessrio escrever o cdi-
go desta mesma funo antes da funo main, pois o prottipo indica ao
compilador C que a funo est defnida em outro local do cdigo. Vejamos
agora a utilizao do exemplo anterior usando o prottipo de uma funo.
e-Tec Brasil Aula 2 Funes, matrizes, ponteiros e arquivos 39
#include <stdio.h>
#include <stdlib.h>
int sqr (int); /* prottipo da funo*/
int main ( ) {
int num;
printf(Digite um numero: );
scanf(%d,&num);
sqr(num); /* sqr recebe num do programa principal */
system(pause);
}
int sqr(int num) {
int x = num; /* x um parmetro recebido do programa principal
no caso x vale o contedo de num */
printf(%d ao quadrado e %d \n,x,x*x);
}
2.1.2 Funo recursiva
Uma funo denomina-se recursiva quando dentro dela se faz uma chamada
para ela mesma. Um exemplo prtico seria o clculo do fatorial de um nmero.
Faa uma funo que escreva o endereo da varivel ZEND. Poste no AVEA
da disciplina o arquivo de sua atividade.
#include <stdio.h>
#include <stdlib.h>
long fatorial (int);
int main() {
int n;
do {
Estrutura de Dados e-Tec Brasil 40

printf(Digite um numero ou negativo p/ sair \n);
scanf(%d,&n);
if (n < 0) {
break;
}
printf(O Fatorial de %d eh %d \n,n,fatorial(n));
} while (1);
system(pause);
return 0;
}
long fatorial (int n) {
return ((n==0) ? (long)1 : (long)n * fatorial(n-1) );
}
2.2 Matrizes
Uma Matriz um conjunto de variveis de mesmo tipo que compartilham
um mesmo nome. Com Matriz agora podemos armazenar mais de um valor
para depois serem manipulados atravs de um ndice, o qual referencia cada
um dos elementos, para se criar uma Matriz necessrio defnir um tipo,
seu nome e quantidade de elementos, sedo este ultimo entre colchetes ([ ]).
Vejamos agora a declarao de uma matriz.
int mat[5];
2.2.1 Referenciao e Atribuio dos elementos
de uma matriz
Para se referenciar um elemento da Matriz individualmente, basta apenas
colocar-se o nome desta Matriz seguida do seu ndice entre colchetes.
Os ndices dos elementos de uma matriz so sempre iniciados por zero.
e-Tec Brasil Aula 2 Funes, matrizes, ponteiros e arquivos 41
Vejamos um exemplo para se referenciar um elemento da Matriz:
x = mat[10]; /* x recebe o elemento de mat na posio 10 */
mat[10] = 20; /* o elemento de mat na posio 10 recebe o valor 20 */
2.2.2 Inicializao de matrizes
Para se inicializar uma Matriz necessrio apenas colocar-se o nome desta
Matriz, a quantidade elementos entre colchetes seguida do operador de atri-
buio e por fm os valores separados por ponto e vrgula entre as chaves ({
}). Vejamos um exemplo para se iniciar uma Matriz.
int mat[3] = {1;2;3}; /* matriz inicializada com os valores 1,2 e 3 */
Para exemplifcar melhor, vejamos o exemplo abaixo de um programa que
calcula a media de trs notas.
#include <stdio.h>
#include <stdlib.h>
int main() {
int i;
foat nota[3], m=0;
for (i=0;i<3;i++) {
printf(\n Digite a nota %d , i+1 );
scanf(%f,&nota[i]);
m = m + nota[i];
}
m /= 3;
printf(\n A media e %.2f \n, m );
system(pause);
return 0;
}
Estrutura de Dados e-Tec Brasil 42
2.3 Ponteiros
O ponteiro nada mais do que uma varivel que guarda o endereo de
outra varivel.
2.3.1 Declarao de ponteiros
A declarao de ponteiros feita da seguinte forma:
int *ptr
Conforme qualquer varivel em C, o ponteiro deve ser declarado antes de
ser usado. Basta inserir o operador indireto (*) aps o tipo da varivel:
int *ptr;
Essa declarao dene a varivelptrcomo um ponteiro para uma varivel do
tipo int (nmero inteiro).
A declarao de ponteiro no tem o mesmo signifcado da declarao de uma
varivel. Ela indica apenas o tipo de objeto de dados apontado e, desde que
contm endereo de memria, o tamanho em bytes que ocupa no tem relao
com o tamanho do objeto apontado. O tamanho do ponteiro fxo e depende
apenas do modelo de memria do sistema (2 bytes ou 4 bytes, normalmente).
Para declarar mais de um ponteiro por linha, usa-se um operador indireto
(*) para cada
char *ch1, *ch2;(so ponteiros para o tipochar).
Se um operador for omitido (exemplo: char *ch1, ch2;), a varivel corres-
pondente no ser ponteiro e, certamente, provocar erro de execuo se
usada como tal.
2.3.2 Inicializao de ponteiros
Para se inicializar um ponteiro necessrio apenas atribuir-se um endereo
de memria.
A simples declarao de um ponteiro no o faz til. necessria a indicao
da varivel para a qual ele aponta.
O ponteiro pode ser
declarado para qualquer
tipo legal de varivel em C
(char,int,foat,double, etc),
alm devoid, que seria um
genrico, podendo apontar para
qualquer tipo de dado.
e-Tec Brasil Aula 2 Funes, matrizes, ponteiros e arquivos 43
....... ....... .......
4
0
5
2
4
0
5
3
4
0
5
4
ptr var
4052 10
Figura 2.1: Inicializao de ponteiro
int var;
int *ptr;
var = 10;
ptr = &var;
Na sequncia acima, so declarados uma varivel tipo int (var) e um ponteiro
para o mesmo tipo (ptr). A terceira linha atribui o valor 10 a var e a ltima
linha inicializa o ponteiro ptr.
Observa-se o uso do operador de endereamento (&) para inicializao do
ponteiro. Isso signifca, no cdigo ptr = &var, que ptr passa a conter o en-
dereo de var, no o seu valor. Supondo que o sistema endereado por 2
bytes, a Figura 2.1 acima d uma ideia grfca dessa associao: o contedo
de ptr 4052, que o endereo do primeiro byte da varivel var (ptr ocupa 2
bytes por causa do endereamento do sistema e var tambm ocupa 2 bytes,
mas por ser do tipo int.
O valor 4052 para a posio de memria de var apenas ilustrativo. Na pr-
tica, depender do local de memria onde o programa foi carregado.
Com ptr apontando para var, possvel realizar operaes com esta ltima
de forma indireta, a partir de ptr. Exemplos a seguir.
Acrescentando a linha
int newVar = *ptr;
ao cdigo anterior, o valor de newVar 10, que o valor de var lido indire-
tamente atravs de ptr.
Estrutura de Dados e-Tec Brasil 44
E a linha
*ptr = 20;
modifca o valor de var para 20, ou seja, altera de forma indireta atravs de ptr.
importante lembrar que um ponteiro declarado e no inicializado poder ter
contedo nulo ou aleatrio, a depender da alocao sistema. Nessa condio,
se o contedo apontado for modifcado, algumas posies de memria tero
seus valores indevidamente alterados e as consequncias sero imprevisveis.
Agora veremos um exemplo completo de utilizao de ponteiros:
#include <stdio.h>
#include <stdlib.h>
int main ( ) {
int a;
int b;
int c;
int *ptr; /* declara um ponteiro para um inteiro */
/* um ponteiro para uma varivel do tipo inteiro */
a = 100;
b = 2;
c = 3;
ptr = &a; /* ptr recebe o endereo da varivel a */
printf(Valor de ptr: %p, Contedo de ptr: %d\n, ptr, *ptr);
printf(B: %d, C: %d \n, b, c);
a = 200;
printf(Valor de ptr: %p, Contedo de ptr: %d\n, ptr, *ptr);
system(pause);
}
e-Tec Brasil Aula 2 Funes, matrizes, ponteiros e arquivos 45
Escreva um resumo sobre ponteiros. Poste no AVEA da disciplina o arquivo
de sua atividade.
2.4 Arquivos
Um arquivo pode ser visto de duas maneiras, na maioria dos sistemas opera-
cionais: em modo texto, como um texto composto de uma sequncia de
caracteres, ou em modo binrio, como uma sequncia de bytes (nmeros
binrios). Podemos optar por salvar (e recuperar) informaes em disco usando
um dos dois modos, texto ou binrio. Uma vantagem do arquivo texto que
pode ser lido por uma pessoa e editado com editores de textos convencionais.
Em contrapartida, com o uso de um arquivo binrio possvel salvar (e recupe-
rar) grandes quantidades de informao de forma bastante efciente. O sistema
operacional pode tratar arquivos texto de maneira diferente da utilizada para
tratar arquivos binrios. Em casos especiais, pode ser interessante tratar ar-
quivos de um tipo como se fossem do outro, tomando os cuidados apropriados.
2.4.1 Funes para manipulao de arquivos
A funo bsica para abrir um arquivo fopen:
FILE* fopen (char* nome_arquivo, char* modo);
Quando abrimos um arquivo, a funo tem como valor de retorno um pon-
teiro para o tipo FILE, e todas as operaes subsequentes nesse arquivo re-
cebero este endereo como parmetro de entrada. Se o arquivo no puder
ser aberto, a funo tem como retorno o valor NULL.
Devemos passar o nome do arquivo a ser aberto. O nome do arquivo pode ser
relativo, e o sistema procura o arquivo a partir do diretrio corrente (diretrio
de trabalho do programa), ou pode ser absoluto, onde especifcamos o nome
completo do arquivo, incluindo os diretrios, desde o diretrio raiz. Existem
diferentes modos de abertura de um arquivo. Podemos abrir um arquivo para
leitura ou para escrita, e devemos especifcar se o arquivo ser aberto em
modo texto ou em modo binrio. O parmetro modo da funo fopen uma
cadeia de caracteres onde espera-se a ocorrncia de caracteres que identif-
cam o modo de abertura. Os caracteres interpretados no modo so:
R read-only Indica modo apenas para leitura, no pode ser alterado.
W write Indica modo para escrita.
A append Indica modo para escrita ao nal do existente.
T text Indica modo texto.
B binary Indica modo binrio.
FILE
um tipo denido pela biblioteca
padro que representa uma
abstrao do arquivo.
Estrutura de Dados e-Tec Brasil 46
Se o arquivo j existe e solicitamos a sua abertura para escrita com modo w, o
arquivo apagado e um novo, inicialmente vazio, criado. Quando solicitamos
com modo a, o mesmo preservado e novos contedos podem ser escritos no
seu fm. Com ambos os modos, se o arquivo no existe, um novo criado.
Os modos b e t podem ser combinados com os demais. Maiores detalhes e
outros modos de abertura de arquivos podem ser encontrados nos manuais
da linguagem C. Em geral, quando abrimos um arquivo, testamos o sucesso
da abertura antes de qualquer outra operao, por exemplo:
FILE* fp;
fp = fopen(entrada.txt,rt);
if (fp == NULL) {
printf(Erro na abertura do arquivo!\n);
exit(1);
}
Aps ler/escrever as informaes de um arquivo, devemos fech-lo. Para fe-
char um arquivo, devemos usar a funo fclose, que espera como parmetro
o ponteiro do arquivo que se deseja fechar. O prottipo da funo :
int fclose (FILE* fp);
O valor de retorno dessa funo zero, se o arquivo for fechado com sucesso,
ou a constante EOF (defnida pela biblioteca), que indica a ocorrncia de um erro.
2.4.2 Arquivos em modo texto
Nesta seo, vamos descrever as principais funes para manipular arquivos
em modo texto. Tambm discutiremos algumas estratgias para organizao
de dados em arquivos.
2.4.3 Funes para ler dados
A principal funo de C para leitura de dados em arquivos em modo texto
a funo fscanf, similar funo scanf que temos usado para capturar
valores entrados via o teclado. No caso da fscanf, os dados so capturados
de um arquivo previamente aberto para leitura. A cada leitura, os dados
correspondentes so transferidos para a memria e o ponteiro do arquivo
e-Tec Brasil Aula 2 Funes, matrizes, ponteiros e arquivos 47
avana, passando a apontar para o prximo dado do arquivo (que pode ser
capturado numa leitura subsequente). O prottipo da funo fscanf :
int fscanf (FILE* fp, char* formato, ...);
Conforme pode ser observado, o primeiro parmetro deve ser o ponteiro do
arquivo do qual os dados sero lidos. Os demais parmetros so os j discu-
tidos para a funo scanf: o formato e a lista de endereos de variveis que
armazenaro os valores lidos. Como a funo scanf, a funo scanf tambm
tem como valor de retorno o nmero de dados lidos com sucesso.
Uma outra funo de leitura muito usada em modo texto a funo fgetc
que, dado o ponteiro do arquivo, captura o prximo caractere do arquivo. O
prottipo dessa funo :
int fgetc (FILE* fp);
Apesar do tipo do valor de retorno ser int, o valor retornado o caractere
lido. Se o fm do arquivo for alcanado, a constante EOF (end of fle) retor-
nada. Outra funo muito utilizada para ler linhas de um arquivo a funo
fgets. Essa funo recebe como parmetros trs valores: a cadeia de carac-
teres que armazenar o contedo lido do arquivo, o nmero mximo de ca-
racteres que deve ser lido e o ponteiro do arquivo. O prottipo da funo :
char* fgets (char* s, int n, FILE* fp);
A funo l do arquivo uma sequncia de caracteres, at que um caractere
\n seja encontrado ou que o mximo de caracteres especifcado seja alcan-
ado. A especifcao de um nmero mximo de caracteres importante para
evitarmos que se invada memria quando a linha do arquivo for maior do que
supnhamos. Assim, se dimensionarmos nossa cadeia de caracteres, que rece-
ber o contedo da linha lida, com 121 caracteres, passaremos esse valor para
a funo, que ler no mximo 120 caracteres, pois o ltimo ser ocupado pelo
fnalizador de string o caractere \0. O valor de retorno dessa funo o pon-
teiro da prpria cadeia de caracteres passada como parmetro ou NULL no caso
de ocorrer erro de leitura (por exemplo, quando alcanar o fnal do arquivo).
Estrutura de Dados e-Tec Brasil 48
2.4.4 Funes para escrever dados
Dentre as funes que existem para escrever (salvar) dados em um arquivo,
vamos considerar as duas mais frequentemente utilizadas: fprintf e fputc,
que so anlogas, mas para escrita, s funes que vimos para leitura.
A funo fprintf anloga a funo printf que temos usado para imprimir
dados na sada padro em geral, o monitor. A diferena consiste na pre-
sena do parmetro que indica o arquivo para o qual o dado ser salvo. O
valor de retorno dessa funo representa o nmero de bytes escritos no
arquivo. O prottipo da funo dado por:
int fprintf(FILE* fp, char* formato, ...);
A funo fputc escreve um caractere no arquivo. O prottipo :
int fputc (int c, FILE* fp);
O valor de retorno dessa funo o prprio caractere escrito, ou EOF se
ocorrer um erro na escrita.
2.4.5 Estruturao de dados em arquivos textos
Existem diferentes formas para estruturarmos os dados em arquivos em
modo texto, e diferentes formas de capturarmos as informaes contidas
neles. A forma de estruturar e a forma de tratar as informaes depen-
dem da aplicao. A seguir, apresentaremos trs formas de representarmos
e acessarmos dados armazenados em arquivos: caractere a caractere, linha a
linha, e usando palavras chaves.
2.4.6 Acesso caractere a caractere
Para exemplifcar o acesso caractere a caractere, vamos discutir duas apli-
caes simples. Inicialmente, vamos considerar o desenvolvimento de um
programa que conta as linhas de um determinado arquivo (para simplifcar,
vamos supor um arquivo fxo, com o nome entrada.txt. Para calcular o
nmero de linhas do arquivo, podemos ler, caractere a caractere, todo o
contedo do arquivo, contando o nmero de ocorrncias do caractere que
indica mudana de linha, isto , o nmero de ocorrncias do caractere \n.
e-Tec Brasil Aula 2 Funes, matrizes, ponteiros e arquivos 49
/* Conta nmero de linhas de um arquivo */
#include <stdio.h>
int main (void) {
int c;
int nlinhas = 0; /* contador do nmero de linhas */
FILE *fp;
/* abre arquivo para leitura */
fp = fopen(entrada.txt,rt);
if (fp==NULL) {
printf(No foi possivel abrir arquivo.\n);
return 1;
}
/* l caractere a caractere */
while ((c = fgetc(fp)) != EOF) {
if (c == \n)
nlinhas++;
}
/* fecha arquivo */
fclose(fp);
/* exibe resultado na tela */
printf(Numero de linhas = %d\n, nlinhas);
return 0;
}
Como segundo exemplo, vamos considerar o desenvolvimento de um pro-
grama que l o contedo do arquivo e cria um arquivo com o mesmo con-
tedo, mas com todas as letras minsculas convertidas para maisculas. Os
nomes dos arquivos sero fornecidos, via teclado, pelo usurio. Uma possvel
implementao desse programa mostrada a seguir:
Estrutura de Dados e-Tec Brasil 50
/* Converte arquivo para maisculas */
#include <stdio.h>
#include <ctype.h> /* funo toupper */
int main (void) {
int c;
char entrada[121]; /* armazena nome do arquivo de entrada */
char saida[121]; /* armazena nome do arquivo de sada */
FILE* e; /* ponteiro do arquivo de entrada */
FILE* s; /* ponteiro do arquivo de sada */
/* pede ao usurio os nomes dos arquivos */
printf(Digite o nome do arquivo de entrada: );
scanf(%120s,entrada);
printf(Digite o nome do arquivo de saida: );
scanf(%120s,saida);
/* abre arquivos para leitura e para escrita */
e = fopen(entrada,rt);
if (e == NULL) {
printf(No foi possvel abrir arquivo de entrada.\n);
return 1;
}
s = fopen(saida,wt);
if (s == NULL) {
printf(No foi possvel abrir arquivo de saida.\n);
fclose(e);
return 1;
}
e-Tec Brasil Aula 2 Funes, matrizes, ponteiros e arquivos 51
/* l da entrada e escreve na sada */
while ((c = fgetc(e)) != EOF)
fputc(toupper(c),s);
/* fecha arquivos */
fclose(e);
fclose(s);
return 0;
}
2.4.7 Acesso linha a linha
Em diversas aplicaes, mais adequado tratar o contedo do arquivo linha
a linha. Um caso simples que podemos mostrar consiste em procurar a ocor-
rncia de uma sub-cadeia de caracteres dentro de um arquivo (anlogo a o
que feito pelo utilitrio grep dos sistemas Unix). Se a sub-cadeia for encon-
trada, apresentamos como sada o nmero da linha da primeira ocorrncia.
Para implementar esse programa, vamos utilizar a funo strstr, que procura
a ocorrncia de uma sub-cadeia numa cadeia de caracteres maior. A funo
retorna o endereo da primeira ocorrncia ou NULL, se a sub-cadeia no for
encontrada. O prottipo dessa funo :
char* strstr (char* s, char* sub);
A nossa implementao consistir em ler, linha a linha, o contedo do arqui-
vo, contanto o nmero da linha. Para cada linha, verifcamos se a ocorrncia
da sub-cadeia, interrompendo a leitura em caso afrmativo.
/* Procura ocorrncia de sub-cadeia no arquivo */
#include <stdio.h>
#include <string.h> /* funo strstr */
int main (void) {
int n = 0; /* nmero da linha corrente */
int achou = 0; /* indica se achou sub-cadeia */
char entrada[121]; /* armazena nome do arquivo de entrada */
char subcadeia[121]; /* armazena sub-cadeia */
char linha[121]; /* armazena cada linha do arquivo */
Estrutura de Dados e-Tec Brasil 52
FILE* fp; /* ponteiro do arquivo de entrada */
/* pede ao usurio o nome do arquivo e a sub-cadeia */
printf(Digite o nome do arquivo de entrada: );
scanf(%120s,entrada);
printf(Digite a sub-cadeia: );
scanf(%120s,subcadeia);
/* abre arquivos para leitura */
fp = fopen(entrada,rt);
if (fp == NULL) {
printf(No foi possvel abrir arquivo de entrada.\n);
return 1;
}
/* l linha a linha */
while (fgets(linha,121,fp) != NULL) {
n++;
if (strstr(linha,subcadeia) != NULL) {
achou = 1;
break;
}
}
/* fecha arquivo */
fclose(fp);
/* exibe sada */
if (achou)
printf(Achou na linha %d.\n, n);
else
printf(Nao achou.);
return 0;
e-Tec Brasil Aula 2 Funes, matrizes, ponteiros e arquivos 53
2.4.8 Acesso via palavras chave
Quando os objetos num arquivo tm descries de tamanhos variados, co-
mum adotarmos uma formatao com o uso de palavras chave. Cada objeto
precedido por uma palavra chave que o identifca. A interpretao desse tipo de
arquivo pode ser feita lendo-se as palavras chave e interpretando a descrio do
objeto correspondente. Para ilustrar, vamos considerar que, alm de retngulos,
tringulos e crculos, tambm temos polgonos quaisquer no nosso conjunto de
fguras geomtricas. Cada polgono pode ser descrito pelo nmero de vrtices
que o compe, seguido das respectivas coordenadas desses vrtices.
O fragmento de cdigo a seguir ilustra a interpretao desse formato, onde
fp representa o ponteiro para o arquivo aberto para leitura.
...
FILE* fp;
char palavra[121];
...
while (fscanf(fp,%120s,palavra) == 1) {
if (strcmp(palavra,RETANGULO)==0) {
/* interpreta retngulo */
}
else
if (strcmp(palavra,TRIANGULO)==0) {
/* interpreta tringulo */
}
else
if (strcmp(palavra,CIRCULO)==0) {
/* interpreta crculo */
}
else
Estrutura de Dados e-Tec Brasil 54
if (strcmp(palavra,POLIGONO)==0) {
/* interpreta polgono */
}
else { /* trata erro de formato */
}
}
2.4.9 Arquivos em modo binrio
Arquivos em modo binrio servem para salvarmos (e depois recuperarmos)
o contedo da memria principal diretamente no disco. A memria escrita
copiando-se o contedo de cada byte da memria para o arquivo. Uma das
grandes vantagens de se usar arquivos binrios que podemos salvar (e
recuperar) uma grande quantidade de dados de forma bastante efciente.
Neste curso, vamos apenas apresentar as duas funes bsicas para manipu-
lao de arquivos binrios.
2.4.10 Funo para salvar e recuperar
Para escrever (salvar) dados em arquivos binrios, usamos a funo fwrite. O
prottipo dessa funo pode ser simplifcado por:
int fwrite (void* p, int tam, int nelem, FILE* fp);
O primeiro parmetro dessa funo representa o endereo de memria cujo
contedo deseja-se salvar em arquivo. O parmetro tam indica o tamanho,
em bytes, de cada elemento e o parmetro nelem indica o nmero de ele-
mentos. Por fm, passa-se o ponteiro do arquivo binrio para o qual o conte-
do da memria ser copiado.
A funo para ler (recuperar) dados de arquivos binrios anloga, sendo
que agora o contedo do disco copiado para o endereo de memria pas-
sado como parmetro. O prottipo da funo pode ser dado por:
int fread (void* p, int tam, int nelem, FILE* fp);
Para exemplifcar a utilizao dessas funes, vamos considerar que uma
aplicao tem um conjunto de pontos armazenados num vetor. O tipo que
defne o ponto pode ser:
e-Tec Brasil Aula 2 Funes, matrizes, ponteiros e arquivos 55
struct ponto {
foat x, y, z;
};
typedef struct ponto Ponto;
Uma funo para salvar o contedo de um vetor de pontos pode receber como
parmetros o nome do arquivo, o nmero de pontos no vetor, e o ponteiro
para o vetor. Uma possvel implementao dessa funo ilustrada abaixo:
void salva (char* arquivo, int n, Ponto* vet) {
FILE* fp = fopen(arquivo,wb);
if (fp==NULL) {
printf(Erro na abertura do arquivo.\n);
exit(1);
}
fwrite(vet,sizeof(Ponto),n,fp);
fclose(fp);
}
A rigor, os tipos int so substitudos pelo tipo size_t, defnido pela biblioteca
padro, sendo, em geral, sinnimo para um inteiro sem sinal (unsigned int).
Resumo
Nesta aula abordamos as principais implementaes da linguagem de pro-
gramao C, aprendemos ainda como criar funes ou sub-rotinas, a mani-
pulao de matrizes, a implementao de programas utilizando ponteiros.
Por fm, aprendemos a criar novos tipo de dados implementado registro e
manipulando arquivos. Alm de exemplos prticos do nosso dia-a-dia, a fm
de disponibilizar ao leitor um excelente embasamento terico.
Assista video-aula da disciplina
de Estrutura de Dados disponvel
em http://cefetpi.nucleoead.net/
etapi/. Aproveite para revisar os
contedos da aula sobre Funes,
Matrizes, Ponteiros e Arquivos.
Estrutura de Dados e-Tec Brasil 56
Atividades de aprendizagem
1. Fazer um programa que calcule o volume de uma esfera, sendo que o volu-
me de uma esfera raio*raio*raio. Crie uma funo que faa esse clculo.
2. Elabore programa que leia n nmeros digitados e apresente sua mdia.
3. Com base no estudo de Ponteiros, qual das opes a baixo correto
afrmar?
a) Ponteiro uma varivel que armazena endereo.
b) Ponteiro o valor de uma varivel.
c) Ponteiro o indicador da prxima varivel a ser passada.
d) Ponteiro o endereo que aponta para uma varivel.
4. Quais das seguintes instrues declaram um ponteiro para uma
varivel foat?
a) Float p
b) Float *p
c) *Float p
d) Float* p
5. O seguinte programa est correto? Justifque.
#include <stdio.h>
const int VAL=123;
int main() {
int *p = VAL;
printf(%d \n, *p);
return 0;
}
e-Tec Brasil Aula 2 Funes, matrizes, ponteiros e arquivos 57
e-Tec Brasil
Aula 3 Viso geral de estrutura
de dados e lista linares
Objetivos
Conceituar estrutura de dados.
Descrever os tipos de estrutura de dados.
Implementar as operaes bsicas da estrutura de dados do tipo
lista esttica e dinmica de ordenao e desordenao.
3.1 Introduo
Em um projeto de software, existem dois aspectos que devem ser estudados:
os procedimentos que devem ser previstos pelo software e sobre que dados
estes procedimentos iro atuar.
Nas tcnicas estruturadas de projeto de software era dada nfase aos proce-
dimentos, com a identifcao dos aspectos funcionais na primeira etapa de
desenvolvimento do software.
Com as tcnicas para especifcao dos dados a nvel conceitual, a importncia
dos procedimentos e dados tornou-se equilibrada. Atualmente, j existem tcni-
cas de programao com nfase nos dados (programao baseada em objetos).
Mas, independentemente das tcnicas de anlise e programao utilizadas,
programas precisam manipular dados e extremamente importante o co-
nhecimento de conceitos e detalhes da implementao das diversas estrutu-
ras de dados que manipulam estes dados.
Neste texto, inicialmente, alguns conceitos bsicos so apresentados. A seguir,
so descritas as principais Estruturas de Dados, com seus respectivos algoritmos.
3.2 Conceitos bsicos
Nesta seo sero apresentados conceitos essenciais para o desenvolvimento
desta disciplina: tipos de dados, tipos abstratos de dados e estruturas de dados.
e-Tec Brasil Aula 3 Viso geral de estrutura de dados e lista linares 59
3.2.1 Tipos de dados
Em computao precisamos identifcar os tipos de dados que o computa-
dor, a linguagem de programao ou mesmo um algoritmo so capazes de
entender. De uma forma geral, os tipos de dados so diferenciados pelos
valores que podem assumir e pelo conjunto de operaes que podemos
efetuar com eles.
Em linguagens de programao o tipo de dados de uma varivel defne o
conjunto de valores que esta varivel pode assumir. Uma varivel do tipo
lgico, por exemplo, pode assumir dois valores: verdadeiro ou falso. As pos-
sibilidades do hardware so previstas pela linguagem.
Os tipos de dados so divididos em: tipos primitivos de dados e tipos estru-
turados de dados.
Os tipos primitivos de dados so os tipos bsicos, a partir dos quais pode-
mos defnir os demais tipos e estruturas de dados. Estes tipos de dados so
os mais frequentes nas linguagens de programao e tem um conjunto de
valores e operaes restrito.
So considerados tipos primitivos de dados:
I. Inteiro - representa uma quantidade que pode ser contada.
II. Real - representa um valor que pode ser fracionado.
III. Lgico - pode representar dois estados (verdadeiro ou falso).
IV. Caracter - pode representar dgitos, letras ou sinais.
V. Ponteiro - representa o endereo de um dado na memria.
Os tipos estruturados de dados so construdos a partir dos tipos primitivos.
Estes tipos so previstos por muitas linguagens de programao e devem ser
defnidos pelo programador. Exemplos de tipos estruturados: array e regis-
tro. Estes dois tipos so formados por tipos bsicos como inteiros, caracteres,
reais, etc.
Uma declarao de varivel em uma linguagem de programao como C
especifca duas coisas:
Estrutura de Dados e-Tec Brasil 60
I. Quantos bytes devem ser reservados para armazenar esta varivel (Ex.: no
caso de uma varivel inteira, deve ser reservado um espao que garanta que
o maior inteiro permitido poder ser representado).
II. Como estes bytes devem ser interpretados (Ex.: uma cadeia de bits pode
ser interpretada como um inteiro ou um real).
Assim, tipos de dados podem ser vistos como mtodos para interpretar o
contedo da memria do computador.
3.2.2 Tipos abstratos de dados
O conceito de tipo de dados pode ser visto de outra perspectiva: levando
em conta, no o que um computador pode fazer, mas o que os usurios
desejam fazer. Este conceito de tipo de dados independente do hardware
chamado de Tipo Abstrato de Dados - TAD.
Um tipo abstrato de dados composto por um modelo matemtico acom-
panhado de um conjunto de operaes defnidas sobre este modelo.
Uma vez que um TAD defnido e as operaes associadas a este tipo so
especifcadas, pode-se implementar este tipo de dado.
3.2.3 Estruturas de dados
Um algoritmo projetado em termos de tipos abstratos de dados. Para im-
plement-los numa linguagem de programao necessrio encontrar uma
forma de represent-los nessa linguagem, utilizando tipos e operaes su-
portadas pelo computador. Para representar o modelo matemtico do TAD,
em uma linguagem de programao, emprega-se uma estrutura de dados.
As estruturas de dados diferem umas das outras pela disposio ou manipu-
lao de seus dados. A disposio dos dados em uma estrutura obedece a
condies preestabelecidas e caracteriza a estrutura.
Assim, Estrutura de Dados um mtodo particular de se implementar um
TAD. A implementao de um TAD escolhe uma estrutura de dados (ED)
para represent-lo. Cada ED pode ser construda a partir de tipos bsicos
(inteiro, real, caracter) ou estruturada (array, registro) de uma determinada
linguagem de programao.
O estudo de estruturas de dados no pode ser desvinculado de seus aspectos
algortmicos. A escolha correta da estrutura adequada a cada caso depende
e-Tec Brasil Aula 3 Viso geral de estrutura de dados e lista linares 61
diretamente do conhecimento de algoritmos para manipular a estrutura de
maneira efciente.
As estruturas de dados de tipos de dados estruturadas se dividem em homo-
gneos (vetores e matrizes) e heterogneos (registros).
As estruturas homogneas so conjuntos de dados formados pelo mesmo
tipo de dado primitivo. E as estruturas heterogneas so conjuntos de dados
formados por tipos de dados primitivos diferentes (campos do registro) em
uma mesma estrutura. A escolha de uma estrutura de dados apropriada
pode tornar um problema complicado em um de soluo bastante trivial. O
estudo das estruturas de dados est em constante desenvolvimento (assim
como o de algoritmos), mas, apesar disso, existem certas estruturas clssicas
que se comportam como padres.
Estruturas de dados clssicas:
I. Lista.
II. Pilha.
III. Fila.
IV. rvores.
Nas prximas sees sero apresentados as principais Estruturas de Dados uti-
lizadas para representar listas, pilhas, flas e rvores. Alm disso, sero apresen-
tados os algoritmos que devem ser utilizados para manipular estas estruturas.
3.2.4 Listas lineares
Uma das formas mais comumente usadas para se manter dados agrupados
a lista. Afnal, quem nunca organizou uma lista de compras antes de ir ao
mercado, ou ento uma lista dos amigos que participaro da festa? As listas
tm-se mostrado um recurso bastante til e efciente no dia-a-dia das pesso-
as. Em computao, no tem sido diferente: a lista uma das estruturas de
dados mais empregadas no desenvolvimento de programas.
Ao desenvolver uma implementao para listas lineares, o primeiro proble-
ma que surge : como podemos armazenar os elementos da lista, dentro do
computador?
Estrutura de Dados e-Tec Brasil 62
Sabemos que antes de executar um programa, o computador precisa carre-
gar seu cdigo executvel para a memria. Da rea de memria que reser-
vada para o programa, uma parte usada para armazenar as instrues a se-
rem executadas e a outra destinada ao armazenamento dos dados. Quem
determina quanto de memria ser usado para as instrues o compilador.
Alocar rea para armazenamento de dados, entretanto, responsabilidade
do programador.
Uma lista linear pode ser implementada usando vetores ou ponteiros. Se
for implementada usando vetores, deve estipular qual a quantidade de ele-
mentos que a lista pode armazenar. A memria para armazenamento dos
dados alocada em tempo de compilao. Quando implementada usando
ponteiros, a memria alocada conforme novos elementos so colocados
na lista e desalocada quando elementos so retirados. Ou seja, vai alocando
memria dinamicamente, em tempo de execuo.
3.2.4.1 Tipos de listas lineares
I. Lista esttica desordenada.
II. Lista esttica ordenada.
III. Lista dinmica desordenada.
IV. Lista dinmica ordenada.
a) Lista esttica desordenada
Na lista desordenada os elementos so colocados na primeira posio
vazia da lista (normalmente, no fnal). Na lista ordenada, escolhido um
dado que ser o campo de ordenao da lista. Quando se deseja inserir
um novo elemento na lista, primeiro tem que ser verifcado em que local
ele dever ser colocado para que seja mantida a ordem da lista.
Operaes bsicas das listas: inserir elemento, remover elemento, con-
sultar elemento, alterar elemento, listagem dos elementos da lista.
Esta estrutura implementada usando vetores e no se preocupa com orde-
nao. Os elementos so colocados na estrutura por ordem de chegada. Nas
prximas sees ser descrita cada uma das operaes feitas nesta estrutura.
No exemplo, teremos uma lista com os dados dos alunos de uma turma (para
simplifcar, cada aluno tem apenas a matrcula, nome e seu polo).
e-Tec Brasil Aula 3 Viso geral de estrutura de dados e lista linares 63
Operaes bsicas
I. Inserir elemento
A Figura 3.1 ilustra a insero de trs elementos em uma lista esttica desorde-
nada. Inicialmente o vetor est vazio. O primeiro elemento a chegar o aluno
Jos com matrcula 256. Este ser colocado na primeira posio do vetor.
Vetor Vazio
1 2 3 4 5 6 7 8
256/
Jos
132/
Ana
429/
Paulo
1 2 3 4 5 6 7 8
256/
Jos
132/
Ana
Insero do Aluno de matrcula 429 e nome Paulo
Insero do Aluno de matrcula 132 e nome Ana
Insero do Aluno de matrcula 256 e nome Jos
1 2 3 4 5 6 7 8
256/
Jos
132/
Ana
429/
Paulo
1 2 3 4 5 6 7 8
256/
Jos
132/
Ana
Figura 3.1: Insero da lista esttica desordenada
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
Posteriormente, chegam mais dois alunos (Ana com matrcula 132 e Paulo
com matrcula 429), que so colocados nas prximas posies disponveis
do vetor (posio 2 e posio 3). Quando uma insero vai ser executada,
necessrio verifcar se o vetor tem posies disponveis. Caso contrrio, a
insero no pode ser efetuada.
O cdigo abaixo, implementado est em linguagem C, inserir um novo
aluno lista:
//Inserir novo aluno
void inserir() {
int cont;
do{
cabec();
Estrutura de Dados e-Tec Brasil 64
printf(\nInserir Novo Aluno\n\n);
if (qa < maximo) { // verifca se o vetor pode receber novo aluno
printf(\nMatricula do Aluno: );
scanf(%d,&turma[qa].mat);
printf(\nNome: );
ffush(stdin);
gets(turma[qa].nome);
printf(\nPolo: );
scanf(%s,&turma[qa].polo);
qa++;
printf(\n\nAluno Inserido com Sucesso!!!\n\n);
}
else { // vetor cheio
printf(\n\n\aNao Pode Inserir - Turma Cheia!!!\n\n);
getche();
break;
}
printf(\n\nInserir outro(1-sim/2-nao)? );
scanf(%d,&cont);
}while (cont == 1);
}
II. Consultar elemento
Depois que um elemento inserido, a operao mais executada a con-
sulta. Para a consulta necessrio saber qual elemento deseja consultar.
Neste caso faremos uma consulta por matrcula. Para isso, a matrcula do
aluno a ser consultado deve ser lida. feita uma pesquisa em todas as
posies ocupadas do vetor, a procura do elemento.
e-Tec Brasil Aula 3 Viso geral de estrutura de dados e lista linares 65
Vetor
1 2 3 4 5 6 7 8
256/
Jos
132/
Ana
429/
Paulo
578/
Maria
527/
Joo
514/
Sara
Figura 3.2: Consulta da lista esttica desordenada
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
No vetor da Figura 3.2 temos seis elementos. Vamos consultar o elemento
de matrcula 578. Para encontr-lo, temos que varrer o vetor desde o seu
incio e paramos na posio 4 que a posio onde ele se encontra. Caso
quisssemos consultar o elemento de matrcula 192, iramos varrer todo o
vetor, elemento a elemento e ao chegar na sexta posio (que a ultima)
fcaramos sabendo que este elemento no se encontra no vetor. Quando
um elemento encontrado, seus dados so apresentados e quando ele no
est no vetor, uma mensagem de erro deve ser dada ao usurio.
O cdigo abaixo, implementado est em linguagem C, realiza um consulta
de um determinado aluno:
//Consultar aluno cadastrado por matricula
void consultarmat() {
int i, matcon, achou, cont;
do {
cabec();
printf(\nConsultar Aluno por Matricula\n\n);
printf(\nMatricula do Aluno: );
scanf(%d,&matcon);
achou = procura(matcon);
if (achou != -1)
mostre(achou);
else // aluno nao foi encontrado
printf(\n\n\aNumero de Matricula Incorreto!!!!!!\n);
printf(\n\nConsultar outro(1-sim/2-nao)? );
scanf(%d,&cont);
} while (cont == 1);
}
Estrutura de Dados e-Tec Brasil 66
III. Remover elemento
Caso um elemento no precise mais fazer parte da estrutura, ele pode
ser removido. Para remover os dados de um elemento necessrio saber
qual elemento deseja remover. J que iremos Neste caso faremos a busca
por matrcula. Para isso, a matrcula do aluno a ser removido deve ser lida.
feita uma pesquisa em todas as posies ocupadas do vetor, a procura
da matrcula. Assim que o elemento encontrado, seus dados devem ser
apresentados ao usurio (neste caso a matrcula e o nome).
Dessa forma ele pode verifcar se realmente aquele o elemento a ser re-
movido. Quando o elemento no encontrado, uma mensagem de erro
deve ser dada ao usurio. Numa lista desordenada, para a remoo ser
efetuada, o ltimo elemento do vetor deve ser transferido para a posio
do elemento removido, conforme Figura 3.3 a seguir.
Vetor antes da Remoo
Vetor depois da Remoo
Remover aluno de matrcula 132
1 2 3 4 5 6 7 8
256/
Jos
132/
Ana
429/
Paulo
578/
Maria
127/
Joo
314/
Sara
1 2 3 4 5 6 7 8
256/
Jos
132/
Ana
429/
Paulo
578/
Maria
127/
Joo
314/
Sara
1 2 3 4 5 6 7 8
256/
Jos
429/
Paulo
578/
Maria
127/
Joo
314/
Sara
Figura 3.3: Remoo da lista esttica desordenada
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados

O cdigo abaixo, implementado est em linguagem C, realiza uma remo-
o aluno:
//Remover aluno cadastrado
void remover() {
int matrem, i, cont, achou, conrem;
do{
cabec();
printf(\nRemover Aluno\n\n);
e-Tec Brasil Aula 3 Viso geral de estrutura de dados e lista linares 67
printf(\nMatricula do Aluno: );
scanf(%d,&matrem);
achou = procura(matrem);
if (achou != -1) {
mostre(achou);
printf(\nDeseja remover o aluno (1-sim/2-nao)? );
scanf(%d,&conrem);
if (conrem==1) { // verifca se quer remover
turma[i]= turma[qa-1];
qa--;
printf(\n\nAluno removido com Sucesso!!!\n);
}
else
printf(\n\n\aO aluno nao foi removido!!!\n);
break;
}
else // aluno nao foi encontrado
printf(\n\naNumero de Matricula Incorreto!!!!!!\n);
printf(\n\nRemover outro(1-sim/2-nao)? );
scanf(%d,&cont);
}while (cont == 1);
}
IV. Listagem de todos os elementos
A operao de listagem possibilita a visualizao dos dados de todos os
elementos cadastrados. feita uma varredura no vetor e todos os dados
de todos os elementos so apresentados ao usurio. Caso a lista esteja
vazia, ser apresentada uma mensagem.
O cdigo abaixo representa a impresso de todos os elementos:
Estrutura de Dados e-Tec Brasil 68
//Imprimir relatrio com as informaes de todos alunos
void listagem() {
int i;
cabec();
printf(\nRelatorio Geral\n);
printf(\n\nMatricula Aluno Polo );
printf(\n---------------------------------------------);
for(i = 0; i < qa; i++)
printf(\n%9d %-20s %-10s, turma[i].mat, turma[i].nome,
turma[i].polo);
printf(\n---------------------------------------------);
printf(\n\nDigite qualquer tecla para sair... );
getche();
}

A implementao do cdigo completo de lista esttica desordenada na lin-
guagem C estar disponibilizado no AVEA em formatos .pdf e .cpp!
b) Lista esttica ordenada
Nesse tipo de lista, os elementos devem ser colocados na estrutura obedecen-
do a uma ordenao. Qualquer operao feita na estrutura, no pode afetar
na ordenao da mesma. A vantagem dessa lista ser notada principalmente
nos momentos que necessite percorrer a lista a procura de algum elemento.
Aqui, o programa anterior ser modifcado, fazendo com que os alunos
sejam armazenados no vetor por ordem de matrcula.
Esta estrutura implementada usando vetores e se preocupa com or-
denao. Os elementos so colocados na estrutura usando uma funo
procurando a posio correta de insero na ordem crescente. Nas prxi-
mas sees ser descrita cada uma das operaes feitas nesta estrutura.
No exemplo, teremos uma lista com os dados dos alunos de uma turma
(para simplifcar, cada aluno tem apenas a matrcula, nome e seu polo).
e-Tec Brasil Aula 3 Viso geral de estrutura de dados e lista linares 69
Operaes bsicas
I. Inserir elemento
Para inserir um elemento em uma lista ordenada podem ocorrer cinco pos-
sibilidades:
I. A lista est cheia: nesse caso a insero cancelada.
II. A lista est vazia: o elemento colocado na primeira posio do vetor.
III. O elemento a ser inserido menor do que o primeiro da lista.
IV. O elemento a ser inserido maior do que o ultimo da lista.
V. O elemento novo ser inserido entre elementos da lista.
A Figura 3.4 ilustra a insero de quatro elementos em uma lista esttica
ordenada. Inicialmente o vetor est vazio e o primeiro elemento a chegar
o aluno Jos com matrcula 256, conforme a Figura 3.4a e est insero
ser colocada na primeira posio do vetor. Posteriormente, conforme Fi-
gura 34.b, chega Ana com matrcula 132.
Para que a lista fque ordenada, deve verifcar em qual posio o elemento
deve ser inserido. Nesse caso, a matrcula 132 menor que 256 (que a
primeira da lista). Assim, todos os elementos a partir da posio onde o
elemento de matrcula 256 se encontra, devem se deslocar uma posio,
abrindo espao para o elemento ser inserido.
Agora de acordo com a Figura 3.4c chega o elemento de matrcula 429.
Esta matrcula maior do que todas as matrculas do vetor, portanto, ele
inserido no fnal do vetor, sem necessidade de deslocamentos. E por fnal,
chega o elemento de matrcula 197 que ser inserido no espao confor-
meFigura 3.4d.
Devemos descobrir onde se encontra o primeiro elemento maior do que o
que ser inserido, ou seja, seu sucessor imediato. Neste caso, ele deve en-
trar na posio do elemento de matrcula 256. O espao deve ser liberado,
fazendo-se necessrio o deslocamento de todos os elementos a partir do
elemento de matrcula 256. A principal questo da insero ordenada
descobrir o local onde o elemento deve ser inserido e, se necessrio, fazer
os deslocamentos.
Estrutura de Dados e-Tec Brasil 70
Vetor Vazio
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8
256/
Jos
Insero do Aluno de matrcula 256 e nome Jos
Figura 3.4a: Insero da lista esttica ordenada
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
1 2 3 4 5 6 7 8
256/
Jos
1 2 3 4 5 6 7 8
132/
Ana
256/
Jos
Insero do Aluno de matrcula 132 e nome Ana
Figura 3.4b: Insero da lista esttica ordenada
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
Insero do Aluno de matrcula 429 e nome Paulo
1 2 3 4 5 6 7 8
132/
Ana
256/
Jos
429/
Paulo
Figura 3.4c: Insero da lista esttica ordenada
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
1 2 3 4 5 6 7 8
256/
Jos
429/
Paulo
429/
Paulo
1 2 3 4 5 6 7 8
132/
Ana
197/
Maria
132/
Ana
256/
Jos
Insero do Aluno de matrcula 197 e nome Maria
Figura 3.4d: Insero da lista esttica ordenada
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
O cdigo a seguir, implementado est em linguagem C, inseri um novo alu-
no lista:
e-Tec Brasil Aula 3 Viso geral de estrutura de dados e lista linares 71
// Inserir um novo aluno na escola
void inserir() {
int cont;
do{
cabec();
printf(\nInserir Novo Aluno\n);
if (qa < maximo) { // verifca se o vetor pode receber novo aluno
printf(\nMatricula do Aluno: );
scanf(%d,&al.mat);
printf(\nNome: );
ffush(stdin);
gets(al.nome);
printf(\nPolo: );
scanf(%s,&al.polo);
colocarordem();
qa++;
printf(\n\nAluno Inserido com Sucesso!!!\n);
}
else { // vetor cheio
printf(\n\n\aNao Pode Inserir - Turma Cheia!!!\n);
getche();
break;
}
printf(\n\nContinuar inserindo aluno (1-sim/2-nao)? );
scanf(%d,&cont);
}while (cont == 1);
}
Estrutura de Dados e-Tec Brasil 72
II. Consultar elemento
Na Figura 3.5 a matrcula do aluno a ser consultado deve ser lida. feita
uma varredura em todas as posies ocupadas do vetor, a procura da ma-
trcula. No caso de uma lista ordenada, se estivssemos procurando um
aluno de matrcula 120, assim que fzssemos a leitura da primeira matr-
cula do vetor, j saberamos que a matrcula 120 no est no vetor, evitan-
do uma varredura at o fnal do vetor. Na estrutura ordenada, as consultas
so mais efcientes.
Vetor
1 2 3 4 5 6 7 8
256/
Jos
132/
Ana
429/
Paulo
578/
Maria
527/
Joo
514/
Sara
Figura 3.5: Consulta da lista esttica ordenada
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
O cdigo abaixo, implementado est em linguagem C, realiza um consul-
ta de um determinado aluno:
//Consultar um aluno da escola
void consultar() {
int matcon, achou, continuar;
do{
cabec();
printf(\nConsultar Aluno\n\n);
printf(\nMatricula do Aluno: );
scanf(%d,&matcon);
achou = procura(matcon);
if (achou!=-1)
mostre(achou);
else
printf(\n\n\aNumero de Matricula Incorreto!!!!!!\n);
e-Tec Brasil Aula 3 Viso geral de estrutura de dados e lista linares 73
printf(\n\nContinuar consultando aluno(1-sim/2-nao)? );
scanf(%d,&continuar);
}while (continuar == 1);
}

III. Remover elemento
Comeamos com a leitura da matrcula do aluno a ser removido. feita
uma varredura em todas as posies ocupadas do vetor, a procura da
matrcula. Assim que o elemento encontrado, seus dados devem ser
apresentados ao usurio (neste caso a matrcula e o nome). Dessa for-
ma ele pode verifcar se realmente aquele o elemento a ser removido.
Quando o elemento no encontrado, uma mensagem de erro deve ser
dada ao usurio.
No exemplo da Figura 3.6 a seguir, desejamos remover o elemento de
matrcula 256. Para que a lista fque contnua e ordenada, todos os ele-
mentos que vem depois do elemento que ser removido, devem ser tra-
zidos uma posio a frente.
Vetor antes da Remoo
Vetor depois da Remoo
Remover aluno de matrcula 256
1 2 3 4 5 6 7 8
256/
Jos
132/
Ana
429/
Paulo
197/
Maria
527/
Joo
714/
Sara
1 2 3 4 5 6 7 8
256/
Jos
132/
Ana
429/
Paulo
197/
Maria
527/
Joo
714/
Sara
1 2 3 4 5 6 7 8
132/
Ana
429/
Paulo
197/
Maria
527/
Joo
714/
Sara
Figura 3.6: Remoo da lista esttica ordenada
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
O cdigo abaixo, implementado est em linguagem C, realiza uma remo-
o aluno:
Estrutura de Dados e-Tec Brasil 74
// Remover um aluno da escola
void remover() {
int matrem, i, achou, continuar, conrem;
do{
cabec();
printf(\nRemover Aluno\n\n);
printf(\nMatricula do Aluno: );
scanf(%d,&matrem);
achou = procura(matrem);
if (achou!=-1) {
mostre(achou);
printf(\nDeseja remover o aluno (1-sim/2-nao)? );
scanf(%d,&conrem);
if (conrem == 1) {
for (i=achou;i<qa;i++)
turma[i]=turma[i+1];
qa--;
printf(\n\nAluno removido com Sucesso!!!\n);
}
else
printf(\n\n\aO aluno nao foi removido!!!\n);
}
else
printf(\n\n\aNumero de Matricula Incorreto!!!!!!\n);
printf(\n\nContinuar removendo aluno (1-sim/2-nao)? );
e-Tec Brasil Aula 3 Viso geral de estrutura de dados e lista linares 75
scanf(%d,&continuar);
}while (continuar == 1);
}
IV. Listagem de todos os elementos
A operao de listagem possibilita a visualizao dos dados de todos os
elementos cadastrados. feita uma varredura no vetor e todos os dados
de todos os elementos so apresentados ao usurio.
O cdigo abaixo representa a impresso de todos os elementos:
//Imprimir o relatorio contendo os dados de todos os alunos
void listagem() {
int i;
foat soma=0;
cabec();
printf(\nRelatorio Geral\n);
printf(\nMatricula Aluno Polo);
printf(\n--------------------------------------------);
for(i = 0; i<qa; i++)
printf(\n%9d %-20s %-10s, turma[i].mat, turma[i].nome, turma[i].
polo);
printf(\n--------------------------------------------);
printf(\n\nDigite qualquer tecla para sair);
getch();
}
A implementao do cdigo completo de lista esttica ordenada na linguagem
C estar disponibilizado junto a plataforma AVEA em formatos .pdf e .cpp!
Estrutura de Dados e-Tec Brasil 76
Vamos praticar, atravs do cdigo completo do contedo visto at o mo-
mento da aula 3 disponvel no AVEA, implemente um novo programa tro-
cando variveis alunos, matricula e polo por pessoa, rg e endereo.
c) Lista dinmica desordenada
Esta lista implementada usando ponteiros. A memria para armazenar
os dados alocada em tempo de execuo. Na prxima seo ser des-
crito o funcionamento de cada uma das operaes bsicas. O referido
programa faz o cadastro dos alunos de uma turma em uma lista usando
ponteiros. Esta lista possui dois ponteiros, um que guarda o endereo do
primeiro elemento da lista (inicio) e outro que guarda o endereo do
ltimo elemento da lista (fm).
Operaes bsicas
I. Inserir elemento
A Figura 3.7 ilustra a insero de trs elementos em uma lista dinmica
desordenada. Inicialmente a lista est vazia, portanto o valor do ponteiro
inicio e fm NULL (passo 1). Quando um elemento vai ser inserido, a
memria alocada e os dados so armazenados (passo 2). Todo n criado
em uma lista dinmica desordenada, no tem vizinho seguinte, por isso
ele aponta para NULL. Na insero do primeiro elemento, os ponteiros
inicio e fm apontam para este elemento (no exemplo, endereo 1010).
NULL
NULL
NULL
NULL
NULL
1010
1010
1010
1010
1010
10/Ana
10/Ana
INCIO
FIM
INCIO
FIM
INCIO
FIM
INCIO
FIM
1
2
3
4
10/Ana
22/Jlia
22/Jlia 17/Paulo
1040
1040
1080
1010
1010
1080
1040
Figura 3.7: Insero da lista dinmica desordenada
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
e-Tec Brasil Aula 3 Viso geral de estrutura de dados e lista linares 77
No (passo 3) temos a chegada de um outro elemento. A memria alo-
cada e o novo n tem os dados preenchidos e tem que ser anexado aos
outros ns da lista. Todo n que chega aponta para NULL e o ponteiro
fm passa a ter o endereo do n que acabou de chegar. O n que ante-
riormente era o ltimo da lista (1010) passar a ter como vizinho o n que
acabou de chegar (ou seja, aponta para 1040).
O (passo 4) mostra uma outra insero de n. Veja que a cada novo ele-
mento, apenas o endereo do ponteiro fm modifcado. O ponteiro inicio
permanece com o mesmo valor.
O cdigo abaixo, implementado est em linguagem C, insere um novo aluno
lista:
/* Funcao para inserir um novo no, ao fnal da lista */
void inserir () {
TAluno *novono;
int i, matl, continuar;
char nomel[20];
do{
cabec();
printf(\n Inserir novo aluno \n);
printf(\n Matricula: );
scanf(%d,&matl);
printf(\n Nome: );
ffush(stdin);
gets(nomel);
ffush(stdin);
qa++;
Estrutura de Dados e-Tec Brasil 78
//Aloca memoria para o novo aluno e coloca os dados
novono = (TAluno *)malloc(sizeof(TAluno));
novono->mat = matl;
for (i=0;i<=19;i++)
novono->nome[i] =nomel[i];
novono->prox = NULL;
// Inserir novono na lista de alunos
if (inicio == NULL) {
inicio = novono;
fm = novono;
}
else {
fm->prox = novono;
fm = novono;
}
printf(\n\nInserido com Sucesso!!!!\n);
printf(\nContinuar inserindo (1-sim/2-nao)? );
scanf(%d,&continuar);
}while (continuar == 1);
}

II. Consultar elemento
Para fazer uma consulta em uma lista dinmica necessrio saber qual
elemento deseja consultar. Neste caso faremos uma consulta por matrcu-
la. Um ponteiro auxiliar ser usado para percorrer a lista, visitando cada
n a procura do elemento.
e-Tec Brasil Aula 3 Viso geral de estrutura de dados e lista linares 79
NULL
1010
10/Ana
INCIO
FIM
1
22/Jlia 14/Mrio
1040 1050
1010
1080
12/Vera
1070
17/Paulo
1080
NULL
1010
10/Ana
INCIO
FIM
2
22/Jlia
14/Mrio
1040
1050
1040
1080
12/Vera
1070
17/Paulo
1080
NULL 22/Jlia
14/Mrio
1040 1050
12/Vera
1070
17/Paulo
1080
Figura 3.8: Consulta da lista dinmica desordenada
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
Na Figura 3.8 temos uma lista com trs elementos. Caso quisssemos con-
sultar o elemento de matrcula 25, iramos percorrer a lista at chegar ao lti-
mo n, cujo endereo do vizinho NULL (n de endereo 1080) e fcaramos
sabendo que este elemento no se encontra na lista. Quando um elemento
encontrado, seus dados so apresentados e quando ele no est na lista,
uma mensagem de erro deve ser dada ao usurio.
O cdigo abaixo, implementado est em linguagem C, realiza um consulta
de um determinado aluno:
/* Consultar um aluno na lista */
void consultar() {
int matc, continuar, achou=0;
do{
cabec();
printf(\nConsulta aluno pelo numero de matricula\n\n);
printf(\nMatricula: );
scanf(%d,&matc);
noatual = inicio;
while(noatual != NULL) {
if (noatual->mat == matc) {
achou = 1;
printf(\n\nMatricula Nome\n);
Estrutura de Dados e-Tec Brasil 80
printf(---------------------------------------\n);
printf(%9d %-20s\n,noatual->mat, noatual->nome);
printf(---------------------------------------\n);
break;
}
else
noatual = noatual->prox;
}
if (achou == 0)
printf(\n\nAluno nao encontrado!!\n);
printf(\nContinuar consultando (1-sim/2-nao)? );
scanf(%d,&continuar);
}while (continuar == 1);
}

III. Remover elemento
Para remover um elemento necessrio saber qual elemento deseja re-
mover. Para isso, a matrcula do aluno a ser removido deve ser lida. feita
uma varredura em todos os ns da lista.
Assim que o elemento encontrado, seus dados devem ser apresentados
ao usurio (neste caso a matrcula e o nome). Dessa forma ele pode verif-
car se realmente aquele o elemento a ser removido. Quando o elemen-
to no encontrado, uma mensagem de erro deve ser dada ao usurio.
Nas Figuras 3.9 so ilustrados os trs casos de remoo: remover primeiro
da lista, ltimo da lista, elemento no meio da lista. No (passo 1), confor-
me Figura 3.9a, temos a lista com cinco elementos.
J no (passo 2 tambm presente na Figura 3.9a foi feita a remoo do
aluno com matrcula 10. Este o primeiro n da lista. Esta remoo feita
e-Tec Brasil Aula 3 Viso geral de estrutura de dados e lista linares 81
modifcando o valor do n incio para o endereo do vizinho do n que
est sendo removido, neste caso, endereo 1040.
Agora no (passo 3presente na Figura 3.9b foi removido a aluno de ma-
trcula 17. Este aluno o ultimo n da lista, a sua remoo ir ter que
atualizar o ponteiro fm. Alm disso, o elemento que tinha como vizinho
seguinte o n de matrcula 17, ter agora NULL como vizinho. Portanto,
dois ponteiros so atualizados.
Ainda na Figura 3.9b o (passo 4) realiza a ltima remoo, aluno com matr-
cula 14 (endereo 1050), que est armazenado em um n no meio da lista.
Nesta remoo, os ponteiros inicio e fm no so alterados. No entanto, o
elemento que vem antes do removido (1040), ter agora como vizinho o
elemento que era vizinho do que ser removido (1070).
NULL
1010
10/Ana
INCIO
FIM
1
22/Jlia 14/Mrio
1040 1050
1010
1080
12/Vera
1070
17/Paulo
1080
NULL
1010
10/Ana
INCIO
FIM
2
22/Jlia
14/Mrio
1040
1050
1040
1080
12/Vera
1070
17/Paulo
1080
NULL 22/Jlia
14/Mrio
1040 1050
12/Vera
1070
17/Paulo
1080
Figura 3.9a: Remoo da lista dinmica desordenada
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
INCIO
FIM
3
1040
1070
4
INCIO
FIM
22/Jlia
1040
1040
14/Mrio
1050
12/Vera
1070
22/Jlia
1040
14/Mrio
1050
12/Vera
1070
22/Jlia
1040
1070 22/Jlia
1040
14/Mrio
1050
12/Vera
1070
17/Paulo
1080
NULL
NULL
12/Vera
1070
NULL
NULL
Figura 3.9b: Remoo da lista dinmica desordenada
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
O cdigo a seguir, implementado est em linguagem C, realiza uma remo-
o aluno:
Estrutura de Dados e-Tec Brasil 82
/* remover um aluno da lista */
void remover() {
TAluno *noantrem;
int matr, confrem, continuar, achou;
do{
achou = 0;
cabec();
printf(\nRemove aluno \n\n);
printf(\nMatricula: );
scanf(%d,&matr);
noatual = inicio;
while(noatual != NULL) {
if (noatual->mat == matr) {
achou = 1;
printf(\n\nMatricula Nome\n);
printf(---------------------------------------\n);
printf(%9d %-20s\n,noatual->mat, noatual->nome);
printf(---------------------------------------\n);
printf(\n\nDeseja remover o aluno (1-sim, 2-nao)? );
scanf(%d,&confrem);
if (confrem ==1) {
if (noatual == inicio)
inicio = inicio->prox;
else {
noantrem->prox=noatual->prox;
if (noatual == fm)
e-Tec Brasil Aula 3 Viso geral de estrutura de dados e lista linares 83
fm=noantrem;
}
qa--;
free(noatual);
printf(\n\nRemovido com sucesso!!!!\n);
}
else
printf(\n\nRemocao cancelada\n);
break;
}
else {
noantrem = noatual;
noatual = noatual->prox;
}
}
if (achou == 0)
printf(\n\nAluno nao encontrado!!\n);
printf(\n\nDeseja remover outro (1-sim, 2-nao)? );
scanf(%d,&continuar);
}while (continuar ==1);
}

IV. Listagem de todos os elementos
A operao de listagem possibilita a visualizao dos dados de todos os
elementos cadastrados. feita uma pesquisa na lista partindo do ende-
reo inicio at o ltimo n, todos os dados de todos os elementos so
apresentados ao usurio.
Estrutura de Dados e-Tec Brasil 84
O cdigo abaixo representa a impresso de todos os elementos:
/* Lista todos os alunos presentes na lista */
void listar () {
noatual = inicio;
cabec();
printf(\nListagem de Alunos\n\n);
if (qa != 0) {
printf(\n\nMatricula Nome\n);
printf(---------------------------------------\n);
while( noatual != NULL) {
printf(%9d %-20s\n,noatual->mat, noatual->nome);
noatual = noatual->prox;
}
printf(---------------------------------------\n);
printf(\n\nQuantidade de Alunos = %d\n,qa);
}
else
printf(\n\n Nao tem nenhum aluno cadastrado);
printf(\n\n\nTecle enter para voltar para o menu\n);
getche();
}

A implementao do cdigo completo da lista dinmica desordenada na lin-
guagem C estar disponibilizado junto ao AVEA em formatos . pdf e .cpp!
e-Tec Brasil Aula 3 Viso geral de estrutura de dados e lista linares 85
Vamos praticar, atravs do cdigo completo do contedo visto at o mo-
mento da aula 3 disponvel no AVEA, implemente um novo programa tro-
cando variveis alunos, matrcula e polo por pessoa, RG e endereo.
d) Lista dinmica ordenada
Esta lista implementada usando ponteiros, no entanto, quando for feito o
caminhamento pelos ns da lista, ela deve estar ordenada por algum campo,
neste exemplo o campo de ordenao a matrcula. Esta lista possui apenas
o ponteiro inicio, que guarda o endereo do primeiro elemento da lista.
Operaes bsicas
I. Inserir elemento
Nas Figuras 3.10 (a e b) so ilustradas a insero de quatro elementos em
uma lista dinmica ordenada. No (passo 1) presente na Figura 3.10a, a
lista est vazia, com o ponteiro incio apontando para NULL. J no (passo
2) tambm presente na Figura 3.10a temos a insero do elemento de
matrcula 17. Como a lista est vazia, o ponteiro incio vai apontar para
este elemento (endereo 1080).
Continuando na Figura 3.10a, no (passo 3), temos a chegada de um ou-
tro elemento, matrcula 10. verifcado que ele tem a matrcula menor
do que o primeiro elemento da lista, ento este novo elemento ter que
ser inserido no incio da lista. Assim, o elemento novo vai apontar para o
primeiro da lista e o ponteiro incio ir apontar para o novo n.
Agora observaremos a Figura 3.10b, o (passo 4) ter a insero de um
aluno com matrcula 14, que ser inserido no meio da lista. Para isso,
teremos que descobrir entre quais elementos ele ir ser inserido, para
manter a lista ordenada e fazer as ligaes dos ponteiros corretamente.
NULL
NULL
17/Paulo
1080
17/Paulo
1080
10/Ana
1010
NULL INCIO
1
1080 INCIO
2
1010 INCIO
3
Figura 3.10a: Insero da lista dinmica ordenada
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
Estrutura de Dados e-Tec Brasil 86
NULL
10/Ana
1040
14/Mrio
1050
17/Paulo
1070
14/Mrio
1050
17/Paulo
1070
NULL
22/Jlia
1040
10/Ana
1040
1010 INCIO 4
1010 INCIO 5
Figura 3.10b: Insero da lista dinmica ordenada
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
Finalmente, no (passo 5), conforme Figura 3.10b tivemos a insero do alu-
no com matrcula 22. Esse ser inserido no fnal da lista.
O cdigo abaixo, implementado est em linguagem C, inseri um novo aluno
lista:
/* Funcao para inserir um novo no, ao fnal da lista */
void inserir () {
TAluno *novono, *antinserido;
int i, matl,continuar;
char nomel[15];
do{
cabec();
printf(\nInserir novo aluno \n);
printf(\nMatricula: );
scanf(%d,&matl);
ffush(stdin);
printf(\nNome: );
gets(nomel);
qa++;
//Aloca memoria para o novo aluno e coloca os dados
novono = (TAluno *) malloc(sizeof(TAluno));
e-Tec Brasil Aula 3 Viso geral de estrutura de dados e lista linares 87
novono->mat = matl;
for (i=0;i<=14;i++)
novono->nome[i] =nomel[i];
antinserido = NULL;
// Inserir novono na lista de alunos
if (inicio == NULL) {/* Ainda nao existe nenhum aluno na lista */
inicio = novono;
novono->prox = NULL;
}
else {
noatual = inicio;
if (noatual->mat > matl) {// aluno inserido no inicio da lista
novono->prox = inicio;
inicio = novono;
}
else { // aluno sera inserido no meio ou fnal da lista
while(noatual != NULL) {
if (noatual->mat < matl) {// procura o local da insercao
antinserido = noatual;
noatual = noatual->prox;
}
else // encontrou o local onde sera inserido
noatual = NULL;
}
novono->prox = antinserido->prox;
antinserido->prox = novono;
}
Estrutura de Dados e-Tec Brasil 88
}
printf(\n\nInserido com Sucesso!!!!\n);
printf(\nContinuar inserindo (1-sim/2-nao)? );
scanf(%d,&continuar);
}while (continuar == 1); // verifca se quer continuar removendo
}
II. Consultar elemento
Para fazer uma consulta necessrio primeiro saber qual elemento deseja
consultar. Um ponteiro auxiliar ser usado para percorrer a lista, visitando
cada n a procura do elemento.
NULL
22/Jlia
1040
10/Ana
1040
14/Mrio
1050
17/Paulo
1070
1010 INCIO
Figura 3.11: Consulta da lista dinmica ordenada
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
Na Figura 3.11 temos uma lista com quatro elementos. Caso quisssemos
consultar o elemento de matrcula 25, iramos percorrer a lista at chegar
ao ltimo n, cujo endereo do vizinho NULL (n de endereo 1040) e
fcaramos sabendo que este elemento no se encontra na lista. Se procu-
rssemos a matrcula 8, assim que fosse feita a comparao com o primei-
ro elemento da lista, j saberamos que a matricula 8 no se encontra na
lista e a consulta fnalizada. A busca executada enquanto no encontra
o elemento procurado ou enquanto no encontra um elemento cuja ma-
trcula maior do que a matrcula que est sendo procurada.
O cdigo abaixo, implementado est em linguagem C, realiza um consul-
ta de um determinado aluno:
/* Consultar um aluno na lista */
void consultar() {
int matc, continuar, achou=0;
do{
cabec();
e-Tec Brasil Aula 3 Viso geral de estrutura de dados e lista linares 89
printf(\nConsulta aluno pelo numero de matricula\n\n);
printf(Matricula: );
scanf(%d,&matc);
noatual = inicio; // coloca ponteiro no inicio da lista
while(noatual != NULL) { // percorre a lista procurando o aluno
if (noatual->mat == matc) { // aluno encontrado
achou = 1;
printf(\n\nMat Nome \n);
printf(----------------------------\n);
printf(%2d %-15s\n, noatual->mat, noatual->nome);
printf(----------------------------\n);
break;
}
else {// procura no proximo aluno
noatual = noatual->prox;
if (noatual != NULL) {
if (noatual->mat > matc)
break;
}
}
}
if (achou == 0) // aluno nao esta na lista
printf(\n\nAluno nao encontrado!!\n\n);
printf(\nContinuar consultando (1-sim/2-nao)? );
scanf(%d,&continuar);
}while (continuar == 1);
}
Estrutura de Dados e-Tec Brasil 90
III. Remover elemento
A remoo em uma lista dinmica ordenada segue a mesma regra de
uma lista desordenada. A nica diferena que no teremos o ponteiro
fm para atualizar. Para remover um elemento necessrio saber qual
elemento deseja remover. Para isso, a matrcula do aluno a ser removido
deve ser lida. feita uma varredura em todos os ns da lista. Assim que
o elemento encontrado, seus dados devem ser apresentados ao usurio
(neste caso a matrcula e o nome). Quando o elemento no encontrado,
uma mensagem de erro deve ser dada ao usurio.
Na Figura 3.12 so ilustrados os dois casos de remoo: primeiro da lista e
meio ou fm da lista. Quando o primeiro elemento da lista removido, (passo
2), o endereo do incio precisa ser atualizado. No (passo 3) o elemento a ser
removido o ltimo da lista. Neste caso, o elemento que apontava para o
elemento removido (1080), ter que apontar para o elemento que o elemen-
to removido aponta (NULL).
NULL
1040
10/Ana INCIO 14/Mrio 22/Jlia
22/Jlia
22/Jlia
1050 1070
1010 1 17/Paulo
17/Paulo
1040
NULL
1040
10/Ana
INCIO
14/Mrio
1050
1070
1050
2
1040
NULL
14/Mrio
1050 1070 1040
17/Paulo
22/Jlia NULL
1050
INCIO
14/Mrio
1070
1040
1050
3
NULL
14/Mrio
1050 1070
17/Paulo
17/Paulo
Figura 3.12: Remoo da lista dinmica ordenada
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
O cdigo abaixo, implementado est em linguagem C, realiza uma remoo
aluno:
/* remover um aluno da lista */
void remover() {
TAluno *noantrem;
int matr, confrem, continuar, achou;
e-Tec Brasil Aula 3 Viso geral de estrutura de dados e lista linares 91
do{
achou = 0;
cabec();
printf(\nRemove aluno \n\n);
printf(Matricula: );
scanf(%d,&matr);
noatual = inicio; //ponteiro que ira percorrer a lista
while(noatual != NULL) { // percorre a lista a procura do aluno
if (noatual->mat == matr) { // verifca se o aluno
achou = 1;
// impressao dos dados do aluno para conferencia
printf(\n\nMatricula Nome\n);
printf(----------------------------------------\n);
printf(%9d %-15s\n, noatual->mat, noatual->nome);
printf(----------------------------------------\n);
printf(\n\nDeseja remover o aluno (1-sim, 2-nao)? );
scanf(%d,&confrem);
if (confrem ==1) {// confrma que quer remover
if (noatual == inicio) // verifca se o primeiro da lista
inicio = inicio->prox;
else // removido esta no meio ou fnal da lista
noantrem->prox=noatual->prox;
qa--;
free(noatual); // libera memoria do no removido
printf(\n\n Removido com sucesso!!!!\n);
}
Estrutura de Dados e-Tec Brasil 92
else // cancelou a remocao
printf(\n\n Remocao cancelada\n);
break;
}
else {// passa para o proximo no para continuar a busca
noantrem = noatual;
noatual = noatual->prox;
if (noatual !=NULL) {
if (noatual->mat > matr)
break;
}
}
}
if (achou == 0) // o elemento nao foi encontrado na lista
printf(\n\nAluno nao encontrado!!\n\n);
printf(\n\nDeseja remover outro (1-sim, 2-nao)? );
scanf(%d,&continuar);
}while (continuar ==1); // continuar removendo aluno
}

IV. Listagem de todos os elementos
A operao de listagem possibilita a visualizao dos dados de todos os
elementos cadastrados. feita uma varredura na lista partindo do endereo
inicio at o ltimo n, todos os dados de todos os elementos so apresen-
tados ao usurio.
O cdigo a seguir representa a impresso de todos os elementos:
e-Tec Brasil Aula 3 Viso geral de estrutura de dados e lista linares 93
/* Lista todos os alunos presentes na lista */
void listar () {
noatual = inicio; // no auxiliar marca o inicio da lista
cabec();
printf(\nListagem de Alunos\n\n);
if (qa != 0) {// verifca se tem aluno cadastrado
printf(\n\nMatricula Nome\n);
printf(----------------------------------------\n);
while( noatual != NULL) { // percorre toda a lista ate chegar no fnal
printf(%9d %-15s\n, noatual->mat, noatual->nome);
noatual = noatual->prox; // Faz noatual apontar para o proximo no
}
printf(----------------------------------------\n);
printf(\n\nQuantidade de Alunos: %d\n,qa);
}
else
printf(\n\nNao tem nenhum aluno cadastrado);
printf(\n\nTecle enter para voltar para o menu...);
getche();
}

A implementao do cdigo completo da lista dinmica ordenada na lingua-
gem C estar disponibilizado junto ao AVEA em formatos .pdf e .cpp
Vamos praticar, atravs do cdigo completo do contedo visto at o mo-
mento da aula 3 disponvel no AVEA, implemente um novo programa tro-
cando variveis alunos, matricula e polo por pessoa e endereo.
Assista video-aula da disciplina
de Estrutura de Dados disponvel
no AVEA. Aproveite para revisar
os contedos da aula 3
sobre listas.
Estrutura de Dados e-Tec Brasil 94
Resumo
Nesta aula abordamos uma viso geral de estrutura de dados, descreven-
do de tipos primitivos e estruturados, descrevemos o tipo Lista (ordenada e
desordenada) esttica e dinamicamente e implementamos suas operaes
bsicas tais como: insero, remoo, consulta, listagem na linguagem C.
Atividades de aprendizagem
1. Os tipos de dados so divididos em primitivos e estruturados, comente
acerca deles descrevendo-os.
2. Diferencie estruturas homogneas e heterogneas.
3. Construa um programa na linguagem C que represente uma Lista Esttica
Desordenada, que possua como campos: cdigo e nome do cliente. Neste
programa ser necessrio criar um menu que tenha inserir, remover, listar,
consulta. Observao: Implemente um contador de registros inseridos e
que o mesmo dever ser decrementado quando a informao foi excluda.
4. Construa um programa na linguagem C que represente uma Lista Dinmica
Desordenada, que possua como campos: cdigo, nome do cliente. Neste
programa ser necessrio criar um menu que tenha inserir, remover, listar,
consulta. Observao: Implemente um contador de registros inseridos e que
o mesmo dever ser decrementado quando a informao foi excluda.
e-Tec Brasil Aula 3 Viso geral de estrutura de dados e lista linares 95
e-Tec Brasil
Aula 4 Pilhas
Objetivos
Conhecer o funcionamento de uma Pilha.
Implementar as operaes bsicas em uma estrutura pilha esttica
e dinmica.
4.1. Introduo
Para entendermos o funcionamento de uma estrutura de pilha, podemos fazer
uma analogia com uma pilha de pratos. Se quisermos adicionar um prato na
pilha, o colocamos no topo. Para pegar um prato da pilha, retiramos o do topo.
Assim, temos que retirar o prato do topo para ter acesso ao prximo prato. A
estrutura de pilha funciona de maneira anloga. Cada novo elemento inseri-
do no topo e s temos acesso ao elemento do topo da pilha. Portanto As pilhas
so estruturas baseadas no princpio LIFO (last in, frst out), na qual os dados
que foram inseridos por ltimo na pilha sero os primeiros a serem removidos.
Existem trs operaes bsicas que devem ser implementadas numa estrutura
de pilha: operao para empilhar um novo elemento, inserindo-o no topo,
operao para desempilhar um elemento, removendo-o do topo e a operao
para consultar qual elemento est no topo da pilha. comum nos referirmos
a essas operaes pelos termos em ingls push (empilhar) e pop (desempilhar).
4.2. Pilha esttica
A seguir vamos analisar a implementao de pilha esttica. Neste exemplo
ser implementada uma pilha de livros.
4.2.1. Operaes bsicas
I. Inserir elemento
Todo elemento que vai ser inserido em uma pilha colocado no fnal da
estrutura. A Figura 4.1 ilustra a chegada de trs livros colocados na pilha.
Os livros vo sendo inseridos por ordem de chegada.
e-Tec Brasil 97 Aula 4 Pilhas
Insero do Livro com cdigo4 e ttulo Fsica
1 2 3 4 5 6 7 8
10/
Cincias
7/
Ingls
4/
Fsica
Insero do Livro com cdigo7 e ttulo Ingls
1 2 3 4 5 6 7 8
10/
Cincias
7/
Ingls
Insero do Livro com cdigo10 e ttulo Cincias
1 2 3 4 5 6 7 8
10/
Cincias
Vetor Vazio
1 2 3 4 5 6 7 8
Figura 4.1: Insero da pilha esttica
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
O cdigo abaixo, implementado est em linguagem C, inseri um novo aluno
pilha:
/* Funcao para inserir um novo livro na pilha */
void inserir () {
int continuar;
do{
cabec();
printf(\nColocar livro no topo da pilha \n);
printf(\nCodigo do livro: );
scanf(%d,&ll.codigo);
printf(\nTitulo do Livro: );
ffush(stdin);
gets(ll.titulo);
// Inserir livro na pilha
if (tampilha <30) { /* Se ainda tem vaga na pilha */
livro[tampilha] = ll;
tampilha++;
Estrutura de Dados e-Tec Brasil 98
printf(\n\nInserido com Sucesso!!!!\n\n);
}
else /* Pilha cheia*/
printf(\n\nPilha cheia, Livro nao inserido!!!!\n\n);
printf(\n Continuar inserindo (1-sim/2-nao)? );
scanf(%d,&continuar);
}while (continuar == 1); // verifca se quer continuar inserindo livros
}
II. Consultar topo da pilha
Em uma pilha, a consulta feita apenas do elemento do topo, ou seja, o
ltimo elemento a ser inserido. Assim, teremos a informao de qual ser o
prximo elemento a ser retirado. Na Figura 4.2, o elemento do topo da pilha
o livro de cdigo 4 e ttulo Fsica, armazenado na posio 3 do vetor. Quando
o vetor estiver vazio, apresentada uma mensagem de pilha vazia ao usurio.
Pilha com trs elementos
1 2 3 4 5 6 7 8
10/
Cincias
7/
Ingls
4/
Fsica
Figura 4.2: Consulta da pilha esttica
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
O cdigo abaixo, implementado est em linguagem C, realiza um consulta
de um determinado aluno:
/* Consultar topo da pilha*/
void consultatopo() {
cabec();
printf(\nConsulta topo da pilha\n);
if (tampilha != 0) {
printf(\n\nCod Titulo \n);
printf(----------------------------------------------------\n);
printf(%2d %-20s \n, livro[tampilha-1].codigo, livro[tampilha-1].titulo);
e-Tec Brasil Aula 4 Pilhas 99
printf(-----------------------------------------------------\n);
}
else
printf(\n\nA pilha esta vazia!!\n\n);
printf(\n\nTecle enter para voltar para o menu\n);
getche();
}
III. Remover topo da pilha
Em uma pilha, o elemento removido sempre o que chegou h menos
tempo, ou seja, o elemento da ltima posio do vetor. Na Figura 4.3
iremos remover o elemento do topo da pilha, neste caso, o elemento da
posio 3. No h necessidade de deslocamentos.
Pilha com trs elementos
1 2 3 4 5 6 7 8
10/
Cincias
7/
Ingls
4/
Fsica
Pilha depois da remoo
1 2 3 4 5 6 7 8
10/
Cincias
7/
Ingls
Figura 4.3: Remoo da pilha esttica
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
O cdigo abaixo, implementado est em linguagem C, realiza uma remoo
aluno:
/* remover um livro da pilha */
void retirapilha() {
int i, confrem, continuar;
do{ cabec();
printf(\nRetira livro do topo da pilha \n);
if (tampilha != 0) {// verifca se tem elementos na pilha
printf(\n\nCodigo Titulo Editora\n);
printf(---------------------------------------------------\n);
Estrutura de Dados e-Tec Brasil 100
printf(%6d %-20s \n, livro[tampilha-1].codigo, livro[tampilha-1].titulo);
printf(---------------------------------------------------\n);
printf(\n\nconfrma retirada do livro (1-sim, 2-nao)? );
scanf(%d,&confrem);
if (confrem ==1) { // confrma que quer remover
tampilha--;
printf(\n\n Retirado da Pilha com sucesso!!!!\n\n);
}
else // cancelou a remocao
printf(\n\n Retirada cancelada\n\n);
}
else // pilha vazia
printf(\n\nPilha vazia!!\n\n);
printf(\n\nDeseja retirar outro livro(1-sim, 2-nao)? );
scanf(%d,&continuar);
}while (continuar ==1); // continuar retirando livro da pilha
}
IV. Listagem de todos os elementos da pilha
A operao de listagem possibilita a visualizao dos dados de todos os
elementos da pilha. feita uma varredura no vetor e todos os dados de
todos os elementos so apresentados ao usurio.
O cdigo abaixo representa a impresso de todos os elementos:
/* Lista todos os livros da pilha */
void listar () {
int i;
cabec();
e-Tec Brasil Aula 4 Pilhas 101
printf(\nListagem dos livros da pilha\n);
if (tampilha != 0) {
printf(\n\nCodigo Titulo Editora\n);
printf(-----------------------------------------------------\n);
for (i=tampilha-1;i>=0;i--)
printf(%6d %-20s \n, livro[i].codigo, livro[i].titulo);
printf(-----------------------------------------------------\n);
printf(\n\nQuantidade de livros na pilha = %d\n,tampilha);
}
else
printf(\n\n Nao tem nenhum livro na pilha);
printf(\n\n\nTecle enter para voltar para o menu\n);
getche();
}
A implementao do cdigo completo da pilha esttica na linguagem C es-
tar disponibilizado junto ao AVEA em formatos .pdf e .cpp!
4.3. Pilha dinmica
Nesta seo iremos analisar as operaes bsicas em uma pilha implementa-
da com ponteiros em linguagem C.
4.3.1. Operaes bsicas
I. Inserir elemento
Todo elemento que vai ser inserido em uma pilha colocado no fnal da
estrutura. A Figura 4.4 ilustra a chegada de trs livros colocados na pilha.
Estrutura de Dados e-Tec Brasil 102
3
2
1
4
INICIO
INICIO
INICIO
INICIO
NULL
1080
1010
1030
17/Ingls
1080
NULL
25/Fsica
1010
17/Ingls
1080
NULL
10/Lgica
1030
25/Fsica
1010
17/Ingls
1080
NULL
Figura 4.4: Insero da pilha dinmica
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
Cada elemento que chega, ser inserido no incio da estrutura. Portando, o
ponteiro inicio sempre modifcado a cada insero.
Na Figura 4.4 a pilha inicia vazia, com o ponteiro incio apontando para NULL
(passo 1). No (passo 2) um elemento inserido na pilha, por ser o primeiro,
ele no tem vizinho e o ponteiro incio passa a apontar para o novo n (en-
dereo 1080).
No (passo 3) um novo elemento inserido, o ponteiro incio deve ser atu-
alizado e o novo n deve apontar para o elemento que estava no incio da
pilha (endereo 1080). No (passo 4), um novo elemento inserido e as atu-
alizaes dos ponteiros devem ser feitas.
O cdigo abaixo, implementado est em linguagem C, inseri um novo aluno
pilha:
/* Funcao para inserir um novo no, no inicio da pilha */
void inserir () {
TLivro *novono;
int i, codl, continuar;
char titl[30];
do{
e-Tec Brasil Aula 4 Pilhas 103
cabec();
printf(\nColocar livro no topo da pilha \n);
printf(\nCodigo do livro: );
scanf(%d,&codl);
printf(\nTitulo do Livro: );
ffush(stdin);
gets(titl);
// Inserir livro na pilha
tampilha++;
//Aloca memoria para o novo livro
novono = (TLivro *) malloc(sizeof(TLivro));
novono->codigo = codl;
for (i=0;i<=29;i++)
novono->titulo[i] =titl[i];
novono->prox = inicio;
inicio = novono;
printf(\n\nInserido com Sucesso!!!!\n\n);
printf(\nContinuar inserindo (1-sim/2-nao)? );
scanf(%d,&continuar);
}while (continuar == 1); // verifca se quer continuar inserindo livros
}
II. Consultar topo da pilha
Em uma pilha, a consulta feita apenas do elemento do topo, ou seja, o ltimo
elemento a ser inserido, que neste caso o elemento apontado pelo ponteiro
inicio. Se o ponteiro incio aponta para NULL signifca que a pilha est vazia.
O cdigo a seguir, implementado est em linguagem C, realiza um consul-
ta de um determinado aluno:
Estrutura de Dados e-Tec Brasil 104
/* Consultar livro do topo da pilha */
void consultatopo() {
cabec();
printf(\nConsulta topo da pilha\n\n);
if (inicio != NULL) {
printf(\n\nCodigo Titulo \n);
printf(-----------------------------------------------------\n);
printf(%6d %-20s \n, inicio->codigo, inicio->titulo);
printf(-----------------------------------------------------\n);
}
else
printf(\nA pilha est vazia!!\n\n);
printf(\n\nTecle enter para voltar para o menu\n);
getche();
}
III. Remover topo da pilha
Em uma pilha, o elemento removido sempre o que chegou h menos tem-
po, ou seja, o elemento apontado pelo ponteiro inicio. Na Figura 4.5 iremos
remover o elemento do topo da pilha. O ponteiro incio deve ser atualizado,
apontando para o elemento que era vizinho do elemento removido.
1
INICIO
1030 10/Lgica
1030
25/Fsica
1010
17/Ingls
1080
NULL
1
INICIO
1010
10/Lgica
1030
25/Fsica
1010
17/Ingls
1080
NULL
25/Fsica
1010
17/Ingls
1080
NULL
Figura 4.5: Remoo da pilha dinmica
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
e-Tec Brasil Aula 4 Pilhas 105
O cdigo abaixo, implementado est em linguagem C, realiza uma remoo
aluno:
/* remover livro do topo da pilha */
void retirapilha() {
int confrem, continuar;
do{
cabec();
printf(\nRetira livro do topo da pilha \n);
noatual = inicio; //ponteiro que ira apontar para o primeiro no
if (inicio != NULL) { // verifca se tem elementos na pilha
printf(\n\nCodigo Titulo \n);
printf(---------------------------------------------------\n);
printf(%6d %-20s \n, inicio->codigo, inicio->titulo);
printf(---------------------------------------------------\n);
printf(\n\nconfrma retirada do livro (1-sim, 2-nao)? );
scanf(%d,&confrem);
if (confrem ==1) { // confrma que quer remover
inicio = inicio->prox;
free(noatual); // libera memoria do no removido
tampilha--;
printf(\n\n Retirado da Pilha com sucesso!!!!\n\n);
}
else // cancelou a remocao
printf(\n\n Retirada cancelada\n\n);
}
else // pilha vazia
Estrutura de Dados e-Tec Brasil 106
printf(\n\nPilha vazia!!\n\n);
printf(\n\nDeseja retirar outro livro(1-sim, 2-nao)? );
scanf(%d,&continuar);
}while (continuar ==1); // continuar retirando livro da pilha
}
IV. Listagem de todos os elementos da pilha
A operao de listagem possibilita a visualizao dos dados de todos os
elementos da pilha. feita uma varredura na pilha e todos os dados de
todos os elementos so apresentados ao usurio.
O cdigo abaixo representa a impresso de todos os elementos:
/* Lista todos os livros da pilha */
void listar () {
noatual = inicio; // no auxiliar marca o inicio da lista
cabec();
printf(\nListagem dos livros da pilha\n\n);
if (inicio != NULL) {
printf(\n\nCodigo Titulo \n);
printf(----------------------------------------------------\n);
while( noatual != NULL) { // percorre toda a pilha
printf(%6d %-20s \n, noatual->codigo, noatual->titulo);
noatual = noatual->prox; // Faz noatual apontar para proximo no
}
printf(-----------------------------------------------------\n);
printf(\n\nQuantidade de livros na pilha = %d\n,tampilha);
}
else
e-Tec Brasil Aula 4 Pilhas 107
printf(\n\n Nao tem nenhum livro na pilha);
printf(\n\n\nTecle enter para voltar para o menu\n);
getche();
}
A implementao do cdigo completo da pilha dinmica na linguagem C
estar disponibilizado junto ao AVEA em formatos .pdf e .cpp!
Resumo
Nesta aula descrevemos o tipo pilha esttica e dinamicamente e implemen-
tamos suas operaes bsicas tais como: insero, remoo, consulta, lista-
gem na linguagem C.
Atividades de aprendizagem
1. Qual o critrio de insero e remoo utilizada pela Pilha?
2. A Figura 4.6 representa uma pilha implementada atravs de um vetor de
10 posies. Observe que so realizadas as operaes de remoo e in-
sero na Pilha. Qual seria a nova confgurao da Pilha aps as seguintes
operaes:
Remoo;
Remoo;
Remoo;
Insero do elemento A;
Insero do elemento B;
Remoo;
Insero do elemento WW;
Topo da Pilha: [4]
1 2 3 4 5 6 7 8 9 10
X Y W Z
Figura 4.6: Pilha
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
Assista video-aula da disciplina
de Estrutura de Dados disponvel
no AVEA. Aproveite para revisar os
contedos da aula 3 sobre listas.
Estrutura de Dados e-Tec Brasil 108
a) Quantos elementos aps as remoes e inseres possui o vetor?
b) Quantas posies aps as remoes e inseres possui o vetor?
c) Faa o desenho da nova Pilha.
3. Implemente uma Pilha Esttica em linguagem C que armazene como
dados, 10 (dez) nomes de Pessoas. Implemente as operaes de insero,
remoo e consulta.
Observao: colocar o cdigo complemento
4. Implemente o cdigo da questo anterior para Pilha Dinmica.
Observao: colocar o cdigo complemento
e-Tec Brasil Aula 4 Pilhas 109
e-Tec Brasil
Aula 5 Filas e rvores
e-Tec Brasil Aula 5 Filas e rvores 111
Objetivos
Conhecer e identifcar uma Fila Esttica e Dinmica.
Implementar Fila Esttica e Dinmica na linguagem C.
Conceituar rvore e rvore Binria; Reconhecer os percursos em
rvores binrias.
5.1 Introduo fla
Para determinadas aplicaes imposto um critrio que restringe a insero
e retira dos elementos que compem um conjunto de dados. O critrio es-
colhido impe uma ordem ao conjunto de dados, ordem esta que em geral
no depende da ordem natural dos valores dos dados.
Um dos critrios mais usuais :
Critrio FIFO ( First In First Out - Primeiro que entra o primeiro que
sai): dentre os elementos que ainda permanecem no conjunto, o primeiro
elemento a ser retirado o primeiro que tiver sido inserido. Essa estru-
tura linear com esse tipo de acesso denominada fla (critrio FIFO), e
bastante utilizada na computao e no nosso dia-a-dia. O critrio FIFO
o que rege, por exemplo, o funcionamento de uma fla de pessoas em
um banco ou de um caixa de supermercado: as pessoas so atendidas na
ordem em que chegaram, ou seja, as pessoas que iniciaram a fla sero
atendidas primeiro, na frente das que chegaram depois. E quem chegar
por ltimo ser inserido no fnal da fla e atendido por ltimo, ou confor-
me sua posio for mudando. Portanto medida que a fla anda, de for-
ma sequencial, o primeiro atendido (retirado), quem era segundo passo
a ser primeiro at que chegue ao ltimo da fla. As flas so estruturas de
dados que armazenam os elementos de forma sequencial (linear). Elas
sofrem inseres e retiradas em extremidades diferentes. Exigem acesso
s duas extremidades: comeo, onde feita a retirada, e trmino, onde
feita a insero. Portanto, podemos implementar a fla simplesmente
Estrutura de Dados e-Tec Brasil 112
colocando as restries adequadas nas operaes de adicionar e remover ele-
mentos de uma lista, parece com o que foi feito com as pilhas, s que agora
os elementos so adicionados e removidos de extremidades diferentes.
A pilha segue o critrio LIFO (Last In First Out), j a fla segue o critrio FIFO
(First In, First Out).
5.1.1 Aplicaes de flas no mbito computacional
So muito comuns, na prtica, as aplicaes de flas, uma vez que parece
bastante natural o critrio de atender primeiro (retirar da fla) os elementos
que chegaram primeiro. Sendo assim, so exemplos de fla:
Escalonamento de servios (sob) submetidos ao Sistema Operacional
e colocados em fla para serem executados na ordem em que entraram.
Sequncia de trabalhos submetidos impressora e colocados em fla
para serem impressos.
Fila de pacotes a serem transmitidos numa rede de comutao de pacotes.
5.1.2 Formas de representao das flas
A implementao de flas se distingue pela natureza dos seus elementos
(tipo do dado armazenado), pela maneira como os elementos so arma-
zenados (esttica ou dinamicamente) e pelas operaes disponveis para o
tratamento da fla. Portanto, uma fla tambm pode ser representada, de
duas formas:
Esttica: caracteriza-se por utilizar um vetor (estrutura esttica) para re-
presentar a fla.
Dinmica: caracteriza-se por utilizar uma lista encadeada (estrutura di-
nmica) para representar a fla.
A implementao dinmica torna mais simples as operaes usando uma
lista encadeada com referncia para as duas pontas. J a implementao se-
quencial um pouco mais complexa, mas pode ser usada quando h previ-
so do tamanho mximo da fla. A implementao esttica de flas vantajo-
sa quando h previso do tamanho mximo de fla. Porm, se a quantidade
mxima de elementos de uma fla no for conhecida a priori, a implemen-
tao esttica torna-se desvantajosa, podendo resultar numa alocao de
e-Tec Brasil Aula 5 Filas e rvores 113
memria grande demais ou insufciente para uma determinada aplicao.
J as flas dinmicas so bastante vantajosas quando no se conhece o ta-
manho mximo da fla. Dessa forma, medida que desejamos inserir novos
elementos na fla, basta alocar um espao de memria adequado e inserir
este novo elemento. Porm, como em listas encadeadas, a principal desvan-
tagem da implementao dinmica est no fato de que um elemento da fla
sempre conter uma referncia para o outro elemento da fla, o que gera
uma utilizao maior de memria.
5.2 Fila esttica
Nesta seo iremos verifcar as operaes em uma fla implementada com
vetores. E sua implementao em C.
As flas podem usar vetor, ou seja, uma estrutura esttica para armazenar
os dados, como pode ser constatado na Figura 5.1 a seguir. Um vetor de
10 (dez) posies, dos quais esto sendo utilizadas 4 posies. No incio da
Fila, posio 1 tem-se o elemento A e no fnal da Fila, posio 4 tem-se o
elemento D. Observe que a Fila possui 4 elementos, mas o vetor suporta 10,
ou seja, existem 6 posies vazias.
Vetor Vazio
1 2 3 4 5 6 7 8
Figura 5.1: Fila esttica
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
As operaes bsicas que podem ser implementadas em uma fla so:
I. criar uma fla vazia;
II. inserir elemento no fnal da fla;
III. remover o elemento do incio da fla;
IV. consultar o primeiro da fla;
V. listar todos os elementos da fla.
Para um melhor entendimento do que seja uma fla, temos abaixo uma im-
plementao de uma SIMULAO de fla de matrculas no curso tcnico de
informtica.
Estrutura de Dados e-Tec Brasil 114
a) Fila vazia
No incio o vetor est vazio, ou seja, fla vazia;
Insero da aluna de matrcula 1212 e nome Maria
Insero da aluna de matrcula 5611 e nome Jos
Insero da aluna de matrcula 4844 e nome Pedro
1 2 3 4 5 6 7 8
Maria
1212
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8
Maria
1212
Pedro
4844
Maria
1212
Pedro
4844
Jos
5611
Figura 5.2: Fila esttica vazia
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
b) Inserir elemento
Todo elemento que vai ser inserido em uma fla colocado no fnal da es-
trutura. Os alunos vo sendo inseridos por ordem de chegada. No exem-
plo da Figura 5.3 so inseridos 3 alunos na fla.
Fila com 3 alunos
1 2 3 4 5 6 7 8
Maria
1212
Pedro
4844
Jos
5611
Figura 5.3: Fila esttica insero
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
Logo abaixo, temos a funo inserir ( ) implementada na linguagem C
para inserir um novo aluno no fnal da fla.
void inserir () {
int continuar;
do {
printf(\n Chegada de novo aluno na fla \n);
printf(\n Numero da Matricula: );
e-Tec Brasil Aula 5 Filas e rvores 115
scanf(%d,&Al.Matricula);
printf(\n Nome: );
ffush(stdin);
gets(Al.Nome);
printf(\n Polo do Aluno(1- Batalha, 2-Valenca): );
scanf(%d,&Al.Polo);
if (tamfla <30) { /* Se ainda tem vaga na fla */
Aluno[tamfla] = Al;
tamfla++;
printf(\n\nAluno Inserido com Sucesso!!!!\n\n);
}
else /* Fila cheia*/
printf(\n\nFila cheia, Aluno nao inserido!!!!\n\n);
printf(\n Continuar inserindo (1-sim/2-nao)? );
scanf(%d,&continuar);
}while (continuar == 1);
}
c) Consultar primeiro da fla
Em uma fla, a consulta feita apenas do primeiro elemento da fla.
Assim, teremos a informao de qual ser o prximo elemento a ser re-
tirado. Na Figura 5.4, o primeiro elemento da fla a aluna Maria, com
matrcula 1212.
Fila com 3 alunos
1 2 3 4 5 6 7 8
Maria
1212
Pedro
4844
Jos
5611
Figura 5.4: Fila Esttica Consulta
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
Logo abaixo, temos a funo consultarprimeiro( ) implementada na
linguagem C para consultar o primeiro aluno da fla.
Estrutura de Dados e-Tec Brasil 116
void consultarprimeiro ( ) {
cabec();
printf(\nConsulta primeiro aluno da fla\n);
if (tamfla != 0) {
printf(\nMatricula Nome Polo\n);
printf(----------------------------------------------\n);
printf(%4d %-15s %2d\n,
Aluno[0].Matricula, Aluno[0].Nome, Aluno[0].Polo);
printf(-----------------------------------------------\n);
}
else
printf(\n\nA fla est vazia!!\n\n);
printf(\n\nTecle enter para voltar para o menu\n);
getche();
}
d) Remover primeiro da fla
Observando a Figura 5.5, em uma fla, o elemento removido sempre
o que chegou h mais tempo, ou seja, o elemento da primeira posio
do vetor. Na fgura abaixo iremos remover o primeiro elemento da fla
(neste caso, Maria-1212). Os elementos seguintes devem ser deslocados
uma posio a frente. Com isso, o segundo elemento da fla passa a ser
o primeiro, o terceiro passa a ser o segundo e assim por diante.
Fila com 3 elementos
Fila depois da remoo
Retirada do primeiro da la
1 2 3 4 5 6 7 8
Maria
1212
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8
Maria
1212
Pedro
4844
Pedro
4844
Jos
5611
Pedro
4844
Jos
5611
Jos
5611
Figura 5.5: Fila esttica remoo
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
e-Tec Brasil Aula 5 Filas e rvores 117
Logo abaixo, temos a funo retirafla ( ) implementada na linguagem C
para remover o aluno da fla.
void retirafla ( ) {
int i, confrem, continuar;
do{
printf(\nRetira primeiro aluno da fla \n);
if (tamfla != 0) {
printf(\n\nMatricula Nome Polo\n);
printf(-----------------------------------------\n);
printf(%4d %-15s %2d\n, Aluno[0].Matricula,
Aluno[0].Nome, Aluno[0].Polo);
printf(---------------------------------------------------\n);
printf(\n\n Confrma retirada do aluno (1-sim,
2-nao)? );
scanf(%d,&confrem);
if (confrem ==1) {
for (i=0; i<tamfla; i++)
Aluno[i] = Aluno[i+1];
tamfla--;
printf(\n\n Aluno retirado da fla com
sucesso!!!!\n\n);
}
else
printf(\n\n Retirada cancelada\n\n);
}
else
printf(\n\nFila vazia!!\n\n);
printf(\n\nDeseja retirar outro aluno(1-sim, 2-nao)? );
scanf(%d,&continuar);
}while (continuar ==1);
}
Estrutura de Dados e-Tec Brasil 118
e) Listagem de todos os elementos da fla
A operao de listagem possibilita a visualizao dos dados de todos os
elementos da fla. feita uma varredura no vetor e todos os dados de
todos os elementos so apresentados.
Logo abaixo, temos a funo listar ( ) implementada na linguagem C
para remover o aluno da fla.
void listar () {
int i;
cabec ( );
printf(\nListagem de alunos da fla\n);
if (tamfla != 0) {
printf(\nMatricula Nome Polo\n);
printf(--------------------------------------------\n);
for (i=0;i<tamfla;i++)
printf(%4d %-15s %2d\n,
Aluno[i].Matricula, Aluno[i].Nome, Aluno[i].Polo);
printf(--------------------------------------------------\n);
printf(\n\nQuantidade de alunos na fla = %d\n,tamfla);
}
else
printf(\n\n Nao tem nenhum aluno na fla);
printf(\n\n\nTecle enter para voltar para o menu\n);
getche ( );
}
e-Tec Brasil Aula 5 Filas e rvores 119
A implementao do cdigo completo da fla esttica na linguagem C estar
disponibilizado junto ao AVEA em formatos .pdf e .cpp!
Depois de vermos como funcionam as operaes bsicas em uma fla est-
tica (vetor) e sua implementao na linguagem C, vamos entender o que
uma FILA DINMICA e v sua implementao, na prxima seo.
5.3 Fila dinmica
Nesta seo iremos verifcar as operaes em uma fla implementada com
ponteiros, por meio de uma lista. O ponteiro da lista, que aponta para o pri-
meiro elemento, representa o incio da fla (ponteiro I). Outro ponteiro para
o ltimo elemento da lista representa a parte fnal da fla (ponteiro F). Seja a
fla Q, implementada por meio de uma lista, temos a Figura 5.6 a seguir. E
posteriormente sua implementao em C.
1 2 3
INICIO FINAL
NULL
Q
Figura 5.6: Fila dinmica
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
A Fila dinmica sempre implementada com 2 ponteiros, o 1 (primeiro) no
incio da fla e o 2 (segundo) no fnal.
As operaes bsicas que so implementadas em uma fla esttica so as
mesmas na fla dinmica. A implementao abaixo tambm SIMULA fla de
matrculas no curso tcnico de informtica.
I. Inserir elemento
Todo elemento que vai ser inserido em uma fla colocado no fnal da
estrutura.
Estrutura de Dados e-Tec Brasil 120
NULL
NULL
12/Maria
1010
12/Maria
1070 1010
NULL INCIO
1
1010 INCIO
2
1010 INCIO
3
FIM NULL
FIM 1010
FIM 1070
12/Maria
Figura 5.7: Fila dinmica insero
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
A Figura 5.7 ilustra a chegada de dois alunos na fla. Inicialmente a fla est
vazia, portanto o valor do ponteiro incio e fm NULL (passo 1). Quando um
elemento vai ser inserido, a memria alocada e os dados so armazenados
(passo 2). Todo n criado em uma fla dinmica, no tem vizinho seguinte, por
isso ele aponta para NULL. Na insero do primeiro elemento, os ponteiros
incio e fm apontam para este elemento (no exemplo, endereo de memria
1010). No passo 3 temos a chegada da aluna Ana-10, que ser armazenado
no fnal da estrutura, o ltimo elemento da fla o ter (endereo de memria
1070) como vizinho e o ponteiro fm ir apontar para o novo elemento.
Logo abaixo, temos a funo inserir ( ) implementada na linguagem C para
inserir um novo aluno no fnal da fla dinmica, agora utilizando ponteiros.
void inserir () {
TAluno *novono;
int i, Matriculal, Polol, continuar;
char Nomel[15];
do{
printf(\n Chegada de novo aluno na la \n);
printf(\n Numero da Matricula: );
e-Tec Brasil Aula 5 Filas e rvores 121
scanf(%d,&Matriculal);
printf(\n Nome: );
fush(stdin);
gets(Nomel);
printf(\n Polo do Aluno(1- Batalha, 2- Valenca): );
scanf(%d,&Polol);
tamla++;
novono = (TAluno *) malloc(sizeof(TAluno));
novono->Matricula = Matriculal;
for (i=0;i<=14;i++)
novono->Nome[i] =Nomel[i];
novono->Polo = Polol;
novono->prox = NULL;
// Inserir novo Aluno na la de Alunos
if (inicio == NULL) {
inicio = novono;
m = novono;
}
else {
m->prox = novono;
m = novono;
}
printf(\n\nAluno Inserido com Sucesso!!!!\n\n);
printf(\n Continuar inserindo (1-sim/2-nao)? );
scanf(%d,&continuar);
}while (continuar == 1); // verica se quer continuar inserindo
}
Estrutura de Dados e-Tec Brasil 122
II. Consultar primeiro da fla
Em uma fla, a consulta feita apenas do primeiro elemento da fla. Assim
teremos a informao de qual ser o prximo elemento a ser retirado. O
primeiro elemento da fla o elemento do endereo incio. Quando incio
estiver apontando para NULL, signifca que a fla est vazia.
Logo abaixo, temos a funo consultarprimeiro ( ) implementada na
linguagem C para consultar o primeiro aluno da fla dinmica.
void consultarprimeiro ( ) {
printf(\nConsulta primeiro aluno da la\n\n);
noatual = inicio; // coloca ponteiro no inicio da lista
if (noatual != NULL) {
printf(\n\n Matricula Nome Polo\n);
printf(------------------------------------------------\n);
printf(%4d %-15s %2d\n, noatual->Matricula,
noatual->Nome, noatual->Polo);
printf(--------------------------------------------------\n);
}
else
printf(\nA la est vazia!!\n\n);
printf(\n\nTecle enter para voltar para o menu\n);
getche();
}
III. Remover primeiro da fla
Na Figura 5.8, em uma fla, o elemento removido sempre o que chegou
h mais tempo, ou seja, o elemento apontado por incio. Quando um
elemento removido, o endereo do ponteiro incio deve apontar para o
vizinho do primeiro da fla.
e-Tec Brasil Aula 5 Filas e rvores 123
INCIO
NULL
NULL
NULL
FIM
INCIO
FIM
1010
1010
1080
1040
1080
1040 1050 1070 1080
1010 1040 1050 1070 1080
1040 1050 1070 1080
1
2
12/Maria
12/Maria
10/Ana
10/Ana
24/Jos
24/Jos
24/Jos 28/Joana 37/Lia
28/Joana 37/Lia
28/Joana 37/Lia
10/Ana
Figura 5.8: Fila dinmica remoo
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
Logo abaixo, temos a funo retirafla ( ) implementada na linguagem C
para retirar o primeiro aluno da fla dinmica.
void retirala() {
int confrem, continuar;
do{
printf(\nRetira primeiro Aluno da la \n\n);
noatual = inicio;
if (noatual != NULL) {
printf(\n\nMatricula Nome Polo\n);
printf(-------------------------------------------\n);
printf(%4d %-15s %2d\n, noatual->Matricula,
noatual->Nome, noatual->Polo);
printf(----------------------------------------------\n);
printf(\n\nconrma retirada do aluno (1-sim,
2-nao)? );
scanf(%d,&confrem);
Estrutura de Dados e-Tec Brasil 124
if (confrem ==1) {
inicio = inicio->prox;
free(noatual);
tamla--;
printf(\n\n Retirado da la com sucesso!!!!\
n\n);
}
else
printf(\n\n Retirada cancelada\n\n);
}
else // la vazia
printf(\n\nFila vazia!!\n\n);
printf(\n\nDeseja retirar outro Aluno(1-sim, 2-nao)? );
scanf(%d,&continuar);
}while (continuar ==1); // continuar retirando cliente da
la
}
IV. Listagem de todos os elementos da fla
A operao de listagem possibilita a visualizao dos dados de todos os
elementos da fla. feita uma varredura na fla e todos os dados de todos
os elementos so apresentados.
Logo abaixo, temos a funo listar( ) implementada na linguagem C para
mostrar todos os alunos matriculados, ou seja, inseridos na fla dinmica.
e-Tec Brasil Aula 5 Filas e rvores 125
void listar () {
noatual = inicio;
cabec();
printf(\nListagem de Aluno da la\n\n);
if (tamla != 0) {
printf(\nMatricula Nome Polo\n);
printf(------------------------------------------\n);
while( noatual != NULL) {
printf(%4d %-15s %2d\n, noatual->Matricula,
noatual->Nome, noatual->Polo);
noatual = noatual->prox;
}
printf(---------------------------------------------------\n);
printf(\n\nQuantidade de Aluno na la = %d\n,tamla);
}
else
printf(\n\n Nao tem nenhum aluno na la);
printf(\n\n\nTecle enter para voltar para o menu\n);
getche();
}
A implementao do cdigo completo da fla dinmica na linguagem C esta-
r disponibilizado junto a plataforma AVEA em formatos .pdf e .cpp!
Assista video-aula Estrutura
de Dados - Aula 05 - Parte I
disponvel em http://etapi.
cefetpi.br/Videos/Estrutura_
de_dados_5_parte1/index.
html. Aproveite para revisar os
contudos da aula sobre las
e rvores.
Estrutura de Dados e-Tec Brasil 126
5.4 Introduo rvore
Alm do estudo de representaes de dados lineares (lista, flas e pilhas), este
unidade trata das chamadas genericamente de no-lineares (rvores). As rvo-
res permitem que sejam feitos outros tipos de relaes entre os dados, nesse
caso os dados (denominados ns ou nodos) so subordinados uns aos outros
Na estrutura de dados rvore existe uma hierarquia entre o conjunto de da-
dos pertencentes a mesma.
Um exemplo bem conhecido de relao de estruturao em rvore a estru-
tura de uma universidade composta de centros. Cada centro compos-
to por um certo nmero de departamentos. Cada departamento ofere-
ce um conjunto de disciplinas, nas quais esto matriculados os alunos.
A Figura 5.9 representa um esquema desta hierarquia mostrado abaixo:
UNIVERSIDADE
CENTROS
DEPARTAMENTOS
DISCIPLINAS
ALUNOS
Figura 5.9: Organograma de uma universidade
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
Outros exemplos de estruturas em forma de rvores so:
A diviso de um livro em captulos, sees, tpicos.
A rvore genealgica de uma pessoa.
A organizao dos diretrios (pastas) do Sistema Operacional Windows Vista.
e-Tec Brasil Aula 5 Filas e rvores 127
Formalmente, uma rvore um conjunto fnito T de um ou mais ns, tais que:
a) existe um n denominado raiz da rvore.
b) os demais ns formam m 0 conjuntos disjuntos S
1
, S
2
, ..., Sm onde cada
um destes conjuntos uma rvore. As rvores Si (1 i n) recebem a
denominao de subrvores.
Uma rvore nunca poder ter mais de uma raiz.
Em computao, rvores (e especialmente rvores binrias) so usadas para
armazenar dados (chaves e outros campos de informao) em seus ns da
mesma forma que listas ligadas e vetores. E assim como as demais estruturas
de dados, as rvores tambm possuem sua representao grfca. As trs
formas mais comuns de representao grfca de uma rvore so demons-
tradas a seguir:
1. Representao por parnteses aninhados
( A (B) ( C (D (G) (H)) (E) (F (I)) ) )
2. Diagrama de incluso
A
B
C
D
G
H
E
F
I
Figura 5.10: Organograma de uma universidade
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
Estrutura de Dados e-Tec Brasil 128
3. Representao hierrquica
A
B C
D E F
Figura 5.11: rvore cheia de grau 2
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
A representao hierrquica da rvore a mais conhecida no meio compu-
tacional.
5.5 rvore binria
Uma vez adquirido o conhecimento a respeito de rvore, apresentaremos
agora os conceitos sobre rvore binria. Uma rvore binria formada por
um conjunto fnito de ns. Este conjunto ou vazio ou consiste de um n
raiz com duas rvores binrias disjuntas, denominadas subrvores da esquer-
da e da direita. Pela defnio de rvore, cada n da rvore a raiz de uma
subrvore. O nmero de subrvores de um n o grau daquele n. Um n
de grau igual a zero denominado folha ou n terminal. O grau de cada n
menor ou igual a dois. Nas rvores binrias, distinguem-se as subrvores
de um n entre subrvores da esquerda e subrvores da direita. Assim, se o
grau de um n for igual a 1, deve ser especifcado se a sua subrvore a da
esquerda ou a da direita. Uma rvore binria tambm pode ser vazia, isto ,
no possuir nenhum n. importante observar que uma rvore binria no
apenas uma rvore de grau mximo dois, pois h tambm a questo de
ordem (esquerda e direita) de subrvores, conceito este que no existe na
defnio de rvore comum discutida no item anterior. A Figura 5.12 repre-
senta um exemplo de rvore binria de nvel 3.
e-Tec Brasil Aula 5 Filas e rvores 129
1
2
4 5 6 7
3

Figura 5.12: rvore binria nvel 3
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
Se, por exemplo, n1 for a raiz de uma rvore binria e n2 for a raiz da sua
sub-rvore direita ou esquerda, ento diz-se que n1 o pai de n2, e que n2
o flho direito ou esquerdo de n1. O n n2 um descendente de n1 e n1
o seu ascendente. Um n que no tenha flhos uma folha. Dois ns so ir-
mos se so os flhos direito e esquerdo do mesmo pai. Nvel de um n numa
rvore binria: a raiz da rvore tem nvel 1. O nvel de outro n qualquer
uma unidade mais que o nvel do pai. Uma rvore binria completa de nvel
n uma rvore em que cada n de nvel n uma folha e em que todos os
ns de nvel menor que n tm sub-rvores direita e esquerda no vazias.
Exemplifcando melhor, temos a rvore da Figura 5.13 a seguir.
Figura 5.13: rvore binria
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
Podemos concluir que:
Essa rvore possui 9 ns distribudos aleatoriamente. O n A a raiz da
rvore, que tem 2 sub-rvores com B e C, como razes.
O nmero de sub-rvores de um n determina o grau desse n. Dessa
forma, A e C tem grau 2 e B tem grau 1. O ns que tem grau zero so
denominados terminais ou folhas, nesse caso o n F.
Estrutura de Dados e-Tec Brasil 130
Utilizando a relao de hierarquia existente na rvore binria, podemos
conhecer os antepassados de um n, basta identifcarmos todos os ns
ao longo do caminho entre a raiz e este n. Ex: os antepassados de G
so, na ordem: os ns A-B-D.
Outro conceito importante no estudo de rvores e o conceito de nvel,
que representa a distncia do nodo at a raiz. Por defnio, a raiz da
rvore tem nvel 1. Os ns B e C tm nvel 2, os ns D, E e F tm nvel 3,
e assim por diante. O n de maior nvel nos fornece a altura (ou profun-
didade) da rvore. Sendo assim, a rvore acima apresenta altura 4.
Podemos tambm calcular o nmero mximo de ns possveis em uma rvo-
re binria, pode-se utilizar o valor da altura h e a frmula 2h 1, como est
exemplifcado na Figura 5.14 a seguir.
Figura 5.14: Clculo de ns da rvore
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
Para uma melhor exemplifcao de rvores binrias pode ser utilizar a repre-
sentao de expresses aritmticas, de tal forma que a hierarquia (priorida-
de) dos operadores fque clara (bem defnida). A representao feita de tal
forma que a prioridade das operaes fque implcita: o operador de menor
prioridade da expresso aritmtica aparece na raiz da rvore; a subexpresso
que forma o operando da esquerda deste operador d origem subrvore
da esquerda da raiz; enquanto que a subexpresso que forma o operando
que forma o operando da direita d origem subrvore da direita da raiz.
Os operandos so sempre representados nos ns terminais, conforme exem-
plifcada na Figura 5.15. Suponhamos as seguintes expresses aritmticas:
(3 + 6) * (4 - 1) + 5
e-Tec Brasil Aula 5 Filas e rvores 131
+
5
_
I H
+
3 6
Figura 5.15: rvore binria de expresso aritmtica
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
Observe que se a expresso possuir parnteses, estes no aparecero na rvore.
5.5.1 Percurso em rvores binrias
H diversas formas de manipulao de rvores binrias e, em geral, estas
supem o exame dos contedos (informaes) dos ns. O acesso sistemtico
aos ns de uma rvore de maneira que cada n seja examinado no mxi-
mo uma nica vez (para que no haja repetio), sugere que a rvore seja
percorrida segundo algum critrio pr-estabelecido. Esta ao de percorrer
a rvore, com a condio de que cada n seja examinado no mximo uma
vez, denomina-se caminhamento na rvore binria. Se for realizado um ca-
minhamento numa rvore de forma que todos os seus ns sejam visitados
(acessados), os mesmos so implicitamente organizados segundo uma or-
dem linear. Dependendo do critrio estabelecido para caminhar na rvore,
obtm-se uma sequncia dos ns correspondentes x
i1
, x
i2
, ... x
in
em que:
n o nmero de ns da rvore;
x
j
o contedo do n que ocorre na j-sima posio na sequncia de
caminhamento da rvore; e
x
ik
ocorre antes de x
ip
na sequncia se o n com informao xik visita-
do antes do que o n x
ip
, segundo o caminhamento escolhido.
Estrutura de Dados e-Tec Brasil 132
Em geral so utilizadas trs formas de caminhamentos em rvores binrias
e estas so determinadas dependendo da ordem em que so visitados o n
raiz, sua subrvore esquerda e sua subrvore direita, o termo visitar
signifca a realizao de alguma operao sobre a informao do n, como
modifcao da mesma, impresso ou qualquer outra. No caso de rvores
binrias, existem determinadas ordens de caminhamento mais frequente-
mente utilizadas. As trs ordens principais so:
a) Caminhamento pr-fxado (raiz-esquerda-direita):
1. visita a raiz;
2. percorre a subrvore da esquerda;
3. percorre a subrvore da direita.
b) Caminhamento in-fxado (esquerda-raiz-direita):
1. percorre a subrvore da esquerda;
2. visita a raiz;
3. percorre a subrvore da direita.
c) Caminhamento ps-fxado (esquerda-direita-raiz):
1. percorre a subrvore da esquerda;
2. percorre a subrvore da direita;
3. visita a raiz.
O termo visita est sendo usado para indicar o acesso a um n para fns
executar alguma operao sobre ele.
e-Tec Brasil Aula 5 Filas e rvores 133
A
B C D
E F
G
Figura 5.16: rvore binria
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
As trs ordens de caminhamento acima apresentadas, aplicadas sobre a r-
vore da Figura 5.16, produzem as seguintes sequncias:
pr-fxado: A B G C D E F;
in-fxado: G B C E F D A;
ps-fxado: G F E D C B A.
Assista video-aula Estrutura
de Dados - Aula 05 - Parte II
disponvel em http://etapi.
cefetpi.br/Videos/Estrutura_
de_dados_5_parte2/index.
html. Aproveite para revisar os
contedos da aula sobre flas e
rvores..
e-Tec Brasil
Aula 6 Ordenao e pesquisa
Objetivos
Classifcar ou ordenar dados.
Implementar o mtodo da Bolha ou BubbleSort.
Conceituar e implementar diferentes estratgias de pesquisa.
6.1 Introduo ordenao
Classifcao ou ordenao de dados constitui uma das tarefas mais fre-
quentes e importantes em processamento de dados, sendo, normalmente,
auxiliar ou preparatria, visando a tornar mais simples e efcientes as demais.
Em diversas aplicaes, os dados devem ser armazenados obedecendo uma
determinada ordem. Alguns algoritmos podem explorar a ordenao dos
dados para operar de maneira mais efciente, do ponto de vista de desempe-
nho computacional. Para obtermos os dados ordenados, temos basicamente
duas alternativas: ou inserimos os elementos na estrutura de dados respei-
tando a ordenao (dizemos que a ordenao garantida por construo),
ou, a partir de um conjunto de dados j criado, aplicamos um algoritmo para
ordenar seus elementos. Os mtodos de ordenao so ser empregados em
aplicaes computacionais. Devido ao seu uso muito frequente, impor-
tante ter disposio algoritmos de ordenao sorting efcientes tanto em
termos de tempo (devem ser rpidos) como em termos de espao (devem
ocupar pouca memria durante a execuo). Vamos descrever os algoritmos
de ordenao considerando o seguinte cenrio:
a entrada um vetor cujos elementos precisam ser ordenados;
a sada o mesmo vetor com seus elementos na ordem especifcada;
o espao que pode ser utilizado apenas o espao do prprio vetor.
A importncia da classifcao de dados pode ser avaliada se considerarmos
o que seria o problema da localizao do nome de um assinante em uma
lista telefnica, na qual os nomes no estivessem em ordem alfabtica.
Sort
Classicar, ordenar (em ingls).
e-Tec Brasil Aula 6 Ordenao e pesquisa 135
Na verdade, ordenao de dados o processo pelo qual determinada a ordem
na qual devem se apresentar as entradas de uma tabela de modo que obede-
am sequncia citada por um ou mais de seus campos. Estes campos espe-
cifcados como determinantes da ordem so chamados chaves de ordenao.
Portanto, vamos discutir ordenao de vetores. Como veremos, os algoritmos
de ordenao podem ser aplicados a qualquer informao, desde que exista
uma ordem defnida entre os elementos. Podemos, por exemplo, ordenar um
vetor de valores inteiros, adotando uma ordem crescente ou decrescente.
Podemos tambm aplicar algoritmos de ordenao em vetores que guar-
dam informaes mais complexas, por exemplo um vetor que guarda os
dados relativos a alunos de uma turma, com nome, nmero de matrcula,
etc. Nesse caso, a ordem entre os elementos tem que ser defnida usando
uma das informaes do aluno como chave da ordenao: alunos ordenados
pelo nome, alunos ordenados pelo nmero de matrcula, etc. Nos casos em
que a informao complexa, raramente se encontra toda a informao
relevante sobre os elementos do vetor no prprio vetor; em vez disso, cada
componente do vetor pode conter apenas um ponteiro para a informao
propriamente dita, que pode fcar em outra posio na memria. Assim, a
ordenao pode ser feita sem necessidade de mover grandes quantidades
de informao, para re-arrumar as componentes do vetor na sua ordem cor-
reta. Para trocar a ordem entre dois elementos, apenas os ponteiros so tro-
cados. Em muitos casos, devido ao grande volume, a informao pode fcar
em um arquivo de disco, e o elemento do vetor ser apenas uma referncia
para a posio da informao nesse arquivo.
Na prxima seo, ser descrito a analisado o mtodo de ordenao por
troca, conhecido como Bolha ou BubbleSort. Por troca, entende-se os mto-
dos baseados na troca de posio dos dados, de forma a orden-los. Estes
mtodos caracterizam-se por efetuarem a ordenao sucessiva de pares de
elementos, trocando-os de posio caso estejam fora da ordem desejada.
6.2 Mtodo da bolha ou bubblesort
Esse mtodo muito simples de implementar, ele efetua a ordenao por
comparao sucessiva de pares de elementos, trocando-os de posio caso
estejam fora da ordem desejada, se necessrio, a troca de dois elementos
adjacentes, e procura levar os valores mais altos (ou mais baixos) para o fnal
da sequncia a ser ordenada.
Estrutura de Dados e-Tec Brasil 136
O algoritmo de Ordenao Bolha, ou Bubblesort, recebeu este nome
pela imagem pitoresca usada para descrev-lo: os elementos maiores so
mais leves, e sobem como bolhas at suas posies corretas.
A ideia fundamental fazer uma srie de comparaes entre os elementos
do vetor. Quando dois elementos esto fora de ordem, h uma inverso e
esses dois elementos so trocados de posio, fcando em ordem correta.
Assim, o primeiro elemento comparado com o segundo. Se uma inverso
for encontrada, a troca feita. Em seguida, independente se houve ou no
troca aps a primeira comparao, o segundo elemento comparado com
o terceiro, e, caso uma inverso seja encontrada, a troca feita. O processo
continua at que o penltimo elemento seja comparado com o ltimo. Com
este processo, garante-se que o elemento de maior valor do vetor ser leva-
do para a ltima posio. A ordenao continua, posicionando o segundo
maior elemento, o terceiro, etc., at que todo o vetor esteja ordenado.
A Figura 6.1 mostra o que acontece com o vetor no decorrer da execuo
do mtodo da bolha.
Valores originais do vetor
Aps a execuo do segundo passo, o vetor ser seguinte:
Como A[0] maior que A[1], eles trocam os valores
Como A[2] maior que A[3], eles trocam os valores
Como A[3] maior que A[4], eles trocam os valores
6 8 2 4
4
4
4
4
4
4
4
4
4
4
2
2
2
2
2
2
2
2
2
2
8
8
8
8
8
8
8
8
8
6
6
6
6
6
6
6
6
6
6 8
10 16
16
16
16
16 20
20
20
20
20
20
20
16
16
16 14
14
14
14
18
18
12
20 14 18 12
12
12
20 14 18 12
20 14 18 12
20 14 18 12
14 18 12
14 18 12
14 18 12
18
18
12
16
16
16
10
10
10
10
10
10
10
10
10
10
Figura 6.1: Execuo do mtodo da bolha
Fonte: FRANA S. V. A. Apostila de Estrutura de Dados
e-Tec Brasil Aula 6 Ordenao e pesquisa 137
Iniciaremos comparando os dois primeiros elementos (o primeiro com o segun-
do). Como eles esto desordenados, ento, trocamos as suas posies (8 e 6).
Comparamos agora o segundo com o terceiro (8 e 10). Como eles esto
desordenados, ento, trocamos as suas posies, e assim sucessivamente.
Chegamos agora ao fnal do vetor! Note que aps essa primeira fase de
comparaes e trocas o maior elemento, 20, est na sua posio correta
e fnal. Na prxima fase, todo o processo ser repetido, porm com a dife-
rena que agora as comparaes e trocas no sero mais feitas at o fnal
do vetor, mais sim at o ltimo nmero que antecede aquele que chegou a
sua posio correta no nosso caso o penltimo elemento. Vamos mais uma
vez iniciar o processo, comparando os dois primeiros elementos do vetor.
Verifcamos que quando os valores esto ordenados, no ser necessria a
troca de posies. Note que as comparaes e trocas dessa fase chegaram
ao fnal, uma vez que o ltimo elemento j est em sua posio correta e que
levamos o segundo maior elemento para a sua posio correta. Faz-se isso
at que o vetor esteja totalmente ordenado.
Uma funo que implementa esse algoritmo na linguagem C apresentada
a seguir. A funo recebe como parmetros o nmero de elementos e o pon-
teiro do primeiro elemento do vetor que se deseja ordenar. Vamos considerar
a ordenao de um vetor de valores inteiros.
/* Algoritmo de Ordenao Bolha */
void bolha (int n, int* v) {
int i, j;
for (i=n-1; i>=1; i--) {
for (j=0; j<i; j++) {
if (v[j] > v[j+1]) { /* troca */
int temp = v[j];
v[j] = v[j + 1];
v[j+1] = temp;
}
}
}
}
Embora o algoritmo de
ordenao da Bolha ou
BubbleSort seja simples, este
pode ser altamente ineciente e
raramente usado do ponto de
vista computacional.
Estrutura de Dados e-Tec Brasil 138
Abaixo a funo principal para testar esse algoritmo, lembrando que a fun-
o getch ( ) responsvel por fcar aguardando que uma tecla seja pressio-
nada para que o programa continue sua execuo normal.
/* Funo Principal */
/* Testa Algoritmo de Ordenao Bolha */
int main (void) {
int i;
int v[8] = { 25, 48, 37, 12, 57, 86, 33, 92};
printf(Vetor Desordenado: \n);
for (i=0; i<8; i++)
printf(%d ,v[i]);
printf(\n);
printf(\nPressione qualquer tecla para visualizar o Vetor
Ordenado\n\n);
getch();
bolha(8,v);
printf(Vetor Ordenado: \n);
for (i=0; i<8; i++)
printf(%d ,v[i]);
printf(\n\n);
printf(Pressione qualquer tecla para fnalizar o programa\n\n);
getch();
return 0;
}
Para evitar que o processo continue mesmo depois de o vetor estar ordena-
do, podemos interromper o processo quando houver uma passagem inteira
sem trocas, usando uma variante do algoritmo apresentado acima:
e-Tec Brasil Aula 6 Ordenao e pesquisa 139
/* Ordenao Bolha 2 Verso */
void bolha2 (int n, int* v) {
int i, j;
for (i=n-1; i>0; i--) {
int troca = 0;
for (j=0; j<i; j++)
if (v[j]>v[j+1]) { /* troca */
int temp = v[j];
v[j] = v[j+1];
v[j+1] = temp;
troca = 1;
}
if (troca == 0) /* nao houve troca */
return;
}
}
Implemente um cdigo em C, que utilize um vetor de 20 elementos inteiros,
gerado com valores lidos pelo teclado. E ordene esse algoritmo utilizando o
mtodo da Bolha. Poste no AVEA da disciplina o arquivo de sua atividade.
Esse mesmo algoritmo pode ser aplicado a vetores que guardam outras in-
formaes. O cdigo escrito acima pode ser reaproveitado, a menos de al-
guns detalhes. Primeiro, a assinatura da funo deve ser alterada, pois deixa-
mos de ter um vetor de inteiros; segundo, a forma de comparao entre os
elementos tambm deve ser alterada Para aumentar o potencial de reuso do
nosso cdigo, podemos reescrever o algoritmo de ordenao apresentado
acima tornando-o independente da informao armazenada no vetor.
A implementao do cdigo completo em linguagem C que demonstra o
mtodo de ordenao bolha numa lista desordenada e esttica de alunos
relacionados pela matrcula, nome, notas e mdia. estar disponibilizado no
AVEA em formatos .pdf e .cpp!
Estrutura de Dados e-Tec Brasil 140
6.3 Introduo pesquisa
Finalizando nosso caderno didtico, discutiremos diferentes estratgias
para efetuarmos a pesquisa de um elemento num determinado conjunto
de dados. A operao de pesquisa encontrada com muita frequncia em
aplicaes computacionais, sendo portanto importante estudar estratgias
distintas para efetu-la. Por exemplo, um programa de controle de estoque
pode pesquisar, dado um cdigo numrico ou um nome, a descrio e as
caractersticas de um determinado produto. Se temos um grande nmero de
produtos cadastrados, o mtodo para efetuar a pesquisa deve ser efciente,
caso contrrio a pesquisa pode ser muito demorada, inviabilizando sua uti-
lizao. Conforme veremos, certos mtodos de organizar dados tornam o
processo de busca mais efciente. Como a operao de busca uma tarefa
muito comum em computao, o conhecimento desses mtodos de fun-
damental importncia para quem vai lidar com programao.
Inicialmente, consideraremos que temos nossos dados armazenados em um
vetor e discutiremos os algoritmos de pesquisa que podemos empregar. Por-
tanto, dado um vetor vet com n elementos, desejamos saber se um determi-
nado elemento elem est ou no presente no vetor. Estudaremos algumas
estratgias de pesquisa que so:
Pesquisa Sequencial: consiste basicamente em pesquisar num vetor
consiste em percorrermos o vetor, elemento a elemento, verifcando se o
elemento de interesse igual a um dos elementos do vetor.
Pesquisa Binria: resumidamente pesquisar o elemento que busca-
mos com o valor do elemento armazenado no meio do vetor com dados
ordenados.
A seguir teremos um melhor discernimento sobre as estratgias de pesquisa.
Identifque situaes do dia-a-dia que podem ser facilitadas atravs da uti-
lizao dos mtodos de Pesquisa. Poste no AVEA da disciplina o arquivo de
sua atividade.
6.4 Pesquisa sequencial
A pesquisa sequencial um mtodo extremamente simples, mas pode ser
muito inefciente quando o nmero de elementos no vetor for muito gran-
de. Isto porque o algoritmo (a funo, no caso) pode ter que procura do
primeiro ao ltimo elemento do vetor at encontrar ou no um determinado
Assista video-aula da disciplina
de Estrutura de Dados Aula
06 Parte I disponvel em
http://cefetpi.nucleoead.net/
etapi/. Aproveite para revisar
os contedos da aula sobre
ordenao e pesquisa.
e-Tec Brasil Aula 6 Ordenao e pesquisa 141
elemento. Portanto, a forma mais simples de fazermos uma pesquisa num
vetor consiste em percorrermos o vetor, elemento a elemento, verifcando
se o elemento de interesse igual a um dos elementos do vetor. Esse al-
goritmo pode ser implementado conforme ilustrado pelo cdigo a seguir,
considerando-se um vetor de nmeros inteiros. A funo apresentada tem
como valor de retorno o ndice do vetor no qual foi encontrado o elemento;
se o elemento no for encontrado, o valor de retorno 1.
int pesquisa (int n, int* vet, int elem) {
int i;
for (i=0; i<n; i++) {
if (elem == vet[i])
return i; /* elemento encontrado */
}
/* percorreu todo o vetor e no encontrou elemento */
return -1;
}
Esse algoritmo de pesquisa extremamente simples, mas pode ser muito inef-
ciente quando o nmero de elementos no vetor for muito grande. Isto porque
o algoritmo (a funo, no caso) pode ter que percorrer todos os elementos do
vetor para verifcar que um determinado elemento est ou no presente. Di-
zemos que no pior caso ser necessrio realizar n comparaes, onde n repre-
senta o nmero de elementos no vetor. Portanto, o desempenho computacio-
nal desse algoritmo varia linearmente com relao ao tamanho do problema.
Abaixo temos a funo principal para testar esse algoritmo de pesquisa linear.
Lembrando que a funo getch( ) responsvel por fcar aguardando que uma
tecla seja pressionada para que o programa continue sua execuo normal.
#include <stdio.h>
#include <conio.h>
/* Programa que faz a pesquisa em um vetor */
int main (void) {
Estrutura de Dados e-Tec Brasil 142
int v[8] = {24,11,47, 38,58,77,66,82};
int e = 58; /* informao que se deseja pesquisar */
int p;
p = pesquisa(8,v,e);
if (p == -1)
printf(Elemento nao encontrado.\n);
else
printf(Elemento encontrado no indice:%d , p);
getch ();
return 0;
}
Em diversas aplicaes reais, precisamos de algoritmos de pesquisa mais ef-
cientes. Seria possvel melhorarmos a efcincia do algoritmo de pesquisa
mostrado acima? Infelizmente, se os elementos estiverem armazenados em
uma ordem aleatria no vetor, no temos como melhorar o algoritmo de
pesquisa, pois precisamos verifcar todos os elementos. No entanto, se as-
sumirmos, por exemplo, que os elementos esto armazenados em ordem
crescente, podemos concluir que um elemento no est presente no vetor se
acharmos um elemento maior, pois se o elemento que estamos pesquisando
estivesse presente ele precederia um elemento maior na ordem do vetor.
O cdigo abaixo ilustra a implementao da pesquisa linear assumindo que
os elementos do vetor esto ordenados (vamos assumir ordem crescente).
int pesquisa_ord (int n, int* vet, int elem) {
int i;
for (i=0; i<n; i++) {
if (elem == vet[i])
return i; /* elemento encontrado */
else
if (elem < vet[i])
e-Tec Brasil Aula 6 Ordenao e pesquisa 143
return -1; /* interrompe pesquisa */
}
/* percorreu todo o vetor e no encontrou elemento */
return -1;
}
6.4 Pesquisa binria
No caso dos elementos do vetor estarem em ordem, podemos aplicar um
algoritmo mais efciente para realizarmos a pesquisa.
Trata-se do algoritmo de pesquisa binria. A ideia do algoritmo testar o
elemento que buscamos com o valor do elemento armazenado no meio do
vetor com dados ordenados. Muito parecido com o mtodo que usamos
quando desejamos procurar um nmero numa lista telefnica. Se o elemen-
to que estamos pesquisando for menor que o elemento do meio, sabemos
que, se o elemento estiver presente no vetor, ele estar na primeira parte do
vetor; se for maior, estar na segunda parte do vetor; se for igual, achamos o
elemento no vetor. Se concluirmos que o elemento est numa das partes do
vetor, repetimos o procedimento considerando apenas a parte que restou:
comparamos o elemento que estamos pesquisando com o elemento arma-
zenado no meio dessa parte. Este procedimento continuamente repetido,
subdividindo a parte de interesse, at encontrarmos o elemento ou chegar-
mos a uma parte do vetor com tamanho zero.
Antes de realizar uma pesquisa binria necessrio ordenar seus dados.
Utilizando o mtodo de pesquisa binria, podemos ter por exemplo, um
vetor de tamanho fxo, com elementos dispostos em ordem crescente e pos-
suindo por exemplo, 100 elementos. Ao invs de iniciar a pesquisa no ele-
mento inicial (0) e se entender at o elemento fnal (100), esse mtodo testa
o elemento mdio (50) e verifcar se o nmero a ser encontrado maior ou
menor que o valor contido naquele ndice. Se for menor, como o vetor est
em ordem crescente, podemos desprezar todos os nmeros acima de 50 e
recomear a pesquisa no intervalo de 0 a 50. Esse procedimento dever se
repetir at que o nmero correspondente seja encontrado ou no exista no
vetor. Um procedimento muito mais efciente do que a pesquisa sequencial.
Estrutura de Dados e-Tec Brasil 144
O cdigo a seguir ilustra uma implementao de pesquisa binria num vetor
de valores inteiros ordenados de forma crescente.
int pesquisa_bin (int n, int* vet, int elem) {
/* no inicio consideramos todo o vetor */
int ini = 0;
int fm = n-1;
int meio;
/* enquanto a parte restante for maior que zero */
while (ini <= fm) {
meio = (ini + fm) / 2;
if (elem < vet[meio])
fm = meio 1; /* ajusta posico fnal */
else
if (elem > vet[meio])
ini = meio + 1; /* ajusta posico inicial */
else
return meio; /* elemento encontrado */
}
/* no encontrou: restou parte de tamanho zero */
return -1;
}
O desempenho desse algoritmo muito superior ao de pesquisa linear. Nova-
mente, o pior caso caracteriza-se pela situao do elemento que estamos pro-
curando no estar no vetor. Quantas vezes precisamos repetir o procedimento
de subdiviso para concluirmos que o elemento no est presente no vetor? A
cada repetio, a parte considerada na pesquisa dividida metade.
e-Tec Brasil Aula 6 Ordenao e pesquisa 145
O algoritmo de pesquisa binria consiste em repetirmos o mesmo procedi-
mento recursivamente, podendo ser naturalmente implementado de forma
recursiva. Embora a implementao no recursiva seja mais efciente e mais
adequada para esse algoritmo, a implementao recursiva mais sucinta e
vale a pena ser apresentada. Na implementao recursiva, temos dois ca-
sos a serem tratados. No primeiro, a pesquisa deve continuar na primeira
metade do vetor, logo chamamos a funo recursivamente passando como
parmetros o nmero de elementos dessa primeira parte restante e o mes-
mo ponteiro para o primeiro elemento, pois a primeira parte tem o mesmo
primeiro elemento do que o vetor como um todo. No segundo caso, a pes-
quisa deve continuar apenas na segunda parte do vetor, logo passamos na
chamada recursiva, alm do nmero de elementos restantes, um ponteiro
para o primeiro elemento dessa segunda parte. Para simplifcar, a funo
de pesquisa apenas informa se o elemento pertence ou no ao vetor, tendo
como valor de retorno falso (0) ou verdadeiro (1). Uma possvel implementa-
o usando essa estratgia mostrada a seguir.
int pesquisa_bin_rec (int n, int* vet, int elem) {
/* testa condio de contorno: parte com tamanho zero */
if (n <= 0)
return 0;
else {
/* deve pesquisar o elemento entre os ndices 0 e n - 1 */
int meio = (n - 1) / 2;
if (elem < vet[meio])
return pesquisa_bin_rec(meio,vet,elem);
else
if (elem > vet[meio])
return pesquisa_bin_rec(n 1-meio,
&vet[meio + 1],elem);
else
return 1; /* elemento encontrado */
}
}
Estrutura de Dados e-Tec Brasil 146
Em particular, devemos notar a expresso &vet[meio+1] que, como sabe-
mos, resulta num ponteiro para o primeiro elemento da segunda parte do
vetor. Se quisermos que a funo tenha como valor de retorno o ndice do
elemento, devemos acertar o valor retornado pela chamada recursiva na
segunda parte do vetor.
Os mesmos algoritmos de pesquisa sequencial e binria podem ser aplicados
a vetores que guardam outras informaes, alm de nmeros inteiros.
A implementao do cdigo completo em linguagem C, onde o cdigo re-
presenta um sistema de cadastro de alunos num curso tcnico de inform-
tica, onde so armazenadas as informaes referente matrcula, nome,
situao (aprovado ou reprovado) de cada aluno, e ainda duas notas e a
partir dessas notas gerado uma mdia. O cdigo para aplicar a pesquisa se-
quencial e binria estar disponibilizado no AVEA em formatos .pdf e .cpp!
Resumo
Nesta aula abordamos conceitos de classifcao ou ordenao de dados.
O mtodo de ordenao adotado foi o mtodo de ordenao por troca,
conhecido como Bolha ou BubbleSort. Por se tratar de um mtodo muito
simples de implementar, recebeu este nome pela imagem pitoresca usada
para descrev-lo: os elementos maiores so mais leves, e sobem como bo-
lhas at suas posies corretas. E foi feita a implementao do BubbleSort na
linguagem C. Aps ordenarmos os elementos de um determinado conjunto,
necessrio se faz saber realizar uma pesquisa. Foram ento, disponibilizadas
informaes sobre estratgias de pesquisa conhecidas como: Pesquisa Se-
quencial e Binria. E suas posteriores implementaes na linguagem C.
Atividades de aprendizagem
1. Demonstre grafcamente a ordenao dos dados 25, 48, 37, 12, 57, 86,
33, 92 usando o mtodo da Bolha.
2. Implemente um cdigo em C, que utilize um vetor de 2000 elementos
inteiros, gerado com valores lidos pelo teclado. E ordene esse algoritmo
utilizando o mtodo da Bolha.
3. Em diversas aplicaes reais, precisamos de algoritmos de busca mais ef-
cientes. Seria possvel melhorarmos a efcincia do algoritmo de busca?
Assista video-aula da disciplina
de Estrutura de Dados Aula
06 Parte II disponvel em
http://cefetpi.nucleoead.net/
etapi/. Aproveite para revisar
os contedos da aula sobre
ordenao e pesquisa.
e-Tec Brasil Aula 6 Ordenao e pesquisa 147
Referncias
ASCENCIO, A. F. G., CAMPOS, E. A. V. Fundamentos da Programao de
Computadores. Editora Pearson Prentice Hall. 2 edio, 2007.
FRANA S. V. A. Apostila de Estrutura de Dados. Acessado em 04/12/2011 http://
www.4shared.com/ofce/MWxzbSi9/Estrutura_de_Dados_-_Sonia_Vir.html.
HOROWITZ, E.; SAHNI, S. Fundamentos de Estruturas de Dados. Rio de Janeiro, Ed.
Campus, 1986.
LEISERSON, C., RIVEST, L. Algoritmos - Teoria e Pratica. Ed.Campus, 1 edio, 2002.
MIZRAHI, Victorine Viviane. Treinamento em C. Ed Pearson Prentice Hall, 2 edio,
2008.
PINTO, Wilson Silva. Introduo ao Desenvolvimento de Algoritmos e Estrutura
de dados. Ed. rica LTDA.
TENEMBAUM, Aaron M. Estrutura de Dados Usando C. So Paulo: Makron Books do
Brasil, 1995.
TREMBLAY, Jean Paul e RICHARD, B. Bunt. Cincias dos Computadores, Uma
Abordagem Algortmica. Ed. McGraw Hill.
SCHILDT, H. C Completo e Total, Ed. Makron Books, 3 edio, 1997.
SZWARCFITER, J Luiz; MARKENZON, Lilian. Estruturas de Dados e seus Algoritmos.
Rio de Janeiro: Livros Tcnicos e Cientcos Editora S. A, 2 edio, 1994.
VELLOSO, Paulo. Estruturas de Dados. Rio de Janeiro: Ed. Campus, 1991.
VILLAS, Marcos V & Outros. Estruturas de Dados: Conceitos e Tcnicas de implementao.
Rio de Janeiro: Ed. Campus, 1993.
WIRTH, N. Algoritmos e Estruturas de Dados. Rio de Janeiro, Prentice-Hall. 1989.
e-Tec Brasil 148 Referncias
Currculo dos professores-autores
Ndia Mendes dos Santos bacharel em Cincias Contbeis pela Universi-
dade Federal do Piau, Campus Ministro Reis Velloso, em Parnaba, e Tecnlo-
go em Processamento de Dados pela Universidade Estadual do Piau, Campus
de Parnaba. Tem ps-graduao Lato Sensu em Banco de Dados, pelo
Centro Federal de Educao do Piau. Mestre em Engenharia Eltrica pela
Universidade Federal do Cear. E atualmente faz Doutorado em Computa-
o pela Universidade Federal Fluminense, linha de pesquisa em Inteligncia
Artifcial. Desde 2006, professora do quadro efetivo do Instituto Federal
de Cincia e Tecnologia do Piau, Campus Angical do Piau, na categoria de
Dedicao Exclusiva. Seus principais interesses de pesquisa e atuao so in-
teligncia artifcial, estrutura de dados, eletrnica digital, microprocessadores
digitais e linguagens de programao. E faz parte da Equipe de Educao
Distncia do Instituto Federal de Educao, Cincia e Tecnologia do Piau,
atuando como tutora distncia do polo de Monsenhor Gil.
Geraldo Nunes da Silva Junior bacharel em Cincia da Computao, licen
ciado em Letras/Ingls e ps-graduado Lato Sensu em Docncia do Ensino
Superior pela Universidade Estadual do Piau. Professor do quadro efetivo do
Instituto Federal de Cincia e Tecnologia do Piau desde 2009, Campus Piripiri.
Professor de informtica do quadro efetivo da rede pblica municipal de Edu-
cao. Foi professor da Universidade Estadual do Piau por 7 anos, lecionando
disciplinas: Lgica de Programao, Linguagens de Programao, Estrutura de
Dados, Banco de Dados. Presente junto Equipe de Educao Distncia do
Instituto Federal de Educao, Cincia e Tecnologia do Piau desde seu incio,
atuando como professor regente e agora professor conteudista.
Otlio Paulo da Silva Neto bacharel em Sistemas de Informao pela
Faculdade Integral Diferencial. Tem ps-graduao Lato Sensu em Docn-
cia do Ensino Superior. E atualmente diretor - Netsoft Tecnologia Ltda,
Coordenador de Tecnologia do Ncleo de Educao a Distncia do Instituto
Federal de Educao, Cincia e Tecnologia do Piau, professor substituto da
Universidade Estadual do Piau, professor titular do Instituto Federal de Edu-
cao, Cincia e Tecnologia do Piau. Tem experincia na rea de Cincia da
Computao, com nfase em Banco de Dados e Programao para Web,
atuando principalmente nos seguintes temas: Netsac Sistema de Gesto
Comercial e Industrial, patrimnio, procedimentos mdicos, plano de sade
e NetProcess - Sistema de Gesto de processos totalmente via web.
e-Tec Brasil 149 Currculo dos professores-autores
CDIGO DE BARRAS
ISBN

Curso Tcnico em Informtica
Estrutura de Dados
Ndia Mendes dos Santos
Geraldo Nunes da Silva Jnior
Otlio Paulo da Silva Neto

Você também pode gostar