Академический Документы
Профессиональный Документы
Культура Документы
DADOS
autor
RICARDO BALIEIRO
1 edio
SESES
rio de janeiro 2015
Conselho editorial regiane burger; roberto paes; gladis linhares; karen bortoloti;
helcimara afonso de souza
Todos os direitos reservados. Nenhuma parte desta obra pode ser reproduzida ou transmitida
por quaisquer meios (eletrnico ou mecnico, incluindo fotocpia e gravao) ou arquivada em
qualquer sistema ou banco de dados sem permisso escrita da Editora. Copyright seses, 2015.
isbn: 978-85-60923-34-2
cdd 005.1
Prefcio 9
1. Introduo 11
Objetivos 12
1.1 Conceitos fundamentais 13
1.1.1 Conceito de estruturas de dados 15
1.1.2 Tipos de dados, Estrutura de dados e
Tipos Abstratos de dados. 16
1.1.3 Conceito de funo 17
1.1.4 Conceito de struct 17
1.1.5 Conceitos de rvore, grafo, pilha, fila e lista 18
1.1.5.1Listas 19
1.1.5.2Pilhas 20
1.1.5.3Filas 21
1.1.5.4rvores 22
1.1.5.5Grafos 24
1.1.6 Listas lineares 25
1.1.6.1Definio 25
1.1.7 Uso de funes definidas pelo programador 28
1.1.7.1 Programa Al Mundo 28
1.1.8 Implementao de funes com e sem retorno,
com e sem passagem de parmetros 30
1.1.8.1 Prottipo de funo 30
1.1.8.2 Funo sem prottipo de funo 32
1.1.9 Diferena entre parmetros passados por valor e
parmetros passados por referncia 33
1.1.9.1 Passagem de parmetros por valor 33
1.1.9.2 Passagem de parmetros por referncia 34
1.1.10 Retorno de valores 36
1.1.10.1 Tipo de funo 36
1.1.10.2 Comando return 37
1.1.11 Escopo de variveis (local e global) 38
1.1.11.1 Declarando variveis 38
1.1.12 Implementao de funes tendo vetores como parmetros 39
1.1.12.1 Passando vetor para funes 41
1.1.12.2Escopo 43
1.1.13 Construo de biblioteca de funes 44
Atividades 46
Reflexo 47
Referncias bibliogrficas 48
2. Estruturas Heterogneas,
Ordenao e Pesquisa 49
Objetivos 50
2.1 Uso das estruturas heterogneas definidas pelo programador 51
2.2 Tipos de elementos que podem ser membros de uma estrutura 51
2.3 Definio e declarao de estruturas heterogneas
localmente e globalmente 52
2.4 Construo de funes usando estruturas heterogneas 54
2.5 Implementao de programas usando estruturas heterogneas 55
2.6 Ordenao 56
2.6.1 Mtodos de ordenao 56
2.7 Compreender e usar o mtodo de ordenao
insertion sort, (insero) em estruturas homogneas e
em estruturas heterogneas. 57
2.8 Compreender e usar o mtodo de ordenao selection
sort (seleo) em estruturas homogneas e em
estruturas heterogneas. 58
2.9 Compreender e usar o mtodo de ordenao bubble sort (bolha)
em estruturas homogneas e em estruturas heterogneas 60
2.10Pesquisa 61
2.10.1 Compreender e usar os mtodos de pesquisa sequencial
em estruturas homogneas e em estruturas heterogneas. 62
2.10.2 Compreender e usar os mtodos de pesquisa binria em
estruturas homogneas e em estruturas heterogneas 62
Atividades 64
Reflexo 64
Referncias bibliogrficas 65
Objetivos 106
4.1 Definio de ponteiro 107
4.2 Operador de endereo, operador de indireo
e operador seta 107
4.2.1 Operador de endereo 107
4.2.2 Operador de indireo 109
4.2.3 Aritmtica de ponteiros 115
4.2.4 Ponteiros e funes 122
4.2.5 Operador seta 126
4.3 Alocao e desalocao de memria 128
Atividades 131
Reflexo 132
Referncias bibliogrficas 132
Objetivos 134
5.1 Listas lineares Simplesmente Encadeadas 135
5.2 Operaes com listas lineares simplesmente encadeadas 137
5.2.1 Criar lista 142
5.2.2 Verificar lista vazia 143
5.2.3 Inserir um novo n 143
5.2.4 Localizar um n 145
5.2.5 Obter o tamanho 146
5.2.6 Exibir lista 147
5.2.7 Remover n 148
5.3 Operaes com lista linear simplesmente encadeada,
realizando aplicaes 149
5.4 Pilha DINMICA 149
5.5 Operaes com pilha dinmica. 150
5.5.1 Criar uma pilha vazia 150
5.5.2 Verificar pilha vazia 151
5.5.3 Empilhar (Push) 151
5.5.4 Exibir o topo da pilha (Stacktop) 152
5.5.5 Exibir toda a pilha (Pop) 153
5.5.6 Desempilhar 153
5.6 Fila dinmica 154
5.7 Operaes com fila dinmica. 155
5.7.1 Criar uma fila vazia 155
5.7.2 Verificar fila vazia 155
5.7.3 Enfileirar 155
5.7.4 Exibir o primeiro n da fila 156
5.7.5 Desenfileirar 157
5.7.6 Aplicaes com Fila 158
5.8 Listas Circulares Simplesmente Encadeadas 158
5.9 Operaes bsicas com listas circulares 158
5.9.1 Criar lista 159
5.9.2 Verificar lista vazia 159
5.9.3 Inserir um novo n 160
5.9.4 Exibir lista 161
5.9.5 Remover n 161
5.10 Listas Duplamente Encadeadas 163
5.11 Operaes bsicas com listas duplamente encadeadas 163
5.11.1 Criar lista 164
5.11.2 Verificar lista vazia 164
5.11.3 Inserir um n 165
5.11.4 Localizar um n 167
5.11.5 Exibir lista 168
5.11.6 Remover n 169
Atividades 170
Reflexo 171
Referncias bibliogrficas 172
Gabarito 172
8
Prefcio
Prezados(as) alunos(as),
Bons estudos!
9
1
Introduo
Para podemos aprofundar em todos os aspectos envolvidos em estrutura de da-
dos, necessitamos criar uma base slida de conhecimentos bsicos que sero
primordiais para a sequncia dos prximos captulos. Diante disto, estudare-
mos os diversos tipos de estrutura de dados, como tambm suas principais ca-
ractersticas e aplicaes.
OBJETIVOS
Conhecer os conceitos fundamentais contidos nas estruturas de dados;
Estudar os aspectos que envolvem a implementao das estruturas de dados;
Discutir sobre os diversos tipos de estrutura de dados;
Estudar e implementar funes.
12 captulo 1
1.1 Conceitos fundamentais
A soluo de diversos problemas feito atravs de desenvolvimento de siste-
mas de informao (programas). Segundo (LAUDON & LAUDON, 2007) os sis-
temas de informao so formados por diversos componentes que efetuam a
coleta, processamento, armazenamento e distribuio de informaes (dados)
destinadas ao controle e coordenao de organizaes como tambm o apoio
a tomada de decises. As principais atividades de um sistema so exibidas no
diagrama da figura 1.1. A entrada responsvel pela coleta dos fatos brutos
(dados) a serem processados. O processamento (programa) tem a finalidade de
transformar os dados de entrada atravs de uma sequncia finita e ordenada
de passos. O resultado do processamento apresentado na sada. O feedback
auxilia nos ajustes dos dados de entrada de acordo com as sadas obtidas.
Entradas Sadas
Processo de
transformao
Controle e
avaliao
Feedback
captulo 1 13
x=?
6m
1,5 m
4m
1m
2m
8m
Notem que alm dos dados da vela, temos outros que no fazem parte do
problema. Tanto neste caso, como em outros, deve se selecionar o conjunto de
dados que sejam considerados de maior relevncia para encontrar os resulta-
dos desejados.
Em seguida, define-se o procedimento para efetuar o processamento dos
dados selecionados. Como a vela do barco tem a forma de um tringulo retn-
gulo, ser utilizado o Teorema de Pitgoras para a resoluo do problema. A
soluo dada pelo clculo da hipotenusa atravs dos valores definidos para os
catetos (dados da vela). O programa recebe como dados de entrada, os valores
dos catetos, efetua o processamento, calculando a hipotenusa e o resultado
enviado como dado de sada.
c a c= b2 + a2
A b C
a = 6, b = 4 c = 7.5
Programa
14 captulo 1
Alm da escolha dos dados de maior relevncia para encontrar os resulta-
dos desejados, outro fator importante de como sero organizados estes dados
para a soluo de um problema.
Considere um programa para cadastro de cliente de uma concessionria
de veculos. Um conjunto de dados relevantes para este cadastro poderia ser:
nome, endereo, data de nascimento, etc. Notem que o peso, altura, cor dos
olhos e cabelo so dados irrelevantes, para este problema, e desta forma, no
fazem parte do cadastro. Se o programa fosse direcionado a uma agncia pu-
blicitria, estes dados seriam de extrema importncia. Isto demonstra que a
escolha dos dados deve ter como base o problema a ser resolvido.
Em seguida, definem-se como os dados sero organizados, ou seja, como
sero representados um programa. Esta representao est relacionada com
as variveis disponveis na linguagem que ser utilizada no desenvolvimento
do programa. A escolha da representao deve levar em conta as operaes
que sero realizadas sobre os dados. Dependendo da escolha, pode gerar uma
maior ou menor complexidade da representao e consequentemente afetar
o desempenho do programa. Por exemplo, a operao, imprimir uma lista de
cliente, dependendo da complexidade da representao dos dados, pode ge-
rar um programa muito lento. A estrutura de dados diminui sensivelmente a
complexidade da representao dos dados, como tambm tende a criao de
programas com maior desempenho.
captulo 1 15
De acordo com Mizrahi (2006), uma estrutura de dados pode ser definida como sendo
uma coleo de variveis, podendo ser tipos iguais ou diferentes, reunidas sob um ni-
co nome. Vrios autores denominam estrutura de dados como sendo registros.
16 captulo 1
estes dados, como por exemplo, inserir um cliente no conjunto de dados do
cliente, excluir um arquivo de uma rvore de diretrios, etc.
Nome_da_Funo: nome pelo qual a funo ser chamada para ser execu-
tada sua tarefa. O nome da funo no pode comear com nmeros.
Listas de parmetros: so os dados para que a funo possa executar sua
tarefa.
Tipo_do_Dado_de_Retorno: retorna o resultado da execuo da tarefa re-
alizada pela funo.
Corpo da funo: sequncia de comandos para executar a tarde proposta
pela funo.
captulo 1 17
conjunto de variveis, que so agrupas e acessadas por um nico nome dentro
do programa. Atravs de struct possvel definir um novo tipo de dado com-
posto por muitas variveis, denominadas membros da estrutura. O exemplo a
seguir, ilustra a utilizao de struct.
struct DADOS_ALUNO{
int CodAluno;
char Nome[100];
int Turma;
};
struct DADOS_ALUNO AlunoA;
AlunoA.CodAluno = 10;
strcpy(AlunoA.Nome, "Gabriela");
AlunoA.Turma = 250;
Pilhas
Filas
Lista
rvores
Grafos
18 captulo 1
1.1.5.1 Listas
As listas so consideradas as estruturas mais simples para interligar elementos
de um conjunto. Segundo (VELOSO, 1986) as listas so estruturas que permitem
representar um conjunto de dados, que de alguma forma se relacionam, de for-
ma que os elementos fiquem dispostos em sequncia (figura 1.4). Cada elemen-
to da lista, por exemplo, x1, tambm denominado n, pode conter um dado pri-
mitivo (inteiro, string, etc. - figura 1.4) ou dado composto (registro - figura 1.5).
I = 0 1 2 n2 n1
= 0 1 2 n 2 n 1
I = 0 1 2 n2 n1
= 0 1 2 n 2 n 1
Cliente
Cd. Cliente Nome Endereo Fone RG
Cliente
Cd. Cliente Nome Endereo Fone RG
Cliente
Cd. Cliente Nome Endereo Fone RG
captulo 1 19
Algumas operaes mais comuns so:
1.1.5.2 Pilhas
20 captulo 1
Empilha Desempilha
Topo n
n 1
3
2
Fundo 1
Figura 1.6 Pilha.
1.1.5.3 Filas.
Incio Fim
captulo 1 21
As operaes mais comuns efetuadas com filas so:
1.1.5.4 rvores
4
2 3
5 8 9
6 7
22 captulo 1
Diferente das rvores naturais, que tm sua origem de baixo para cima, uma
estrutura de dados em forma de rvore representada de cima para baixo. A
rvore composta de ns e arestas (conexes). Os ns, denominados tambm
com vrtice, so estruturas de dados que representam as informaes a serem
processadas. As arestas so as conexes entre os ns. Conexes podem ser do
tipo: unidirecional ou bidirecional. O tipo unidirecional pode ir apenas de um
n para outro, mas no pode fazer o caminho contrrio. J o bidirecional pode
de qualquer n chegar a outro. Sendo que o topo representado pelo n raiz
e os demais ns se conectam a ele, ou a outro que j esteja conectado a ele.
O n raiz o n pai dos demais. Um n pai pode estar conectado a vrios ns
filhos. Cada n filho pode estar conectado apenas um n pai. A exceo fica
por conta do n raiz que no tem n pai. Um exemplo de utilizao de rvores a
estruturao de diretrios de um computador (figura 1.9)
CONEXO
Leia um pouco mais sobre os conceitos de rvores em: http://www2.dc.ufscar.br/~bsi/
materiais/ed/u16.html.
captulo 1 23
1.1.5.5 Grafos
6
5
4
1
2
3
Sua estrutura formada pela conexo dos ns atravs das arestas. No caso
dos grafos, as arestas podem ou no ser direcionadas. Quando so direciona-
das, o grafo denominado grafo direcionado (figura 1.11). No h restries
de conexo, assim, o grafo pode ter conexes permitindo ter um caminho de
um n para qualquer outro. Os grafos permitem representar diversos proble-
mas, tais como, redes de computadores, trajetos entres cidades, roteamento de
veculos, etc.
Cravinhos Limeira
Rio Claro
So Paulo
Ribeiro Preto
So Carlos
Araraquara
24 captulo 1
1.1.6 Listas lineares
1.1.6.1 Definio
Uma lista linear L uma coleo L:[x1, x2, ..., xn], n>=0 tal que:
x1 o primeiro elemento da lista.
xn o ltimo elemento da lista.
xk, x<k<n, seguido do elemento xk+1 e precedido de xk 1 na lista.
Primeiro = 1 1
2 2
ltimo = n n
captulo 1 25
As operaes realizadas por uma lista podem ser definidas de acordo com a
aplicao em que esteja sendo utilizada. Segundo (ZIVIANI, 1996), as operaes
mais comuns, para as listas, encontradas na maioria das aplicaes so:
Exemplos:
Seja a lista L = [7.0, 8.5, 10, 9.5] representando n = 4 elementos.
x1 =7.0; x2=8.5; x3=10; x4=9.5;
Para inserir um novo elemento, com valor igual a 6.0 na 3 posio da lista,
os elementos 10 e 9.5 sero deslocados na lista, L = [7.0, 8.5, 6.0, 10, 9.5].
x1=7.0; x2=8.5; x3=6.0; x4=10; x5=9.5;
26 captulo 1
1 1 Primeiro = 1 1
2 2 2
3 3
7 7
n 1 n 1
ltimo = n n ltimo = n n
Primeiro = 1 1
2 2
3 3
7
n 1
ltimo = n n
Exemplos:
Seja a lista L = [7.0, 8.5, 6.0, 10, 9.5] representando n = 5 elementos.
x1=7.0; x2=8.5; x3=6.0; x4=10; x5=9.5;
Para remover o elemento com valor igual a 6.0 na 3 posio da lista, os ele-
mentos 10 e 9.5 sero deslocados na lista, L = [7.0, 8.5, 10, 9.5].
x1=7.0; x2=8.5; x3=10; x4=9.5;
captulo 1 27
1.1.7 Uso de funes definidas pelo programador
A funo pode ser vista como um atalho para um bloco de cdigo. Isto permite que um
programa grande complexo, seja dividido em blocos menores utilizando funes para
representar partes lgicas do processo.
#include <iostream>
using namespace std;
// Incio da Funo principal
void main(){
cout << "Al mundo";
system("pause > null");
}
#include <iostream>
28 captulo 1
A biblioteca iostream possui os comandos de entrada e sada em C++, como por
exemplo, enviar dados para o monitor ou receber dados digitado no teclado.
// ou /* ... */
void main(){...}
captulo 1 29
A funo system(...) envia comandos para o sistema operacional. Retirando
esta linha do cdigo, a janela que mostra o resultado da execuo do programa,
aberta e fechada rapidamente, no sendo possvel visualizar os resultados.
Para que a janela permanea aberta, utiliza-se o parmetro pause > null. Assim
a janela permanecer aberta at que o usurio aperte qualquer tecla.
30 captulo 1
no incio do programa, indicando o tipo da funo e os parmetros que rece-
bem. O objetivo do prottipo fornecer informaes, para checagem de erro,
ao compilador. A seguir tem-se o programa completo. Basicamente so todos
os elementos da declarao da funo mais o ponto e vrgula.
Efetuados estes passos, a funo esta pronta para ser chamada. A seguir,
tem-se o programa completo para melhor visualizao dos locais onde cada
parte do cdigo definido.
#include <iostream>
using namespace std;
// Prottipo da funo
float CalcPerimetroCircunferencia(float raio);
void main(){
float Per;
// Chamando a funo
Per = CalcPerimetroCircunferencia(5);
cout << "O permetro da circunferncia : " << Per;
system("pause > null");
}
float CalcPerimetroCircunferencia(float raio)
{
float Perimetro;
// P=2..r
Perimetro = 2 * 3.14 * raio ;
return Perimetro;
}
captulo 1 31
Ao finalizar a execuo da funo, o resultado retornado pela funo arma-
zenado nesta varivel Per e em seguida visualizado na tela atravs da execuo
do comando cout.
CONEXO
Aprofunde seus conhecimentos sobre funes: http://www.tiexpert.net/programacao/c/
funcoes.php.
#include <iostream>
using namespace std;
float CalcPerimetroCircunferencia(float raio)
{
float Perimetro;
// P=2..r
Perimetro = 2 * 3.14 * raio ;
return Perimetro;
}
void main(){
float Per;
// Chama a funo a ser executada
Per = CalcPerimetroCircunferencia(5);
cout << "O permetro da circunferncia : " << Per;
system("pause > null");
}
32 captulo 1
1.1.9 Diferena entre parmetros passados por valor e parmetros
passados por referncia
Na passagem de parmetro por valor, a funo cria uma cpia dados. A cpia
armazenada em variveis, que so criadas quando a funo chamada e des-
trudas quando a funo finalizada. Por exemplo, quando a funo Beep(...)
descrita a seguir, iniciou sua execuo, automaticamente foi criada a varivel
NroVezes e armazenado o valor 10, passado como parmetro para a funo. Ao
final da execuo da funo, a varivel NroVezes destruda automaticamente.
#include <iostream>
using namespace std;
void Beep(int Tempo); // Prottipo da funo
void main(){
Beep(10); // Chama a funo a ser executada
}
void Beep(int NroVezes){
int Ind;
for(Ind = 0; Ind < NroVezes; Ind++) {
cout << '\x07';
}
}
captulo 1 33
1.1.9.2 Passagem de parmetros por referncia
#include <iostream>
using namespace std;
// Prottipo da funo
void Alterar(int& paramIdade);
void main(){
int Idade;
Idade = 20;
Alterar(Idade);
cout << "O valor da idade : " << Idade << endl;
system("pause > null");
}
34 captulo 1
void Alterar(int& paramIdade){
paramIdade = 100;
}
#include <iostream>
using namespace std;
void CalcularPreco(float VlrProdutoReal, float& VlrProdutoDolar,
float& VlrProdutoEuro);
void main(){
float VlrProdReal, VlrProdDolar, VlrProdEuro;
cout << "Digite o valor do produto: ";
cin >> VlrProdReal;
// Chamada da funo
CalcularPreco(VlrProdReal, VlrProdDolar, VlrProdEuro);
cout << "Valor em Dolar: " << VlrProdDolar << endl;
cout << "Valor em Euro: " << VlrProdEuro << endl;
system("pause > null");
}
void CalcularPreco(float VlrProdutoReal, float& VlrProdutoDolar,
float& VlrProdutoEuro){
VlrProdutoDolar = VlrProdutoReal / 2.621;
VlrProdutoEuro = VlrProdutoReal / 3.084;
}
captulo 1 35
1.1.10 Retorno de valores
O tipo de funo definido de acordo com o tipo de valor que ela retorna. No
nosso exemplo, como a funo est retornando o valor do tipo float, ela dita
do tipo float.
float CalcPerimetroCircunferencia(...){
...
}
#include <iostream>
using namespace std;
void Beep(int Tempo); // Prottipo da funo
void main(){
Beep(10); // Chama a funo a ser executada
}
void Beep(int NroVezes){
int Ind;
for(Ind = 0; Ind < NroVezes; Ind++) {
cout << '\x07';
}
}
36 captulo 1
void Beep(){
int Ind;
for(Ind = 0; Ind < 2; Ind++) {
cout << '\x07';
}
}
void Beep(void){
int Ind;
for(Ind = 0; Ind < 2; Ind++) {
cout << '\x07';
}
}
return;
return expresso;
return (expresso);
ou
captulo 1 37
float CalcPerimetroCircunferencia(float raio){
// P=2..r
return (2 * 3.14 * raio);}
O nome de uma varivel pode conter a quantidade de caracteres que forem ne-
cessrios, mas existem algumas regras. Primeiramente, no se pode utilizar n-
meros no primeiro caractere, ou seja, o primeiro caractere deve ser uma letra ou
um caractere de sublinhado. Segundo, no pode conter palavras reservadas. Na
tabela 1.2, so listadas algumas destas palavras reservadas.
38 captulo 1
class for new sizeof volatile
const friend operator static while
default goto pascal switch
do huge private template
Ao declarar uma varivel importante utilizar o tipo correto, para que seja
reservado o espao correspondente em memria, para receber o valor do dado.
int x;
int y;
float z;
x = 10;
y = 30;
y = 20.5;
int x, y;
float z;
A linguagem C++ permite que as variveis sejam criadas e inicializadas ao
mesmo tempo. Neste caso, cada varivel deve ser declarada separadamente.
captulo 1 39
Em C++ considerada base zero. Base zero significa que o primeiro elemen-
to do vetor inicia na posio zero. No exemplo abaixo, um vetor criado para re-
ceber os valores pagos, por ms, de um determinado produto. O vetor foi criado
para receber 12 elementos, sendo o primeiro de ndice 0 e o ltimo de ndice 11.
Uma ateno especial deve ser dada a valores do tipo texto. O armazena-
mento de texto feito atravs de vetores do tipo char. A linguagem C++ no per-
mite que seja atribudo diretamente um texto varivel. Caso isso seja feito, o
compilador ir gerar uma mensagem de erro. A atribuio de texto feita uti-
lizando a funo strcpy(destino, origem). A funo strcpy(...) copia o texto do
parmetro origem para uma varivel colocada no parmetro destino.
char NomeDisciplina[100];
NomeDisciplina = "Estrutura de Dados"; // ERRADO: NO PERMITIDO
strcpy( NomeDisciplina, "Estrutura de Dados"); // CERTO: Permitido
40 captulo 1
Caso o valor da varivel um texto que o usurio deva digitar, usa-se o cin. O
objeto cin representa o stream de entrada, ou seja, ele efetua a leitura dos dados
digitados no teclado e armazena na varivel.
#include <iostream>
using namespace std;
void main(){
system("chcp 1252 > nul");
char NomeAluno[100];
cout << "Digite o nome do aluno: ";
cin >> NomeAluno;
system("pause > null");
}
#include <iostream>
using namespace std;
#define TAM_MAX 10
void main(){
int Ind;
double CodAlunos[TAM_MAX], CopiaCodAlunos[TAM_MAX];
for(Ind=0; Ind < TAM_MAX; Ind++){
// Copia os dados de um vetor para outro
CopiaCodAlunos[Ind] = CodAlunos[Ind];
}
system("pause > null");
}
captulo 1 41
#include <iostream>
using namespace std;
void GerarValores(float PagtoM[], float VlrPagto);
void main(){
int Ind;
float PagtoMes[12];
GerarValores(PagtoMes, 150.80);
for(Ind = 0; Ind < 12; Ind++){
cout << "Pagamento Ms " << Ind << ": " << PagtoMes[Ind]
<< endl;
}
system("pause > null");
}
void GerarValores(float PagtoM[], float VlrPagto){
int Ind;
for(Ind = 0; Ind < 12; Ind++){
PagtoM[Ind] = VlrPagto;
}
}
GerarValores(PagtoMes, 150.80);
1.1.12.2 Escopo
42 captulo 1
Variveis locais
#include <iostream>
using namespace std;
void main(){
int ValorA, ValorB, Total;
cout << "Digite o valor de A: ";
cin >> ValorA;
cout << "Digite o valor de B: ";
cin >> ValorB;
Total = ValorA + ValorB;
cout << "Total = " << Total;
system("pause > null");
}
Variveis globais
So variveis declaradas fora de qualquer funo. Dessa forma, podem ser aces-
sadas e alteradas por qualquer funo dentro do programa.
Para ilustrar, o programa anterior ser alterado para que o escopo das vari-
veis ValorA, ValorB sejam globais.
#include <iostream>
using namespace std;
int Somar();
int ValorA, ValorB;
captulo 1 43
void main(){
int Total;
cout << "Digite o valor de A: ";
cin >> ValorA;
cout << "Digite o valor de B: ";
cin >> ValorB;
Total = Somar();
cout << "Total = " << Total;
system("pause > null");
}
int Somar(){
int ValorTotal;
ValorTotal = ValorA + ValorB;
return ValorTotal;
}
Note que as variveis ValorA e ValorB foram declaradas fora de qualquer fun-
o. Dessa forma, tanto a funo main() quanto Somar(), puderam acess-las.
CONEXO
Aprofunde seus conhecimentos sobre variveis locais e globais: http://www.tiexpert.net/
programacao/c/variaveis-globais-e-locais.php.
44 captulo 1
#include <iostream>
using namespace std;
int Somar();
int Subtrair();
int Multiplicar();
int Dividir();
int ValorA, ValorB;
void main(){
int Total;
cout << "Digite o valor de A: ";
cin >> ValorA;
cout << "Digite o valor de B: ";
cin >> ValorB;
Total = Somar();
cout << "Total = " << Total;
system("pause > null");
}
int Somar(){
int ValorTotal;
ValorTotal = ValorA + ValorB;
return ValorTotal;
}
int Subtrair(){
int ValorTotal;
ValorTotal = ValorA - ValorB;
return ValorTotal;
}
int Multiplicar (){
int ValorTotal;
ValorTotal = ValorA * ValorB;
return ValorTotal;
}
int Dividir (){
int ValorTotal;
ValorTotal = ValorA / ValorB;
return ValorTotal;
}
captulo 1 45
ATIVIDADES
01. De acordo com o material, assinale a opo correta em relao a estrutura de dados
pilha.
a) O primeiro elemento a ser inserido ser o primeiro a ser retirado.
b) O primeiro elemento a ser inserido ir at o fim da sequencia e ser retirado.
c) O elemento retirado da base da pilha.
d) O ltimo elemento a ser inserido ser o primeiro elemento a ser retirado.
e) O ltimo elemento a ser inserido ser o ltimo elemento a ser retirado.
03. De acordo com o material qual a melhor estrutura de dados para representar problemas
do tipo redes de computadores, trajetos entres cidades, roteamento de veculos, etc.?
a) lista
b) pilha
c) fila
d) rvore
e) grafo
int main () {
int y = 3;
cout << y << endl;
funcaoZ (y);
cout << y << endl;
}
void funcaoZ (int z) {
int x;
x = z;
cout << z << endl;
z = 5 ;
cout << x << endl;
}
46 captulo 1
a) 3 3 5 5
b) 3 3 3 5
c) 3 3 3 3
d) 3 3 0 5
e) 3 3 5 0
05. Um programador esta desenvolvendo uma estrutura de dados para um sistema de ca-
dastro de veculo. Defina a estrutura (registro) para conter os seguintes dados: modelo do
veculo (com 100 caracteres), marca (50 caracteres), ano de fabricao (nmero) e ano do
modelo (nmero).
REFLEXO
Neste captulo aprendemos de forma geral, as caractersticas e funes das estruturas de
dados, que servir como base para o aprofundamento na sequncia de nossos estudos.
Estudamos conceitos envolvidos na elaborao das estruturas de dados, tais como, tipos de
dados e tipos abstratos de dados.
Vimos como so utilizadas as funes e variveis em C++. Iniciamos como estudo da
principal funo em C++, a funo main(). Posteriormente vimos como criar nossas pr-
prias funes. Estudamos as formas de enviar as variveis como parmetros por valor e por
referncia para que as funes possam process-las.
Sugerimos que voc faa todos os exerccios propostos e pesquise outras fontes para
aprofundar seus conhecimentos. Em caso de dvidas, retorne aos tpicos e faa a releitura
com bastante ateno.
LEITURA
Para voc avanar mais o seu nvel de aprendizagem envolvendo os conceitos de estrutura
de dados e demais assuntos deste captulo, consulte a sugesto de links abaixo: CELES,
W.; RANGEL, J. L. Apostila de Estruturas de Dados. Disponvel em: http://www-usr.inf.ufsm.
br/~juvizzotto/elc1067-2013b/estrut-dados-pucrio.pdf. Acesso em: Jan: 2015.
Para voc avanar mais o seu nvel de aprendizagem envolvendo os conceitos de siste-
mas operacionais e demais assuntos deste captulo, consulte as sugestes de links abaixo:
Captulo 1, 5 do livro: MIZRAHI, V. V. Treinamento em Linguagem C++: Mdulo 1. 2 ed.
So Paulo, Editora Prentice-Hall, 2006.
captulo 1 47
REFERNCIAS BIBLIOGRFICAS
AGUILAR, L. J. Fundamentos de Programao: Algoritmos, Estruturas de Dados e Objetos. 3
ed. So Paulo: McGraw-Hill, 2008.
CELES, W.; RANGEL, J. L. Apostila de Estruturas de dados. Disponvel em: http://www-usr.inf.ufsm.
br/~juvizzotto/elc1067-2013b/estrut-dados-pucrio.pdf. Acesso em: Jan: 2015.
DEITEL, H. M., & DEITEL, P. J. C++ Como Programar. 3 ed. Porto Alegre: Bookman, 2001.
LAUDON, K. C., & LAUDON, J. P. Sistemas de Informao Gerenciais. 6 ed. So Paulo: Prentice
Hall, 2007.
MIZRAHI, V. V. Treinamento em Linguagem C++: Mdulos 1 e 2. 2 ed. So Paulo: Prentice Hall,
2006.
SCHILDT, H. C Completo e Total. 3 ed. So Paulo: Makron Books Editora Ltda, 1996.
SZWARCFITER, J. L.; MARKENZON, L. Estruturas de Dados e seus Algoritmos. 2 ed. Rio de
Janeiro: LTC, 1994.
TANENBAUM, A. M., LANGSAM, Y.; AUGENSTEIN, M. J. Estruturas de Dados Usando C. So Paulo:
Makron Books, 1995.
VELOSO, P. E. Estruturas de Dados. 4 ed. Rio de Janeiro: Campus, 1986.
VILLAS, M. E. Estruturas de Dados: conceitos e tcnicas de implementao. Rio de Janeiro:
Campus, 1993.
48 captulo 1
2
Estruturas
Heterogneas,
Ordenao e
Pesquisa
Neste captulo, iremos estudar as estruturas heterogneas e como podemos
programa-las em C++. Dessa forma iremos entender a importncia destas es-
truturas na implementao de diversos aplicativos, principalmente os que uti-
lizao estruturas de dados.
Em seguida veremos o uso de mtodos de ordenao. O conhecimento de
como funcionam e como implementar um algoritmo de ordenao funda-
mental no desenvolvimento de aplicativos que manipulam dados. Veremos di-
versos algoritmos de ordenao, tais como, insertion sort, selection sort e
bubble sort.
Finalizaremos o captulo, estudando os mtodos de pesquisa sequencial e
binria de dados.
OBJETIVOS
Definio e declarao de estruturas heterogneas localmente e globalmente;
Uso das estruturas heterogneas definidas pelo programador;
Compreender e usar os diversos mtodos de ordenao;
Compreender e usar os mtodos de pesquisa sequencial e binria.
50 captulo 2
2.1 Uso das estruturas heterogneas
definidas pelo programador
struct DADOS_ALUNO{
int CodAluno;
char Nome[100];
int Turma;
};
CONEXO
Para entender melhor TAD Tipo Abstrato de Dado, veja o link: http://www2.dc.ufscar.
br/~bsi/materiais/ed/u2.html. O autor ilustra o conceito de TAD utilizando vrios exemplos
do cotidiano e do desenvolvimento de sistemas.
captulo 2 51
2.3 Definio e declarao de estruturas
heterogneas localmente e globalmente
#include <iostream>
using namespace std;
void main(){
struct DADOS_ALUNO{
int CodAluno;
char Nome[100];
int Turma;
};
AlunoA.CodAluno = 10;
strcpy(AlunoA.Nome, "Gabriela");
AlunoA.Turma = 250;
struct DADOS_ALUNO{
int CodAluno;
char Nome[100];
int Turma;
};
52 captulo 2
Uma vez a estrutura definida, possvel declarar variveis do tipo
DADOS_ALUNO.
AlunoA.CodAluno = 10;
strcpy(AlunoA.Nome, "Gabriela");
AlunoA.Turma = 250;
Para que possa ser utilizada por todas as funes que possam ser criadas
dentro da aplicao, a estrutura deve ser declarada globalmente, ou seja, fora
da funo main().
#include <iostream>
using namespace std;
struct DADOS_ALUNO{
int CodAluno;
char Nome[100];
int Turma;
};
struct DADOS_ALUNO AlunoA;
captulo 2 53
void main(){
AlunoA.CodAluno = 10;
strcpy(AlunoA.Nome, "Gabriela");
AlunoA.Turma = 250;
As estruturas podem ser passadas para funes da mesma forma como so fei-
tas com as variveis. O tipo do parmetro da funo, que recebe a estrutura,
deve ser do mesmo tipo desta estrutura.
No exemplo a seguir a varivel AlunoA foi passada para a funo Imprimir(...).
Notem que o tipo do parmetro que recebe a varivel do tipo da estrutura
DADOS_ALUNO.
#include <iostream>
using namespace std;
struct DADOS_ALUNO{
int CodAluno;
char Nome[100];
int Turma;
};
54 captulo 2
void Imprimir(DADOS_ALUNO Aluno);
void main(){
struct DADOS_ALUNO AlunoA;
captulo 2 55
2.6 Ordenao
A ordenao um dos requisitos mais comuns em aplicaes. Um simples re-
latrio, produzido por um programa, ter um ordenao levando em conta al-
gum critrio. Para que os dados sejam ordenados, podem-se adotar duas abor-
dagens: ao inserir um determinado elemento na lista, respeitar a ordenao da
estrutura, ou aplicar algum algoritmo de ordenao a um conjunto de dados
j criado. Uma vez que um conjunto de dados esteja ordenado, h uma grande
facilidade na recuperao de um determinado elemento deste conjunto. Todos
estes aspectos mostram a importncia de conhecer os algoritmos de ordenao
para melhor aplica-los s estrutura de dados.
CONEXO
Leia um pouco mais sobre ordenao em: http://www.ft.unicamp.br/liag/programacao/or-
denacao.html. Entenda um pouco mais com este outro artigo: http://www.decom.ufop.br/
menotti/aedI082/tps/tp3-sol1.pdf.
56 captulo 2
2.7 Compreender e usar o mtodo de
ordenao insertion sort, (insero) em
estruturas homogneas e em estruturas
heterogneas.
5 8 7 4 2 5 8 7 4 2 5 8 7 4 2 5 8 7 4 2
7 4 2
5 8 4 2 5 8 7 2 5 8 7 4
7 4 2
5 8 4 2 5 7 8 2 4 5 7 8
5 7 8 4 2 4 5 7 8 2 2 4 5 7 8
captulo 2 57
bool InsertionSort(DADOS_ALUNO Alunos[], int Pos) {
DADOS_ALUNO eleito;
int i, j;
if (Pos == 0){
cout << "ERRO: Vetor vazio.";
return false;
}
for (i = 1; i < Pos; i++){
eleito = Alunos[i];
j = i - 1;
while ((j>=0) && (eleito.CodAluno < Alunos[j].CodAluno)) {
Alunos[j+1] = Alunos[j];
j--;
}
Alunos[j+1] = eleito;
}
return true;
}
58 captulo 2
1a Fase 4a Fase
5 8 2 4 7 2 4 5 8 7
2a Fase 5a Fase
2 8 5 4 7 2 4 5 7 8
3a Fase
2 4 5 8 7
Figura 2.2 Seleo.
captulo 2 59
2.9 Compreender e usar o mtodo de
ordenao bubble sort (bolha) em estruturas
homogneas e em estruturas heterogneas
O Bubblesort um dos mtodos de ordenao mais conhecidos e de fcil im-
plementao. A ordenao, utilizando este mtodo, feita atravs de troca de
valores entre posies consecutivas (figura 2.3). A figura ilustra a ordenao uti-
lizando uma estrutura homognea (vetor). Neste algoritimo, um determinado
valor levado para posies mais altas ou mais baixas do conjunto de valores.
Dado o exemplo da figura 2.3, com os valores iniciais, ser aplicado o Buble-
sort. Inicialmente comparece os dois primeiro elementos do vetor: 7 e 5. Como
o valor 7 maior que 5, ento, trocam de posio. Em seguida compara 7 com
9. Como esta ordenados, no h troca. Por fim, a ltima comparao feita a
troca entre 9 e 3. Na prxima fase, o 9 no ser comparado. A comparao ir
at o elemento anterior ao 9. Este processo repetido at que todo o conjunto
esteja ordenado.
5 7 9 3 5 7 3 9 3 5 7 9
5 7 9 3 5 3 7 9
5 7 3 9
O termo Bubble Sort (literalmente "flutuao por Bolha") vem da forma como as
bolhas se comportam em um tanque. Dentro de um tanque, as bolhas se arranjam de
forma a procurarem o prprio nvel.
60 captulo 2
bool BubbleSort(DADOS_ALUNO Alunos[], int Pos) {
DADOS_ALUNO Aux;
int i, j;
if (Pos == 0){
cout << "ERRO: Vetor vazio.";
return false;
}
2.10 Pesquisa
Como na ordenao, a pesquisa encontrada na maioria de sistemas computa-
cionais. Por exemplo, um programa de controle de matrcula de uma universi-
dade, pode localizar os dados de um aluno atravs do seu nmero de matrcula,
nome ou CEP. Caso a base de dados tenha milhares de alunos cadastrados, o
algoritmo de busca deve ser muito eficiente para que no haja demora no re-
torno das informaes do aluno pesquisado. Este pequeno exemplo mostra a
importncia do estudo dos mtodos de pesquisa.
captulo 2 61
2.10.1 Compreender e usar os mtodos de pesquisa sequencial em
estruturas homogneas e em estruturas heterogneas.
Para que seja utilizada a pesquisa binria, o vetor deve estar ordenado. A ideia
localizar o elemento central do vetor e compar-lo ao elemento procurado.
Caso o elemento central for maior que o elemento procurado, ento a prxima
procura ser na segunda parte do vetor (estruturas homogneas) (figura 2.4).
Por exemplo, deseja-se localizar o elemento com valor igual a 36. Inicialmente
localiza-se o valor central do vetor, no caso o valor 11. Como 11 menor que 36,
62 captulo 2
a prxima busca ser na segunda parte do vetor. Divide-se a segunda parte e lo-
caliza o valor central, no caso o 36. Compara-se o elemento central ao elemento
procurado. Como neste caso foi encontrado, ento para-se as busca, caso con-
trrio, continuaria o procedimento at localizar o elemento procurado.
3 4 7 9 10 11 21 35 36 41 58
1a Fase 2a Fase
Meio
3 4 7 9 10 11 21 35 36 41 58
1a Metade 2a Metade
Meio
Figura 2.4 Busca binria.
captulo 2 63
else if (CodAluno < Alunos[meio].CodAluno)
sup = meio-1;
else
inf = meio+1;
}
return false; // no encontrado
}
ATIVIDADES
01. Ao inserir um valor em uma lista sequencial ordenada, o que acontecer com esta lista?
a) A ordem da lista ser altera e a quantidade de elementos ser alterada.
b) Ser feita uma busca com divises sucessivas da lista.
c) A ordem da lista ser alterada para decrescente.
d) A ordem da lista ser alterada para crescente.
e) A ordem da lista ser mantida e a quantidade de elementos ser alterada.
02. Qual tipo de busca utiliza a tcnica de diviso, sucessivas, ao meio da lista para encontrar
um determinado valor pesquisado?
a) Pesquisa sequencial
b) Insero
c) Bolha
d) Pesquisa binria
e) Seleo
REFLEXO
Neste captulo aprendemos as caractersticas e funes das estruturas de dados, que servir
como base para o aprofundamento na sequncia de nossos estudos. Para tanto, vimos de-
finies das estruturas de dados, seus objetivos e suas formas homognea e heterognea.
Estudamos conceitos envolvidos na elaborao das estruturas de dados, tais como, tipos de
dados e tipos abstratos de dados.
64 captulo 2
LEITURA
Para voc avanar mais o seu nvel de aprendizagem envolvendo os conceitos de ordenao
e demais assuntos deste captulo, consulte a sugesto de link abaixo:
NAZAR JNIOR, A. C.; GOMES, D. M. ALGORITMOS E ESTRUTURAS DE DADOS:
Mtodos de ordenao interna. Disponvel em: http://www.decom.ufop.br/menotti/aedI082/
tps/tp3-sol1.pdf. Acesso em: Jan: 2015.
REFERNCIAS BIBLIOGRFICAS
AGUILAR, L. J. Fundamentos de Programao: Algoritmos, Estruturas de Dados e Objetos. 3
ed. So Paulo: McGraw-Hill, 2008.
CELES, W.; RANGEL, J. L. Apostila de Estruturas de dados. Disponvel em: http://www-usr.inf.
ufsm.br/~juvizzotto/elc1067-2013b/estrut-dados-pucrio.pdf. Acesso em: Jan: 2015.
DEITEL, H. M., & DEITEL, P. J. C++ Como Programar. 3 ed. Porto Alegre: Bookman, 2001.
LAUDON, K. C., & LAUDON, J. P. Sistemas de Informao Gerenciais. 6 ed. So Paulo: Prentice
Hall, 2007.
MIZRAHI, V. V. Treinamento em Linguagem C++: Mdulo 1 e 2. 2 ed. So Paulo: Prentice Hall,
2006.
SZWARCFITER, J. L.; MARKENZON, L. Estruturas de Dados e seus Algoritmos. 2 ed. Rio de
Janeiro: LTC, 1994.
TANENBAUM, A. M., LANGSAM, Y.; AUGENSTEIN, M. J. Estruturas de Dados Usando C. So
Paulo: Makron Books, 1995.
VELOSO, P. E. Estruturas de Dados. 4 ed. Rio de Janeiro: Campus, 1986.
VILLAS, M. E. Estruturas de Dados: conceitos e tcnicas de implementao. Rio de Janeiro:
Campus, 1993.
captulo 2 65
66 captulo 2
3
Uso das Estruturas
de Dados Lista
Linear Sequencial
No captulo 1 estudamos as principais caractersticas das listas lineares. Vimos
que as listas lineares so estruturas de dados que tm como objetivo armazenar
um conjunto de dados, que de alguma forma se relacionam, com os elementos
dispostos em sequncia.
As listas lineares podem ser representadas quanto a sua forma de armaze-
namento, de duas formas: sequencial (contgua) ou encadeada. A forma cont-
gua considerada a maneira mais simples de armazenar uma estrutura de lista
na memria. Isto porque os elementos da lista ocupam posies consecutivas
na memria do computador. Esta abordagem traz como vantagem o acesso a
qualquer elemento da lista de forma direta e tempo constante.
Neste sentido, iremos nos aprofundar nas prximas sees, sobre as
listas lineares sequenciais (contgua) e suas variaes como pilhas e filas.
Adicionalmente, estudaremos diversas formas de ordenao de dados.
OBJETIVOS
Aprofundaremos os nossos estudos tericos e prticos a respeito das estruturas de dados;
Compreender as variaes e operaes dos tipos de estruturas.
68 captulo 3
3.1 Conceito das Estruturas de Dados
Lista Linear
I = 0 1 2 n2 n1
= 0 1 2 n 2 n 1
Cliente
Cd. Cliente Nome Endereo Fone RG
Cliente
Cd. Cliente Nome Endereo Fone RG
Cliente
Cd. Cliente Nome Endereo Fone RG
captulo 3 69
sequencial para estes tipos de estruturas. No entanto, Szwarcfiter e Markenzon
(1994) alertam que um estudo aprofundado deve ser feito quando se empregam
diversas estruturas simultaneamente. Devido ao fato de diversas estruturas se-
rem onerosas no uso de memria. Conclui-se, dessa forma, que o uso da lista
linear sequencial indicado em aplicaes onde h necessidade de poucos ele-
mentos e que se possa estimar o tamanho mximo de elementos da lista.
Vantagens da lista linear sequencial:
Uma das vantagens das listas lineares encadeadas sobre as sequenciais que
no h a necessidade de pr-determinar a quantidade mxima de elementos
da lista. Os elementos no so armazenados de forma contgua e sim, ocupam
qualquer posio de memria disponvel.
70 captulo 3
N cabea N Ponteiro
Cliente
Cd. Cliente Nome Endereo Fone RG
Cliente
Cd. Cliente Nome Endereo Fone RG
Cliente
Cd. Cliente Nome Endereo Fone RG
captulo 3 71
N anterior Posio de insero N posterior
Dados
Novo n
Dados
N a ser removido
N anterior N posterior
72 captulo 3
3.2 Uso das estruturas de dados Lista
linear sequencial.
I = 0 1 2 n2 n1
= 0 1 2 n 2 n 1
Pelo fato das listas lineares sequenciais serem estrutura esttica, a alocao
de memria feita durante a compilao do programa. Consequentemente, de-
ve-se pr-determinar a quantidade mxima de elementos da lista. Os elementos
armazenados nos ns podem conter dado primitivo (inteiro, string etc.) (figu-
ra 3.7) ou dado composto (registro figura 3.8).
I = 0 1 2 n2 n1
= 0 1 2 n 2 n 1
I = 0 1 2 n2 n1
= 0 1 2 n 2 n 1
Cliente
Cd. Cliente Nome Endereo Fone RG
Cliente
Cd. Cliente Nome Endereo Fone RG
Cliente
Cd. Cliente Nome Endereo Fone RG
captulo 3 73
3.3 Principais caractersticas da Lista Linear
Sequencial
Uma lista linear L uma coleo L:[x1, x2, ..., xn], n>=0 tal que:
x1 o primeiro elemento da lista.
xn o ltimo elemento da lista.
xk, x<k<n, seguido do elemento xk+1 e precedido de xk 1 na lista.
Primeiro = 1 1
2 2
ltimo = n n
74 captulo 3
A seguir, sero implementadas algumas das operaes acima descritas.
Como o n de uma lista pode conter dados do tipo primitivo ou compostos,
ser apresentado a implementao para estas duas possibilidades.
Para definir uma lista primitiva de elementos, como por exemplo, para guardar
as notas de alunos, pode ser utilizado um vetor. A lista linear definida pelo
array ListaNotas[...]. A quantidade mxima de elementos da lista informada
na constante MAX_LISTA. J PosUltimoElemLista tem trs finalidades. Primei-
ramente controlar a quantidade de elementos da lista para que no ultrapasse
a quantidade mxima permitida. Segundo, indicar a posio de insero de um
novo elemento, caso este seja inserido no final da lista. Terceiro, indicar a po-
sio do ltimo elemento vlido na lista. Por fim Ret recebe o valor de retorno,
da funo chamada, indicando se houve ou no sucesso na operao realizada.
A figura 3.10 ilustra a lista e as variveis de controle descritas anteriormente.
0 1 2 3 4 5 6 7 8 9
ListaNotas
PosUltimoElemLista = 0
MAX_LISTA
#include <iostream>
#include "conio.h"
using namespace std;
captulo 3 75
void main(){
A funo Inserir(...) insere um novo elemento no final da lista. Para tanto, re-
cebe o vetor Lista[] por referncia, o valor a ser inserido e a varivel de contro-
le de elementos da lista PosUltimoElem. Primeiramente a funo verifica se a
lista possui espao para inserir o novo elemento. Se a lista no estiver cheia, o
elemento inserido no final da lista e a varivel de controle PosUltimoElem
incrementada em uma unidade. Caso a lista esteja cheia, dado um aviso para
o usurio e a funo retorna falso, indicando que a operao no foi realizada.
if (PosUltimoElem == MAX_LISTA){
cout << "ERRO: Lista cheia.";
return false;
}
else {
Lista[PosUltimoElem] = valor;
PosUltimoElem++;
}
return true;
}
76 captulo 3
3.4.3 Estruturas homogneas - Inserir um elemento em uma
posio determinada
captulo 3 77
3.4.4 Estruturas homogneas - Exibir toda a lista
A funo a seguir exibe todos os elementos inseridos na lista. Note que, in-
dependente do tamanho mximo definido para a lista em MAX_LISTA, se-
ro exibidos apenas os elementos inseridos at o momento, controlados por
PosUltimoElemLista.
if (PosUltimoElem == 0){
cout << "ERRO: Lista vazia.";
return false;
}
78 captulo 3
int Pesquisar(float Lista[], float valor, int &PosUltimoElem) {
int ind;
for(ind = 0; ind < PosUltimoElem; ind++ ){
if (Lista[ind] == valor){
return ind;
}
}
return -1;
}
if (PosUltimoElem == 0){
cout << "ERRO: Lista vazia.";
return false;
}
PosRem = Pesquisar(Lista, valor, PosUltimoElem);
for(ind = PosRem; ind < PosUltimoElem; ind++ ){
Lista[ind] = Lista[ind+1];
}
captulo 3 79
PosUltimoElem--;
return true;
}
#include <iostream>
#include "conio.h"
using namespace std;
struct DADOS_ALUNO{
int CodAluno;
char Nome[100];
int Turma;
};
void main(){
80 captulo 3
3.4.8 Estruturas heterogneas - Inserir um elemento na lista
if (PosUltimoElem == MAX_LISTA){
cout << "ERRO: Lista cheia.";
return false;
}
else {
Lista[PosUltimoElem].CodAluno = CodAluno;
strcpy(Lista[PosUltimoElem].Nome, Nome);
Lista[PosUltimoElem].Turma = Turma;
PosUltimoElem++;
}
return true;
}
captulo 3 81
3.4.9 Estruturas heterogneas - Inserir um elemento em uma
posio determinada
if (PosUltimoElem == MAX_LISTA){
cout << "ERRO: Lista cheia.";
return false;
}
else {
82 captulo 3
cout << "Digite o nome do aluno: ";
cin >> Nome;
cout << "Digite a turma: ";
cin >> Turma;
cout << "Digite o posio para insero: ";
cin >> pos;
Ret = InserirPos(ListaDeAlunos, pos, CodAluno, Nome, Turma,
PosUltimoElemLista);
if(Ret == true){cout << "Insero efetuada com sucesso!" << endl;}
A funo a seguir exibe todos os elementos inseridos na lista. Note que, in-
dependente do tamanho mximo definido para a lista em MAX_LISTA, se-
ro exibidos apenas os elementos inseridos at o momento, controlados por
PosUltimoElemLista.
captulo 3 83
3.4.11 Estruturas heterogneas - Pesquisar um determinado
elemento e retornar sua posio
84 captulo 3
bool RemoverElem(DADOS_ALUNO Lista[], int CodAluno,
int &PosUltimoElem) {
int ind;
int PosRem;
if (PosUltimoElem == 0){
cout << "ERRO: Lista vazia.";
return false;
}
// Encontra a posio do elemento que ser removido
PosRem = Pesquisar(Lista, CodAluno, PosUltimoElem);
PosUltimoElem--;
return true;
}
CONEXO
Para entender melhor a implementao de listas sequenciais, veja o link: http://www.ft.
unicamp.br/liag/siteEd/implementacao/lista-ligada-estruturada-estatica.php. O autor imple-
menta diversas operaes com listas sequenciais estticas.
captulo 3 85
3.5 Aplicao dos conceitos de ordenao e
pesquisa com Lista Linear Sequencial
Como foi descrito no captulo 1, a pilha um tipo especial de lista onde os ele-
mentos a serem inseridos ou removidos ocorrero no topo da pilha ( Figura 29).
Esta caracterstica conhecida como LIFO (Last In, First Out - ltimo a Entrar,
86 captulo 3
Primeiro a Sair). Dessa forma, o ltimo elemento que foi inserido na pilha ser o
primeiro elemento a ser removido.
Empilha Desempilha
Topo n
n 1
3
2
Fundo 1
Uma pilha P uma coleo P:[x1, x2, ..., xn], n>=0 tal que:
x1 o primeiro elemento da lista.
xn o ltimo elemento da lista.
xk, x<k<n, seguido do elemento xk+1 e precedido de xk 1 na pilha.
captulo 3 87
3.9 Teste de aplicao com Pilha sequencial.
3.9.1 Criar uma pilha vazia
Empilha Desempilha
PilhaAlunos[...] n
n 1
PosTopo 3
2
1
#include <iostream>
#include "conio.h"
using namespace std;
struct DADOS_ALUNO{
int CodAluno;
char Nome[100];
int Turma;
};
88 captulo 3
void main(){
system("pause>null");
}
if (PosTopo == MAX_PILHA){
cout << "ERRO: Pilha cheia.";
return false;
}
else {
Pilha[PosTopo].CodAluno = CodAluno;
strcpy(Pilha[PosTopo].Nome, Nome);
Pilha[PosTopo].Turma = Turma;
PosTopo++;
}
return true;
}
captulo 3 89
Abaixo segue um exemplo de chamada da funo.
if (PosTopo == 0){
cout << "ERRO: Pilha vazia.";
return false;
}
90 captulo 3
3.9.4 Exibir toda a pilha (Pop)
if (PosTopo == 0){
cout << "ERRO: Pilha vazia.";
return false;
}
// Exibe do TOPO para o FUNDO
for(ind = PosTopo - 1; ind >= 0; ind-- ){
cout << "Cdigo do Aluno: " << Pilha[ind].CodAluno
<<endl;
cout << "Nome: " << Pilha[ind].Nome <<endl;
cout << "Turma: " << Pilha[ind].Turma <<endl;
}
return true;
}
Abaixo segue um exemplo de chamada da funo.
3.9.5 Desempilhar
captulo 3 91
bool Desempilhar(int &PosTopo) {
if (PosTopo == 0){
cout << "ERRO: pilha vazia.";
return false;
}
else {
// Desempilha o elemento do topo
PosTopo--;
}
return true;
}
Ret = Desempilhar(PosTopo);
if(Ret == false){cout << "No foi possvel desempilhar a pilha."
<< endl;}
CONEXO
Para entender melhor a implementao de pilhas, veja o link: http://www.devmedia.com.br/
pilhas-fundamentos-e-implementacao-da-estrutura-em-java/28241
92 captulo 3
3.11 Representao da estrutura de dados
Fila por contiguidade (Fila simples).
O acesso aos dados da fila feito atravs de FIFO (First In, First Out - Primei-
ro a Entrar, Primeiro a Sair) (figura 3.13), ou seja, os elementos so inseridos em
uma extremidade, e retirados na extremidade oposta.
0 1 2 n-2 n-1
Desenleira x0 x1 x2 ... xn-2 xn-1 Enleira
Incio Fim
Uma fila P uma coleo F:[x1, x2, ..., xn], n>=0 tal que:
x1 o primeiro elemento da lista.
xn o ltimo elemento da lista.
xk, x<k<n, seguido do elemento xk+1 e precedido de xk 1 na fila.
captulo 3 93
3.12.1 Criar uma fila vazia
0 1 2 n2 n1
Desenfileira Enfileira
0 1 2 n 2 n 1
Incio Fim
#include <iostream>
#include "conio.h"
using namespace std;
struct DADOS_ALUNO{
int CodAluno;
char Nome[100];
int Turma;
};
void main(){
94 captulo 3
A operao enfileiramento incrementa a varivel FimFila a medida que um
novo elemento inserido na fila. O desenfileiramento apenas incrementa a va-
rivel IniFila sem realmente remover o elemento fisicamente do vetor.
Incio Fim
10 Enfileira Desenfileira 10 7 15 3 9
IniFila FimFila IniFila FimFila
10 7 Enfileira Desenfileira 10 7 15 3 9
IniFila FimFila IniFila FimFila
10 7 15 Enfileira Desenfileira 10 7 15 3 9
IniFila FimFila IniFila FimFila
10 7 15 3 Enfileira Desenfileira 10 7 15 3 9
IniFila FimFila IniFila FimFila
10 7 15 3 9 Enfileira Desenfileira 10 7 15 3 9
IniFila FimFila FimFila IniFila
if (FimFila == MAX_FILA){
cout << "ERRO: Fila cheia.";
return false;
}
else {
Fila[FimFila].CodAluno = CodAluno;
strcpy(Fila[FimFila].Nome, Nome);
Fila[FimFila].Turma = Turma;
FimFila++;
}
return true;
}
captulo 3 95
Abaixo segue um exemplo de chamada da funo.
return true;
}
96 captulo 3
3.12.4 Desenfileirar um elemento
A fila circular considera um vetor de forma que sua posio final se liga posi-
o inicial (figura 3.16). Apesar de tratar a organizao fsica dos dados diferen-
te da fila simples, a fila circular ainda uma fila. Ou seja, o primeiro elemento
captulo 3 97
a entrar o primeiro a sair da fila.
Fim Incio 7 15
Incio
10 3
3 9 10 7 15
Fim
9
98 captulo 3
no ser mostrado na funo Exibir(...) mesmo estando fisicamente no vetor.
Por fim Ret recebe o valor de retorno, da funo chamada, indicando se houve
ou no sucesso na operao realizada.
#include <iostream>
#include "conio.h"
using namespace std;
struct DADOS_ALUNO{
int CodAluno;
char Nome[100];
int Turma;
bool Removido; // Indica se o elemento foi removido
};
void main(){
DADOS_ALUNO FilaAlunos[MAX_FILA]; // Fila
int IniFila = 0; // Inicio da fila
int TotalFila = 0; // Totla de elementos da fila
int FimFila = 0; // Fim da fila
bool Ret; // Recebe o retorno da funo chamada
system("pause>null");
}
captulo 3 99
bool Enfileirar(DADOS_ALUNO Fila[], int CodAluno, char Nome[], int
Turma, int &FimFila, int &TotalFila) {
if (TotalFila == MAX_FILA){
cout << "ERRO: Fila cheia.";
return false;
}
else {
Fila[FimFila].CodAluno = CodAluno;
strcpy(Fila[FimFila].Nome, Nome);
Fila[FimFila].Turma = Turma;
Fila[FimFila].Removido = false;
FimFila++;
100 captulo 3
3.14.3 Exibir
if (TotalFila == 0){
cout << "ERRO: Pilha vazia.";
return false;
}
captulo 3 101
Abaixo segue um exemplo de chamada da funo.
if (TotalFila == 0){
cout << "ERRO: Fila vazia.";
return false;
}
TotalFila--;
return true;
}
102 captulo 3
Abaixo segue um exemplo de chamada da funo.
ATIVIDADES
01. O que so e para que servem as listas lineares sequencias?
REFLEXO
Neste captulo estudamos as listas lineares sequenciais. Abordamos as suas caractersticas,
implementamos e analisamos suas principais operaes. Da mesma forma, desenvolvemos
as principais rotinas relacionadas as operaes com fila e pilha.
Todos estes conhecimentos, certamente sero imprescindveis para sua vida profissional.
LEITURA
Para voc avanar mais o seu nvel de aprendizagem envolvendo os conceitos de listas linea-
res sequenciais e demais assuntos deste captulo, consulte a sugesto de link abaixo:
CELES, W.; RANGEL, J. L. Apostila de Estruturas de dados. Disponvel em: http://www
-usr.inf.ufsm.br/~juvizzotto/elc1067-2013b/estrut-dados-pucrio.pdf. Acesso em: Jan: 2015.
REFERNCIAS BIBLIOGRFICAS
AGUILAR, L. J. Fundamentos de Programao: Algoritmos, Estruturas de Dados e Objetos. 3
ed. So Paulo: McGraw-Hill, 2008.
CELES, W.; RANGEL, J. L. Apostila de Estruturas de dados. Disponvel em: http://www-usr.inf.
ufsm.br/~juvizzotto/elc1067-2013b/estrut-dados-pucrio.pdf. Acesso em: Jan: 2015.
captulo 3 103
DEITEL, H. M., & DEITEL, P. J. C++ Como Programar. 3 ed. Porto Alegre: Bookman, 2001.
SZWARCFITER, J. L.; MARKENZON, L. Estruturas de Dados e seus Algoritmos. 2 ed. Rio de
Janeiro: LTC, 1994.
TANENBAUM, A. M., LANGSAM, Y.; AUGENSTEIN, M. J. Estruturas de Dados Usando C. So
Paulo: Makron Books, 1995.
VELOSO, P. E. Estruturas de Dados. 4 ed. Rio de Janeiro: Campus, 1986.
VILLAS, M. E. Estruturas de Dados: conceitos e tcnicas de implementao. Rio de Janeiro:
Campus, 1993.
104 captulo 3
4
Ponteiros e
Alocao Dinmica
Um dos principais aspectos, que do um poder a mais a linguagem C++ a
possibilidade de utilizao de ponteiros e a alocao dinmica de mem-
ria. Os ponteiros permitem um acesso direto a objetos e cdigos na mem-
ria. Com a alocao dinmica possvel manusear de forma mais eficiente
grandes quantidades de dados. Dessa forma, ponteiros e alocao dinmica
permitem a criao e manipulao de estruturas de dados complexas que ne-
cessitam conter referncias umas para outras, tais como, listas encadeadas,
rvores binrias , etc.
Assim, estudaremos como a linguagem C++ permite a criao e como so as
vrias formas de utilizao de ponteiros. Veremos tambm como possvel alo-
car memria para armazenar nossas estruturas de dados, e quais so os pontos
importantes desta forma de alocao.
OBJETIVOS
Estudar os principais aspectos envolvidos na utilizao de ponteiros.
Entender como feita a alocao e desalocao de memria em C++.
Compreender os diversos tipos de operadores envolvidos com ponteiros.
106 captulo 4
4.1 Definio de ponteiro
Os endereos de memria podem ser armazenados e manipulados em lingua-
gem C++ atravs de ponteiros. Quando declaramos uma varivel e o programa
executado, o espao necessrio para o tipo da varivel alocado (reservado)
na memria pelo sistema operacional como tambm recebe um nome, que o
nome da varivel. Podemos guardar este endereo de memria em um ponteiro
para que possa ser acessado diretamente.
Varias so as razes para o uso de ponteiros. Mizrahi (2006) cita as seguintes:
Segundo Mizrahi (2006), os ponteiros podem ser visto como um modo simblico de
representar um endereo de memria. Ou seja, o objetivo de um ponteiro guarda um
endereo de memria.
captulo 4 107
O programa abaixo possui duas sees. Na primeira, as variveis so decla-
radas e na segunda recebem valores.
#include <iostream>
using namespace std;
void main(){
A figura 4.1 ilustra a primeira seo. A varivel, por exemplo, Tipo foi criada
e colocada na posio de memria de endereo 12. Idade foi colocada no ende-
reo 16 e Preo no 20 (figura 4.1).
Valor
108 captulo 4
Em seguida, as variveis receberam valores (figura 4.2).
Valor M 30 145.50
Valor de Idade: 30
Endereo de Idade: 001CF748
A declarao de ponteiro pode ser feita da mesma forma que a de uma varivel:
definimos o tipo e o nome da varivel precedida do caractere *. O nome do pon-
teiro segue as mesmas regras utilizadas para nomes de variveis.
int *ptr;
captulo 4 109
A declarao permite que o ponteiro ptr armazene qualquer endereo de
memria referente a um valor inteiro. Para utilizar o ponteiro utilizamos dois
operadores unrios: & e *.
O operador de endereo &, indica o endereo de, permite atribuir ao pon-
teiro o endereo de uma varivel. J o operador de indireo *, indica contedo
de, permite acessar o contedo de um endereo armazenado em um ponteiro.
Para exemplificar, efetuaremos um simples programa.
#include <iostream>
using namespace std;
void main(){
int Idade; // Varivel inteiro
int *ptr; // Varivel ponteiro para um inteiro
Idade = 25;
ptr = &Idade; // Recebe o endereo de Idade
*ptr = 30;
cout << "Idade: " << Idade << endl << endl;
cout << "Endereo de ptr: " << ptr << endl;
cout << "Valor de ptr: " << *ptr << endl;
Idade: 30
110 captulo 4
int Idade; // Varivel inteiro
int *ptr; // Varivel ponteiro para um inteiro
Valor
Idade = 25;
ptr = &Idade; // Recebe o endereo de Idade
Valor 25 1008
Como o ponteiro ptr aponta para a varivel Idade, e seu valor for alterado,
a varivel Idade receber indiretamente esta alterao. O caractere *, antes do
ponteiro, indica que o ponteiro ira receber um valor e no um endereo. O valor
recebido, 30, ser colocado no endereo apontado pelo ponteiro, neste caso
o endereo 1008, que o mesmo da varivel Idade. Concluindo, uma varivel
acessa diretamente um valor enquanto o ponteiro acessa indiretamente um va-
lor. A referncia de um valor, atravs de um ponteiro denominado indireo.
*ptr = 30;
Valor 30 1008
captulo 4 111
Da mesma forma que uma varivel pode atribuir seu valor para outra vari-
vel, um ponteiro pode atribuir seu endereo para outro ponteiro.
#include <iostream>
using namespace std;
void main(){
system("chcp 1252 > nul");
Idade = 25;
ptrA = &Idade; // Aponta ptrA para Idade
cout << "Idade: " << Idade << endl << endl;
Idade: 25
112 captulo 4
Primeiramente o ponteiro ptrA recebe o endereo de Idade. Em seguida, atri-
bui seu endereo a ptrB. Isto faz com que tanto ptrA, como ptrB apontem para o
mesmo endereo de memria, neste caso, o endereo da varivel Idade. Isto in-
dica que a varivel Idade pode ser alterada indiretamente, tanto por ptrA, como
ptrB.
#include <iostream>
using namespace std;
void main(){
system("chcp 1252 > nul");
AlturaAlunoA = 1.70;
ptrAltura = &AlturaAlunoA; // Recebe o endereo de AlturaAlunoA
AlturaAlunoB = *ptrAltura;
captulo 4 113
system("pause > null");
}
#include <iostream>
using namespace std;
void main(){
int Idade; // Varivel inteiro
int *ptr; // Varivel ponteiro para um inteiro
Idade = 25;
ptr = &Idade; // INICIALIZAO DO PONTEIRO
*ptr = 30;
system("pause > null");
}
CONEXO
Aprofunde seus conhecimentos sobre ponteiros em: http://www.tiexpert.net/
programacao/c/ponteiros.php.
114 captulo 4
#include <iostream>
using namespace std;
void main(){
int Idade; // Varivel inteiro
int *ptr; // Varivel ponteiro para um inteiro
Idade = 25;
#include <iostream>
using namespace std;
captulo 4 115
void main(){
int Nota;
int *ptrNota;
ptrNota++;
cout << "Endereo 2: " << ptrNota << endl;
ptrNota++;
cout << "Endereo 3: " << ptrNota << endl;
Endereo 1: 0039FD60
Endereo 2: 0039FD64
Endereo 3: 0039FD68
Como o ponteiro foi criado do tipo int, e o tipo int ocupa 4 bytes da mem-
ria, a cada incremento, o ponteiro avanou 4 bytes. O incremento semelhante
a soma de uma posio ao endereo de memria. As duas operaes abaixo fa-
zem a mesma coisa.
ptrNota++;
ptrNota = ptrNota + 1;
116 captulo 4
#include <iostream>
using namespace std;
void main(){
int Nota;
int *ptrNota;
Endereo 1: 0018FAC4
Endereo 2: 0018FAD8
Matrizes e vetores permitem armazenar uma coleo de variveis do mesmo tipo. En-
quanto a matriz possui vrias dimenses, o vetor possui apenas uma dimenso.
captulo 4 117
A linguagem C++ permite que qualquer operao que possa ser feita com
ndices de uma matriz ou vetor, possa tambm ser feita da mesma forma com
vetores. Inicialmente, faremos um exemplo criando um vetor para receber as
notas bimestrais de um aluno. Em seguida, utilizando o operador de endereo
&, apontamos o ponteiro para o endereo da nota do terceiro bimestre do aluno.
#include <iostream>
using namespace std;
void main(){
float Nota[3];
float *ptrPrimBimestre;
Nota[0] = 7.8;
Nota[1] = 9.0;
Nota[2] = 7.0;
Nota[3] = 9.5;
Para que seja possvel o ponteiro acessar todos os elementos do vetor, o pro-
grama precisa ser alterado da seguinte forma:
#include <iostream>
using namespace std;
void main(){
float Nota[3];
float *ptrNota;
118 captulo 4
Nota[0] = 7.8;
Nota[1] = 9.0;
Nota[2] = 7.0;
Nota[3] = 9.5;
ptrNota = Nota;
ptrNota = &Nota[0];
captulo 4 119
Dessa forma a operao, NotaB = NotaA, do cdigo abaixo, no vlida.
#include <iostream>
using namespace std;
void main(){
float NotaA[2], NotaB[2];
NotaA[0] = 7.8;
NotaA[1] = 9.0;
#include <iostream>
using namespace std;
void main(){
system("chcp 1252 > nul");
float Nota[3];
float *ptrNota;
Nota[0] = 7.8;
Nota[1] = 9.0;
Nota[2] = 7.0;
Nota[3] = 9.5;
120 captulo 4
cout << "Utilizando notao de vetor " << endl;
cout << "Nota 1 bimestre: " << ptrNota[0] << endl;
cout << "Nota 2 bimestre: " << ptrNota[1] << endl;
cout << "Nota 3 bimestre: " << ptrNota[2] << endl;
cout << "Nota 4 bimestre: " << ptrNota[3] << endl << endl;
captulo 4 121
ptrNota[3]
*(ptrNota + 3)
Uma funo pode ter ponteiros em seus parmetros. Para passar uma varivel
para um ponteiro, que parmetro de uma funo, esta varivel deve ser pre-
cedida pelo operador de endereo &. O exemplo a seguir, reajusta o valor de um
produto de acordo com a taxa especificada. O clculo feito passando o en-
dereo da varivel PrecoProduto para o ponteiro *Preco. Consequentemente,
qualquer alterao feita em *Preco refletir no valor de PrecoProduto.
#include <iostream>
using namespace std;
void main(){
float PrecoProduto;
PrecoProduto = 500.00;
AjustarPreco(&PrecoProduto, 20);
122 captulo 4
void AjustarPreco(float *Preco, float Taxa){
float ValorReajuste;
#include <iostream>
using namespace std;
void main(){
int Ind;
GerarValores(PagtoMes, 150.80);
captulo 4 123
void GerarValores(float *PagtoM, float VlrPagto){
int Ind;
Para passar matrizes para uma funo, alguns detalhes devem ser observa-
dos. O programa a seguir tem como objetivo guardar informaes sobre cursos.
Para isso foi criado uma matriz com os dados do nmero da turma, quantida-
de de alunos e quantidade de disciplina. A matriz passada para o ponteiro
*TurmaAD, parmetro da funo Imprimir(...).
#include <iostream>
using namespace std;
void main(){
// Armazena: Turma, Qtde Aluno, Qtde Disciplinas
int TurmaALunoDisc[3][3];
124 captulo 4
Imprimir(&TurmaALunoDisc[0][0]);
Imprimir(&TurmaALunoDisc[0][0]);
captulo 4 125
4.2.5 Operador seta
O operar seta, ->, utilizado quando o ponteiro est acessando uma estrutu-
ra. Esta notao diferente do acesso de uma estrutura por uma varivel, que
neste caso utiliza o operador ponto. O operar seta, ->, permite que o ponteiro
acesse os elementos de uma estrutura.
#include <iostream>
using namespace std;
struct DADOS_ALUNO{
int CodAluno;
char Nome[100];
int Turma;
};
void main(){
DADOS_ALUNO AlunoA ;
DADOS_ALUNO *ptrAluno;
ptrAluno = &AlunoA;
126 captulo 4
O operar seta, ->, permite acessar um membro da estrutura para obter
ou atribuir um valor. A atribuio de um valor ao membro da estrutura feita
como no exemplo a seguir.
ptrAluno->CodAluno = 150;
#include <iostream>
using namespace std;
struct DADOS_ALUNO{
int CodAluno;
char Nome[100];
int Turma;
};
void main(){
DADOS_ALUNO AlunoA ;
Imprimir(&AlunoA);
captulo 4 127
void Imprimir(DADOS_ALUNO *ptrAluno){
cout << "Cdigo do Aluno: " << ptrAluno->CodAluno <<endl;
cout << "Nome: " << ptrAluno->Nome <<endl;
cout << "Turma: " << ptrAluno->Turma <<endl;
}
CONEXO
Entenda um pouco mais sobre alocao e desalocao de memria em: http://www.pontov.
com.br/site/cpp/46-conceitos-basicos/57-matrizes-dinamicas.
#include <iostream>
using namespace std;
void main(){
// Aloca memria
128 captulo 4
int *ptrNroAlunos = new int;
*ptrNroAlunos = 150;
//Desaloca memria
delete ptrNroAlunos;
#include <iostream>
using namespace std;
struct DADOS_ALUNO{
int CodAluno;
char Nome[100];
int Turma;
};
void main(){
int Ind;
// Aloca memria
DADOS_ALUNO *prtAluno = new DADOS_ALUNO[3];
prtAluno[0].CodAluno = 10;
strcpy(prtAluno[0].Nome, "Maria");
prtAluno[0].Turma = 320;
prtAluno[1].CodAluno = 20;
strcpy(prtAluno[1].Nome, "Jos");
prtAluno[1].Turma = 320;
captulo 4 129
prtAluno[2].CodAluno = 30;
strcpy(prtAluno[2].Nome, "Joo");
prtAluno[2].Turma = 320;
//Desaloca memria
delete []prtAluno;
Uma vez o espao alocado, o ponteiro utiliza a notao vetor para acessar os
elementos da matriz.
prtAluno[0].CodAluno = 10;
strcpy(prtAluno[0].Nome, "Maria");
prtAluno[0].Turma = 320;
130 captulo 4
ATIVIDADES
01. Analise o cdigo abaixo e indique qual o valor final da varivel x?
int main() {
int x, y, *z;
x=10;
y = 20;
z = &x;
x++;
*z = x + y;
(*z)++;
cout << x << endl;
}
a) 30
b) 32
c) 10
d) 11
e) 31
02. Ao enviar o endereo de uma varivel como parmetro de entrada de uma funo, este
endereo deve ser recebido por meio de:
a) passagem de valor.
b) passagem de inferncia.
c) inferncia.
d) ponteiro.
e) registro.
03. De acordo com o material, quais so os comandos para alocar e desalocar dinamica-
mente memria na linguagem C++?
a) aloc e maloc.
b) insert e delete.
c) insert e remove.
d) new e delete.
e) new e remove.
captulo 4 131
REFLEXO
Neste captulo estudamos o que so e para que serve os ponteiros. Para melhor entender os
ponteiros iniciamos vendo os seus operadores de endereo, de indireo e operador seta.
Em seguida, abordamos a aritmtica de ponteiros e criamos programas para demostrar seu
funcionamento. Aprendemos como utilizar ponteiros com vetores e matrizes. Por fim, vimos
os mecanismos presentes na linguagem C++ para alocao e desalocao de memria.
LEITURA
Para voc avanar mais o seu nvel de aprendizagem envolvendo os conceitos de sistemas
operacionais e demais assuntos deste captulo, consulte as sugestes de links abaixo:
Captulo 11 do livro: MIZRAHI, V. V. Treinamento em Linguagem C++: Mdulo 2. 2 ed.
So Paulo, Editora Prentice-Hall, 2006.
REFERNCIAS BIBLIOGRFICAS
DEITEL, H. M., & DEITEL, P. J. C++ Como Programar. 3 ed. Porto Alegre: Bookman, 2001.
MIZRAHI, V. V. Treinamento em Linguagem C++: Mdulos 1 e 2. 2 ed. So Paulo: Prentice Hall,
2006.
SCHILDT, H. C Completo e Total. 3 ed. So Paulo: Makron Books Editora Ltda, 1996.
TANENBAUM, A. M., LANGSAM, Y.; AUGENSTEIN, M. J. Estruturas de Dados Usando C. So
Paulo: Makron Books, 1995.
132 captulo 4
5
Listas Lineares
Encadeadas
Estudamos no captulo trs a implementao de estruturas utilizando vetores
e matrizes. Esta abordagem traz algumas limitaes, a principal conhecer
com antecedncia a quantidade de elementos da estrutura. Outro fator, que
vetores so recomendados para estruturas com poucos elementos e, a cada
dia que passa, os programas tm como requisitos, manusear uma quantidade
maior de dados.
A soluo destes problemas est na implementao de estruturas de dados
utilizando ponteiros e alocao dinmica. Assim possvel utilizar melhor e de
forma mais eficiente a memria do computador para comportar a necessidade
crescente de armazenamento dos dados.
OBJETIVOS
Implementar as estruturas de dados utilizando ponteiros e alocao de memria;
Entender as principais formas de acesso s estruturas de dados;
Compreender os diversos modos de implementao de estruturas dinmicas.
134 captulo 5
5.1 Listas lineares Simplesmente
Encadeadas
Ponteiro
Dados link
captulo 5 135
N cabea N Ponteiro
Cliente
Cd. Cliente Nome Endereo Fone RG
Cliente
Cd. Cliente Nome Endereo Fone RG
Cliente
Cd. Cliente Nome Endereo Fone RG
Dados
Novo n
Dados
N a ser removido
N anterior N posterior
136 captulo 5
5.2 Operaes com listas lineares
simplesmente encadeadas
#include <iostream>
#include "conio.h"
struct DADOS_ALUNO{
int CodAluno;
char Nome[100];
int Turma;
void main(){
int Ind;
struct DADOS_ALUNO *ptrCabeca;
struct DADOS_ALUNO *ptrPrimeiraNo, *ptrSegundoNo;
struct DADOS_ALUNO *ptrAux;
captulo 5 137
strcpy(ptrPrimeiraNo->Nome, "Jos");
ptrPrimeiraNo->Turma = 250;
ptrPrimeiraNo->ptrLink = NULL;
ptrAux = ptrCabeca->ptrLink;
Ind = 1;
while(ptrAux != NULL){
cout << "N: " << Ind << endl;
cout << "Cdigo do Aluno: " << ptrAux->CodAluno << endl;
cout << "Nome: " << ptrAux->Nome << endl;
cout << "Turma: " << ptrAux->Turma << endl;
cout << endl << endl;
Ind++;
ptrAux = ptrAux->ptrLink;
}
// Libera o espao de memria
delete ptrCabeca;
delete ptrPrimeiraNo;
delete ptrSegundoNo;
system("pause>null");
}
138 captulo 5
A sada do programa ser:
N: 1
Cdigo do Aluno: 10
Nome: Jos
Turma: 250
N: 2
Cdigo do Aluno: 20
Nome: Maria
Turma: 250
struct DADOS_ALUNO{
Ponteiro
int CodAluno;
char Nome[100];
int Turma; Dados link
captulo 5 139
// Aloca memria para a estrutura N Cabea
ptrCabeca = new DADOS_ALUNO;
// Aponta para um endereo vazio Dados
ptrCabeca->ptrLink = NULL;
N Cabea Primeiro N
// Liga o primeiro n ao n cabea
ptrCabeca->ptrLink = ptrPrimeiraNo; Dados
140 captulo 5
O segundo n, basicamente segue os mesmos passos descritos anteriormente
para o primeiro n. A diferena est que sua colocao na lista. Como vimos, o
n criado ligado ao ltimo n da lista. Neste caso ser o primeiro n.
Uma vez a lista criada, imprimimos os seus elementos. Isto feito utilizan-
do um ponteiro auxiliar *ptrAux. O ponteiro *ptrAux aponta incialmente para
o mesmo endereo do n cabea, ptrAux = ptrCabeca->ptrLink. Como o pontei-
ro ptrCabeca->ptrLink est apontando para o primeiro n, tambm o ponteiro
ptrAux apontar para o primeiro n. O loop while, ento exibe os dados do
primeiro n. Em seguida, dentro do loop, ptrAux recebe o endereo de onde o
seu ponteiro ptrLink est apontando, ptrAux = ptrAux->ptrLink. Como ptrAux
est apontando para o primeiro n, ptrAux->ptrLink estar apontando para o
segundo n. Isto faz com que ptrAux passe a apontar para o segundo n. Na
terceira iterao, ptrAux estar apontando para NULL o que indica que chegou
no fim da lista, parando ento a impresso.
ptrAux = ptrCabeca->ptrLink;
Ind = 1;
N Cabea Primeiro N Segundo N
while(ptrAux != NULL){
cout <<"N: " << Ind << endl; Dados Dados
cout <<"Cdigo do Aluno: "<< N Aux
captulo 5 141
Como nosso programa no efetuar mais nenhuma operao, os espaos de
memria so desalocados atravs do comando delete.
CONEXO
Leia mais sobre listas encadeadas em: http://www.ic.unicamp.br/~ra069320/PED/
MC102/1s2008/Apostilas/Cap10.pdf.
DADOS_ALUNO* CriarLista(){
DADOS_ALUNO *ptrCab;
return ptrCab;
}
// Cria a lista
ptrCabeca = CriarLista();
142 captulo 5
5.2.2 Verificar lista vazia
DADOS_ALUNO *ptrNovo;
DADOS_ALUNO *ptrAux;
int Pos;
//-----------------------------------------------------------
// Cria o novo n e atribui os dados s variveis membros
//-----------------------------------------------------------
ptrNovo = new DADOS_ALUNO;
if (ptrNovo == NULL){
cout << "Memria insulficiente!";
return false;
}
captulo 5 143
ptrNovo->CodAluno = CodAluno;
strcpy(ptrNovo->Nome, Nome);
ptrNovo->Turma = Turma;
ptrNovo->ptrLink = NULL;
//-----------------------------------------------------------
// Se a lista estiver vazia, insere no incio da lista
//-----------------------------------------------------------
if( VerificarListaVazia(ptrCab) ){
//-----------------------------------------------------------
// Se no foi informada a posio, ento insere no fim da lista
//-----------------------------------------------------------
if (PosInserir == 0)
{
// Localiza o ltimo n
ptrAux = ptrCab->ptrLink;
while(ptrAux->ptrLink != NULL)
ptrAux = ptrAux->ptrLink;
ptrAux->ptrLink = ptrNovo;
return true;
}
//-----------------------------------------------------------
// Insere na posio informada
//-----------------------------------------------------------
ptrAux = ptrCab;
Pos = 1;
144 captulo 5
// Localiza a posio a ser inserida
while((Pos < PosInserir) && (ptrAux != NULL)){
ptrAux = ptrAux->ptrLink;
Pos++;
}
if(ptrAux == NULL){
cout << "Posio no encontrada!";
return false;
}
ptrNovo->ptrLink = ptrAux->ptrLink;
ptrAux->ptrLink = ptrNovo;
return true;
}
5.2.4 Localizar um n
//-----------------------------------------------------------
// Se a lista estiver vazia
//-----------------------------------------------------------
if( VerificarListaVazia(ptrCab) ){
cout << "Lista vazia!";
return false;
}
captulo 5 145
ptrAux = ptrCab;
Posicao = 0;
// Localiza o n
while(ptrAux != NULL){
if(ptrAux->CodAluno == CodAluno)
break;
Posicao++;
ptrAux = ptrAux->ptrLink;
}
if(ptrAux == NULL){
cout << "Cdigo do aluno no encontrado!";
return -1;
}
return Posicao;
}
//-----------------------------------------------------------
// Se a lista estiver vazia
//-----------------------------------------------------------
if( VerificarListaVazia(ptrCab) ){
cout << "Lista vazia!";
return false;
}
146 captulo 5
Pos = 0;
ptrAux = ptrCab->ptrLink;
// Conta os ns
while(ptrAux != NULL){
Pos++;
ptrAux = ptrAux->ptrLink;
}
return Pos;
}
ptrAux = ptrCab->ptrLink;
Ind = 1;
while(ptrAux != NULL){
cout << "N: " << Ind << endl;
cout << "Cdigo do Aluno: " << ptrAux->CodAluno << endl;
cout << "Nome: " << ptrAux->Nome << endl;
cout << "Turma: " << ptrAux->Turma << endl;
cout << endl << endl;
Ind++;
ptrAux = ptrAux->ptrLink;
}
}
captulo 5 147
5.2.7 Remover n
//-----------------------------------------------------------
// Se a lista estiver vazia
//-----------------------------------------------------------
if( VerificarListaVazia(ptrCab) ){
cout << "Lista vazia!";
return false;
}
if(PosRemover < 1){
cout << "Cdigo do aluno no encontrado!";
return false;
}
ptrAux = ptrCab;
ptrAnterior = ptrCab;
Pos = 0;
148 captulo 5
5.3 Operaes com lista linear simplesmente
encadeada, realizando aplicaes
captulo 5 149
Topo da
Dados
Pilha
...
Dados
Dados
Base da
N Cabea
Pilha
DADOS_ALUNO* CriarPilha(){
DADOS_ALUNO *ptrCab;
return ptrCab;
}
150 captulo 5
5.5.2 Verificar pilha vazia
DADOS_ALUNO *ptrNovo;
DADOS_ALUNO *ptrAux;
int Pos;
//-----------------------------------------------------------
// Cria o novo n
//-----------------------------------------------------------
ptrNovo = new DADOS_ALUNO;
if (ptrNovo == NULL){
cout << "Memria insulficiente!";
return false;
}
ptrNovo->CodAluno = CodAluno;
strcpy(ptrNovo->Nome, Nome);
ptrNovo->Turma = Turma;
ptrNovo->ptrLink = NULL;
captulo 5 151
//----------------------------------------------------------
// Insere no topo da pilha
//-----------------------------------------------------------
ptrAux = ptrCab;
while(ptrAux->ptrLink != NULL)
ptrAux = ptrAux->ptrLink;
ptrAux->ptrLink = ptrNovo;
return true;
}
ptrAux = ptrCab->ptrLink;
152 captulo 5
5.5.5 Exibir toda a pilha (Pop)
ptrAux = ptrCab->ptrLink;
Ind = 1;
while(ptrAux != NULL){
cout << "N: " << Ind << endl;
cout << "Cdigo do Aluno: " << ptrAux->CodAluno << endl;
cout << "Nome: " << ptrAux->Nome << endl;
cout << "Turma: " << ptrAux->Turma << endl;
cout << endl << endl;
ptrAux = ptrAux->ptrLink;
Ind++;
}
}
5.5.6 Desempilhar
//-----------------------------------------------------------
// Se a pilha estiver vazia
//-----------------------------------------------------------
captulo 5 153
if( VerificarPilhaVazia(ptrCab) ){
cout << "Pilha vazia!";
return false;
}
ptrAux = ptrCab;
ptrAnterior = ptrCab;
ptrAnterior->ptrLink = NULL;
delete ptrAux;
}
Desenfileira Enfileira
154 captulo 5
5.7 Operaes com fila dinmica.
A seguir sero exibidas as operaes bsicas com filas.
DADOS_ALUNO* CriarFila(){
DADOS_ALUNO *ptrCab;
return ptrCab;
}
5.7.3 Enfileirar
captulo 5 155
DADOS_ALUNO *ptrNovo;
DADOS_ALUNO *ptrAux;
int Pos;
//-----------------------------------------------------------
// Cria o novo n
//-----------------------------------------------------------
ptrNovo = new DADOS_ALUNO;
if (ptrNovo == NULL){
cout << "Memria insulficiente!";
return false;
}
ptrNovo->CodAluno = CodAluno;
strcpy(ptrNovo->Nome, Nome);
ptrNovo->Turma = Turma;
ptrNovo->ptrLink = NULL;
//----------------------------------------------------------
// Insere no fim da fila
//----------------------------------------------------------
ptrAux = ptrCab;
while(ptrAux->ptrLink != NULL)
ptrAux = ptrAux->ptrLink;
ptrAux->ptrLink = ptrNovo;
return true;
}
156 captulo 5
void ExibirPrimeiro(DADOS_ALUNO *ptrCab){
DADOS_ALUNO *ptrAux;
ptrAux = ptrCab->ptrLink;
5.7.5 Desenfileirar
captulo 5 157
5.7.6 Aplicaes com Fila
As listas circulares diferem das listas encadeadas simples com relao ao seu
ltimo n. Enquanto uma lista encadeada simples tem o seu ltimo n apon-
tando para um endereo vazio, NULL, uma lista circular aponta para o primei-
ro. Isto permite que se possa percorrer todos os ns da lista sem acessar uma
posio invlida, ou seja, o NULL. Consequentemente, tem que se adotar al-
gum mecanismo que possa identificar quando a lista foi totalmente percorrida.
Existem vrias tcnicas para este fim. Nossa abordagem ser utilizar o n cabe-
a para reconhecer o incio da fila circular.
158 captulo 5
struct DADOS_ALUNO{
int CodAluno;
char Nome[100];
int Turma;
bool NoCabeca;
struct DADOS_ALUNO *ptrLink;
};
DADOS_ALUNO* CriarLista(){
DADOS_ALUNO *ptrCab;
return ptrCab;
}
captulo 5 159
5.9.3 Inserir um novo n
DADOS_ALUNO *ptrNovo;
DADOS_ALUNO *ptrAux;
DADOS_ALUNO *ptrAnterior;
int Pos;
//-----------------------------------------------------------
// Cria o novo n
//-----------------------------------------------------------
ptrNovo = new DADOS_ALUNO;
if (ptrNovo == NULL){
cout << "Memria insulficiente!";
return false;
}
ptrNovo->CodAluno = CodAluno;
strcpy(ptrNovo->Nome, Nome);
ptrNovo->Turma = Turma;
ptrNovo->NoCabeca = false;
//-----------------------------------------------------------
// Insere no fim da lista
//-----------------------------------------------------------
ptrAnterior = ptrCab;
ptrAux = ptrCab->ptrLink;
while(ptrAux->NoCabeca != true){
ptrAnterior = ptrAux;
ptrAux = ptrAux->ptrLink;
160 captulo 5
}
ptrAnterior->ptrLink = ptrNovo;
ptrNovo->ptrLink = ptrAux;
return true;
}
ptrAux = ptrCab->ptrLink;
// Conta os ns
while(ptrAux->NoCabeca != true){
cout << "Cdigo do Aluno: " << ptrAux->CodAluno << endl;
cout << "Nome: " << ptrAux->Nome << endl;
cout << "Turma: " << ptrAux->Turma << endl;
cout << endl << endl;
ptrAux = ptrAux->ptrLink;
}
}
5.9.5 Remover n
captulo 5 161
bool Remover(DADOS_ALUNO *ptrCab, int CodAluno){
DADOS_ALUNO *ptrAux;
DADOS_ALUNO *ptrAnterior;
bool Encontrado;
//-----------------------------------------------------------
// Se a lista estiver vazia
//-----------------------------------------------------------
if( VerificarListaVazia(ptrCab) ){
cout << "Lista vazia!";
return false;
}
ptrAnterior = ptrCab;
ptrAux = ptrCab->ptrLink;
Encontrado = false;
// Percorre a lista
while(ptrAux->NoCabeca != true){
ptrAnterior = ptrAux;
ptrAux = ptrAux->ptrLink;
}
if(Encontrado == false){
cout << "Cdigo do aluno no encontrado!";
return false;
}
ptrAnterior->ptrLink = ptrAux->ptrLink;
delete ptrAux;
}
162 captulo 5
5.10 Listas Duplamente Encadeadas
Uma deficincia encontrada nas listas circulares simplesmente encadeadas
no poder percorrer os ns em ordem inversa, ou seja, do final para o incio.
A soluo para este tipo de situao so as listas duplamente encadeadas. A
estrutura de uma lista duplamente encadeada mantm dois links: um para o
prximo n e um para o n anterior. Este arranjo permite percorrer a lista em
ambas as direes.
N Cabea N
CONEXO
Leia mais sobre listas duplamente encadeadas em: http://www2.dc.ufscar.br/~bsi/
materiais/ed/u10.html
struct DADOS_ALUNO{
int CodAluno;
char Nome[100];
int Turma;
captulo 5 163
struct DADOS_ALUNO *ptrLinkProx;
struct DADOS_ALUNO *ptrLinkAnt;
};
DADOS_ALUNO* CriarLista(){
DADOS_ALUNO *ptrCab;
return ptrCab;
}
164 captulo 5
5.11.3 Inserir um n
DADOS_ALUNO *ptrNovo;
DADOS_ALUNO *ptrAux;
DADOS_ALUNO *ptrAnterior;
int Pos;
//-----------------------------------------------------------
//Cria o novo n
//-----------------------------------------------------------
ptrNovo = new DADOS_ALUNO;
if (ptrNovo == NULL){
cout << "Memria insulficiente!";
return false;
}
ptrNovo->CodAluno = CodAluno;
strcpy(ptrNovo->Nome, Nome);
ptrNovo->Turma = Turma;
ptrNovo->ptrLinkProx = NULL;
ptrNovo->ptrLinkAnt = NULL;
captulo 5 165
//-----------------------------------------------------------
// Se a lista estiver vazia, insere no incio da lista
//-----------------------------------------------------------
if( VerificarListaVazia(ptrCab) ){
return true;
}
//-----------------------------------------------------------
// Se no foi informada a posio, ento insere no fim da lista
//-----------------------------------------------------------
if (PosInserir == 0)
{
// Localiza o ltimo n
ptrAux = ptrCab->ptrLinkProx;
while(ptrAux->ptrLinkProx != NULL)
ptrAux = ptrAux->ptrLinkProx;
ptrAux->ptrLinkProx = ptrNovo;
ptrNovo->ptrLinkAnt = ptrAux;
return true;
}
//-----------------------------------------------------------
// Insere na posio informada
//-----------------------------------------------------------
ptrAux = ptrCab;
ptrAnterior = ptrCab;
Pos = 0;
166 captulo 5
// Localiza a posio a ser inserida
while((Pos < PosInserir) && (ptrAux != NULL)){
ptrAnterior = ptrAux;
ptrAux = ptrAux->ptrLinkProx;
Pos++;
}
if(ptrAux == NULL){
cout << "Posio no encontrada!";
return false;
}
ptrNovo->ptrLinkProx = ptrAux;
ptrNovo->ptrLinkAnt = ptrAnterior;
ptrAnterior->ptrLinkProx = ptrNovo;
ptrAux->ptrLinkAnt = ptrNovo;
return true;
}
5.11.4 Localizar um n
//-----------------------------------------------------------
// Se a lista estiver vazia
//-----------------------------------------------------------
if( VerificarListaVazia(ptrCab) ){
cout << "Lista vazia!";
return false;
}
captulo 5 167
ptrAux = ptrCab;
Posicao = 0;
// Localiza o n
while(ptrAux != NULL){
if(ptrAux->CodAluno == CodAluno)
break;
Posicao++;
ptrAux = ptrAux->ptrLinkProx;
}
if(ptrAux == NULL){
cout << "Cdigo do aluno no encontrado!";
return -1;
}
return Posicao;
}
ptrAux = ptrCab->ptrLinkProx;
Ind = 1;
while(ptrAux != NULL){
cout << "N: " << Ind << endl;
cout << "Cdigo do Aluno: " << ptrAux->CodAluno << endl;
cout << "Nome: " << ptrAux->Nome << endl;
168 captulo 5
cout << "Turma: " << ptrAux->Turma << endl;
cout << endl << endl;
Ind++;
ptrAux = ptrAux->ptrLinkProx;
}
}
5.11.6 Remover n
//-----------------------------------------------------------
// Se a lista estiver vazia
//-----------------------------------------------------------
if( VerificarListaVazia(ptrCab) ){
cout << "Lista vazia!";
return false;
}
ptrAux = ptrCab;
ptrAnterior = ptrCab;
Pos = 0;
captulo 5 169
// Localiza a posio a ser inserida
while((Pos < PosRemover) && (ptrAux != NULL)){
ptrAnterior = ptrAux;
ptrAux = ptrAux->ptrLinkProx;
Pos++;
}
if(ptrAux == NULL){
cout << "Cdigo do aluno no encontrado!";
return false;
}
else
{
ptrProximo = ptrAux->ptrLinkProx;
}
ptrAnterior->ptrLinkProx = ptrProximo;
if(ptrProximo != NULL)
ptrProximo->ptrLinkAnt = ptrAnterior;
delete ptrAux;
}
ATIVIDADES
01. De acordo com o material, qual a estrutura de dados que ocupa espaos aleatrios na
memria e quando o n inserido no fim desta lista, alm de armazenar seus os dados, man-
tm uma ligao com o primeiro n da lista?
a) Listas Simplesmente Encadeadas.
b) Listas Circulares Simplesmente Encadeadas.
c) Listas Duplamente Encadeadas.
d) Listas Encadeadas Inversamente.
e) Listas Circulares Encadeadas Inversamente.
170 captulo 5
02. De que forma implementada uma lista duplamente encadeada para que possa navegar
do incio para o final da lista e vice versa?
03. Levando em considerao a estrutura veculo abaixo, e que foi criada um ponteiro cha-
mado VeiculoA referente a esta estrutura, qual a forma de atribuir um valor ao ano de fabri-
cao?
struct Veiculo{
char Modelo[100];
char Marca [50];
int AnoFabricacao;
int AnoModelo;
};
a) VeiculoA->AnoFabricacao = 2015;
b) VeiculoA:AnoFabricacao = 2015;
c) VeiculoA.AnoFabricacao = 2015;
d) VeiculoA&AnoFabricacao = 2015;
e) VeiculoA::AnoFabricacao = 2015;
REFLEXO
Neste captulo estudamos listas lineares encadeadas. Iniciamos nossos estudos implementa-
do as suas operaes bsicas, para tanto utilizamos os conceitos adquiridos com ponteiros e
alocao dinmica de memria. Continuamos nossos estudos estendendo a implementao
para as formas de pilha e filas. Aprofundamos nos aspectos avanados de listas, estudando
e implementados as listas circulares simplesmente encadeadas e listas duplamente enca-
deadas
importante que, baseado nos conceitos e arquiteturas apresentadas, voc seja capaz
de identificar as vantagens e desvantagens de cada modelo de estrutura de dados. Reflita
sobre isso e identifique as diferenas entre cada uma delas.
No pare os seus estudos, mantenha-se sempre lendo e pesquisando sobre os diversos
temas relacionados as estruturas de dados. Esperamos que todos estes conhecimentos ad-
quiridos sejam um diferencial em sua vida profissional. Desejamos a voc um grande sucesso!
captulo 5 171
LEITURA
Para voc avanar mais o seu nvel de aprendizagem envolvendo os conceitos de estruturas
de dados e demais assuntos deste captulo, consulte os captulos 3 e 4 do livro:
TANENBAUM, A. M.; LANGSAM, Y.; AUGENSTEIN, M. J. Estruturas de Dados Usando C.
So Paulo: Makron Books., 1995.
REFERNCIAS BIBLIOGRFICAS
AGUILAR, L. J. Fundamentos de Programao: Algoritmos, Estruturas de Dados e Objetos. 3
ed. So Paulo: McGraw-Hill, 2008.
CELES, W.; RANGEL, J. L. Apostila de Estruturas de dados. Disponvel em: http://www-usr.inf.
ufsm.br/~juvizzotto/elc1067-2013b/estrut-dados-pucrio.pdf. Acesso em: Jan: 2015.
DEITEL, H. M., & DEITEL, P. J. C++ Como Programar. 3 ed. Porto Alegre: Bookman, 2001.
LAUDON, K. C., & LAUDON, J. P. Sistemas de Informao Gerenciais. 6 ed. So Paulo: Prentice Hall,
2007.
MIZRAHI, V. V. Treinamento em Linguagem C++: Mdulos 1 e 2. 2 ed. So Paulo: Prentice Hall,
2006.
SCHILDT, H. C Completo e Total. 3 ed. So Paulo: Makron Books Editora Ltda, 1996.
SZWARCFITER, J. L.; MARKENZON, L. Estruturas de Dados e seus Algoritmos. 2 ed. Rio de
Janeiro: LTC, 1994.
TANENBAUM, A. M., LANGSAM, Y.; AUGENSTEIN, M. J. Estruturas de Dados Usando C. So
Paulo: Makron Books, 1995.
VELOSO, P. E. Estruturas de Dados. 4 ed. Rio de Janeiro: Campus, 1986.
VILLAS, M. E. Estruturas de Dados: conceitos e tcnicas de implementao. Rio de Janeiro:
Campus, 1993.
GABARITO
Captulo1
01. A resposta correta a D. A pilha uma estrutura do tipo LIFO (Last In, First Out -
ltimo a Entrar, Primeiro a Sair).
02. A diferena entre pilha esta na forma de insero e remoo dos seus elementos. En-
172 captulo 5
quanto a pilha uma estrutura do tipo LIFO (Last In, First Out - ltimo a Entrar, Primeiro
a Sair), a fila uma estrutura do tipo FIFO (First In, First Out - Primeiro a Entrar, Primeiro
a Sair).
03. A resposta certa grafo. Os grafos so semelhantes s rvores no sentido matemtico
e so o mais indicado para problemas onde envolve trajetos ou roteamentos.
04. A resposta correta 3 3 3 3.
05.
struct Veiculo{
char Modelo[100];
char Marca [50];
int AnoFabricacao;
int AnoModelo;
};
Captulo2
01. A resposta certa a E. Ao inserir um elemento na lista, este colocado na posio certa
de acordo com a ordem pr-estabelecida. Dessa forma, a ordem da lista mantida e somente
a quantidade de elementos alterada para indicar um elemento a mais na lista.
02. A resposta certa a D. A pesquisa binria utiliza um algoritmo que efetua divises su-
cessivas da lista para encontrar o valor pesquisado.
Captulo3
01. As listas lineares sequenciais so estruturas estticas que tm como objetivo represen-
tar um conjunto de dados, que de alguma forma se relacionam, com os elementos dispostos
em sequncia.
02. As principais vantagens da lista linear sequencial so: qualquer elemento da lista pode
ser acessado direto indexado. Tempo constante para acesso a qualquer elemento da lista.
Como desvantagens, podemos citar: movimentao de todos os elementos da lista
quando h uma insero ou remoo de elemento. O tamanho mximo da lista deve
ser pr-estimado.
03. O n-cabea indica o incio da lista encadeada e nunca pode ser removido. Dados (re-
gistros) do tipo que so armazenados nos demais ns da lista, no deve ser armazenado no
n-cabea.
captulo 5 173
Captulo4
Captulo5
174 captulo 5
ANOTAES
captulo 5 175
ANOTAES
176 captulo 5