Você está na página 1de 108

Estrutura de Dados

Andrea Lilian Marques da Costa

Curso Tcnico em Informtica

*p, *q, *r; p = new int ; *p = 5; q = new int ; q = p; r = p; // ou q cout << *p; // ou *q ou *r free (q); // ou p ou r :

Estrutura de Dados
Andrea Lilian Marques da Costa

Belm - PA 2011

Presidncia da Repblica Federativa do Brasil Ministrio da Educao Secretaria de Educao a Distncia

Instituto Federal de Educao, Cincia e Tecnologia do Par Este Caderno foi elaborado em parceria entre o Instituto Federal de Educao, Cincia e Tecnologia do Par e a Universidade Federal de Santa Catarina para o Sistema Escola Tcnica Aberta do Brasil e-Tec Brasil.
Equipe de Elaborao Instituto Federal de Educao, Cincia e Tecnologia do Par IFPA Coordenao do Curso Andrea Lilian Marques da Costa /IFPA Professora-autora Andrea Lilian Marques da Costa/IFPA 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 Grco Andr Rodrigues/UFSC Design Instrucional Juliana Leonardi/UFSC Web Master Rafaela Lunardi Comarella/UFSC Web Design Beatriz Wilges/UFSC Mnica Nassar Machuca/UFSC Diagramao Andr Rodrigues/UFSC Brbara Zardo/UFSC Juliana Tonietto/UFSC Nathalia Takeuchi/UFSC Reviso Jlio Csar Ramos/UFSC Projeto Grco e-Tec/MEC

Catalogao na fonte pela ...

C837e Costa, Lilian Marques da Estrutura de dados / Andrea Lilian Marques da Costa. Belm-PA : Instituto Federal de Educao, Cincia e Tecnologia, 2011. 106p. : il. Inclui bibliograa Curso tcnico em informtica 1. Estrutura de dados Computao. 2. Informtica. I. Ttulo. II. Ttulo: Curso Tcnico em Informtica. CDU: 681.31

Apresentao e-Tec Brasil


Prezado estudante, Bem-vindo ao e-Tec Brasil! Voc faz parte de uma rede nacional pblica de ensino, a Escola Tcnica Aberta do Brasil, instituda pelo Decreto n 6.301, de 12 de dezembro 2007, com o objetivo de democratizar o acesso ao ensino tcnico pblico, na modalidade a distncia. O programa resultado de uma parceria entre o Ministrio da Educao, por meio das Secretarias de Educao a Distancia (SEED) e de Educao Prossional e Tecnolgica (SETEC), as universidades e escolas tcnicas estaduais e federais. 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, geogracamente ou economicamente, dos grandes centros. O e-Tec Brasil leva os cursos tcnicos a locais distantes das instituies de ensino e para a periferia das grandes cidades, incentivando os jovens a concluir o ensino mdio. Os cursos so ofertados pelas instituies pblicas de ensino e o atendimento ao estudante realizado em escolas-polo integrantes das redes pblicas municipais e estaduais. O Ministrio da Educao, as instituies pblicas de ensino tcnico, seus servidores tcnicos e professores acreditam que uma educao prossional qualicada integradora do ensino mdio e educao tcnica, capaz de promover o cidado com capacidades para produzir, mas tambm com autonomia diante das diferentes dimenses da realidade: cultural, social, familiar, esportiva, poltica e tica. Ns acreditamos em voc! Desejamos sucesso na sua formao prossional! Ministrio da Educao Janeiro de 2010
Nosso contato etecbrasil@mec.gov.br

e-Tec Brasil

Indicao de cones
Os cones so elementos grcos 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 denio de um termo, palavra ou expresso utilizada no texto. Mdias integradas: sempre que se desejar que os estudantes desenvolvam atividades empregando diferentes mdias: vdeos, lmes, 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

Sumrio
Palavra do professor-autor Apresentao da disciplina Projeto instrucional Aula 1 Programao modular 1.1 Introduo 1.2 Mdulo 1.3 Escopo e tempo de vida de uma varivel 1.4 Parmetros 1.5 Formas de passagem de parmetros Aula 2 Agregados homogneos: vetores 2.1 Quando devemos utilizar agregados homogneos 2.2 Declaraes de um vetor 2.3 Denio/declarao de um vetor 2.4 Operaes bsicas com vetores 2.5 Leitura de um vetor utilizando a estrutura for Aula 3 Agregados homogneos: matrizes 3.1 Quando devemos utilizar agregados homogneos 3.2 Declarao de uma matriz 3.3 Inicializao das matrizes 3.4 Principais operaes com matrizes 3.5 Passagem de matrizes para funes Aula 4 Tcnicas de pesquisa e classicao de dados 4.1 Por que um estudo sobre tcnicas de pesquisa e ordenao de dados? 4.2 Pesquisa em vetor 4.3 Classicao ou ordenao de vetores Aula 5 Lista implementada por vetores 5.1 Denio de lista 5.2 Operaes usuais com listas lineares 5.3 Representao das listas 9 11 13 15 15 16 18 20 21 27 27 28 29 30 31 37 37 38 38 39 40 43 43 43 45 53 53 54 55 7
e-Tec Brasil

Aula 6 Ponteiros 6.1 O que so ponteiros? 6.2 Declaraes em C++ 6.3 Operadores unrios 6.4 Funo Aula 7 Lista encadeada 7.1 Denio de lista encadeada 7.2 Economia de espao 7.3 Denio (recursiva) da estrutura de um n em C++ 7.4 Funo de inicializao 7.5 Criao de ns 7.6 Principais algoritmos 7.7 Perguntas frequentes Aula 8 Cadeia de caracteres 8.1 Tipo caractere (char) 8.2 Cadeias de caracteres em C++ 8.3 Controle do tamanho dinmico de uma cadeia de caracteres 8.4 Lendo cadeia de caracteres a partir do teclado 8.5 Funes predenidas que manipulam cadeias de caracteres Aula 9 Pilhas 9.1 Introduo 9.2 Pilhas implementadas por vetores (array) 9.3 Pilhas implementadas por ponteiros Aula 10 Filas 10.1 Funcionamento das las 10.2 Representao por contiguidade (array) 10.3 Representao em C++ por ponteiros 10.4 Filas circulares Referncias Currculo da professora-autora

61 61 61 61 62 67 67 70 71 72 72 73 76 81 81 82 82 83 85 93 93 93 95 99 99 99 101 102 105 106

e-Tec Brasil

Nome da disciplina

Palavra do professor-autor
Caro estudante, Bem-vindo ao curso Tcnico em Informtica, modalidade a distncia. Nesta disciplina apresentamos tcnicas importantes de programao para o futuro prossional de informtica/computao. Tenha sempre em mente que o aprendizado da boa tcnica de programao depende da abordagem didtica adotada pelo professor e, essencialmente, da dedicao do aluno. Um bom programador aquele que aprendeu as tcnicas necessrias e colocou-as em prtica por meio de muito exerccio. Programao algo que no se aprende vendo o outro fazer. Para que haja um bom aprendizado, necessrio o desenvolvimento de certas habilidades de abstrao, o que no acontece de uma hora para outra. necessrio, portanto, colocar a mo na massa: construir programas, test-los e execut-los. Quanto maior a prtica, maior o amadurecimento alcanado. Ao longo deste curso voc poder contar com um ambiente de ensino e aprendizado desenhado especialmente para a disciplina Estrutura de Dados. Os fruns e tarefas propostos so de grande importncia e voc, naturalmente, fundamental para conclu-los. Teremos aulas presenciais nas quais sero utilizados os laboratrios de informtica para a resoluo de problemas computacionais. Em seu processo avaliativo, alm da participao no ambiente moodle (fruns e tarefas) teremos avaliaes individuais presenciais nos polos, sem as quais caria difcil vericar os avanos e as decincias a serem superadas na busca pelo amadurecimento em programao. Ao nal voc poder realizar uma avaliao da disciplina, quando vamos discutir o que foi bom, o que no foi, o que faltou... Bons programas! Um abrao, Professora Andrea Lilian Marques da Costa

e-Tec Brasil

Apresentao da disciplina
Caro estudante, Estrutura de Dados uma disciplina da rea da Informtica em que tem por objetivo apresentar aos alunos os algoritmos e as estruturas de dados para o desenvolvimento de programas de computador, habilitando-os a reconhecer a estrutura adequada para seus conjuntos de dados, bem como a implement-la. A linguagem de programao utilizada ao longo do curso ser C++, mas esta disciplina tem uma importncia extralinguagem, isto , o foco da disciplina no est na linguagem utilizada nesta disciplina, mas sim no conhecimento das tcnicas para organizar a estrutura dos dados a serem manipulados. Tenha sempre em mente que o aprendizado da boa tcnica de programao depende da abordagem didtica adotada pelo professor e, essencialmente, da dedicao do aluno. Um bom programador aquele que aprendeu as tcnicas necessrias e colocou-as em prtica por meio de muito exerccio. Programao algo que no se aprende vendo o outro fazer. Para que haja um bom aprendizado, necessrio o desenvolvimento de certas habilidades de abstrao, o que no acontece de uma hora para outra. necessrio, portanto, colocar a mo na massa: construir programas, test-los e execut-los. Quanto maior a prtica, maior o amadurecimento alcanado. Bons programas! Um abrao, Professora Andrea Lilian Marques da Costa

11

e-Tec Brasil

Projeto instrucional
Disciplina: Estrutura de Dados (90 horas). Ementa: Programao modular. Agregados homogneos vetores e matrizes. Pesquisa e classicao de dados. Listas. Cadeias de caracteres. Pilhas e las.
OBJETIVOS DE APRENDIZAGEM
Utilizar, adequadamente, as tcnicas de programao modular para construo de programas de computador. Denir apropriadamente a assinatura de uma funo. Denir e resolver adequadamente uma funo que se utiliza da estrutura de dados vetores. http://www.ic.unicamp. br/~rezende/Astral.htm

AULA

MATERIAIS

CARGA HORRIA (horas)

Aula 1. Programao modular Aula 2. Agregados homogneos: vetores Aula 3. Agregados homogneos: matrizes

10

10

Denir e resolver adequadamente uma funo que se utiliza da estrutura de dados matrizes. Conhecer e aplicar as duas tcnicas que realizam pesquisa em vetores: sequencial e binrio.

10

Aula 4. Tcnica de pesquisa e classicao de dados

Distinguir qual algoritmo de pesquisa pode ser mais adequado para uma aplicao computacional. Conhecer o funcionamento bsico dos principais mtodos que realizam classicao em vetores, bem como, implement-los utilizando a linguagem C++. Identicar, para uma determinada aplicao, o tipo de representao de lista mais adequada.

http://www.ifpa.edu.br

10

Aula 5. Lista implementada por vetores

Conhecer os principais algoritmos envolvendo manipulao com listas. Desenvolver mdulos que realizem operaes com listas.

10

Aula 6. Ponteiros

Reconhecer a criao e a manipulao das variveis dinmicas.

5 continua

13

e-Tec Brasil

AULA

OBJETIVOS DE APRENDIZAGEM
Identicar, para uma determinada aplicao, o tipo de representao de lista mais adequada.

MATERIAIS

CARGA HORRIA (horas)

Aula 7. Listas encadeadas implementadas por ponteiros

Conhecer os principais algoritmos envolvendo manipulao com listas encadeada. Desenvolver mdulos que realizem operaes com listas encadeadas. Reconhecer as funes necessrias para o desenvolvimento de algoritmos envolvendo cadeias de caracteres.

http://www.ic.unicamp. br/~rezende/Astral.htm

Aula 8. Cadeia de caracteres

Identicar as principais tcnicas para a manipulao de cadeias de caracteres em C++. Desenvolver algoritmos envolvendo cadeias de caracteres. Identicar uma aplicao que pode ser mais bem representada pela estrutura pilha. http://algol.dcc.ua. br/~heitor/Projetos/ TBC_AED_GRAFOS_WEB/ TBC_AED_GRAFOS_WEB_ arquivos/estruturasEstaticas/pilha/Pilha.html

10

Aula 9. Pilhas

Conhecer os principais algoritmos envolvendo manipulao com pilhas. Desenvolver mdulos que realizem operaes com pilhas. Identicar uma aplicao que pode ser mais bem representada pela estrutura la.

10

Aula 10. Filas

Conhecer os principais algoritmos envolvendo manipulao com las. Desenvolver mdulos que realizem operaes com las.

http://www.tutorialdeestruturade dados.8m.com

10

concluso

Aula 1 Programao modular


Objetivos
Utilizar, adequadamente, as tcnicas de programao modular para construo de programas de computador. Denir apropriadamente a assinatura de uma funo (parmetros e seus tipos; tipo de retorno.

1.1 Introduo
A programao modular uma metodologia para projetar programas como um conjunto de unidades individuais inter-relacionadas denominadas de subprogramas, funes ou mdulos.

1.1.1 Vantagens da modularizao


a) Qualidade dos programas A lgica de um programa inteiro , muitas vezes, complexa demais para o programador ter uma ideia completa dele. Um mdulo que realiza uma funo simples e bem denida pode ser facilmente compreendido. A ateno do programador se concentra nos detalhes da lgica de cada parte do programa isoladamente. A soluo de um problema buscada por meio da combinao das solues de subproblemas. Como cada subproblema menor que o problema original, a sua soluo tambm mais simples. b) Flexibilidade no desenvolvimento Como o programa dividido em mdulos individuais, tem-se maior exibilidade na alocao de recursos e pessoal para o desenvolvimento. c) Padronizao e reuso Quando se escreve uma srie de programas, certas funes so necessrias em mais de um. A existncia de uma biblioteca de funes evitar grande parte da repetio e garantir padronizao.

Aula 1 Programao modular

15

e-Tec Brasil

d) Planejamento Quando se trabalha com pequenas unidades, pode-se estimar com certa preciso a quantidade de trabalho envolvido. Isso possibilita um melhor planejamento (recursos, prazos, etc.). e) Manuteno Os problemas de manuteno so reduzidos. mais fcil entender um mdulo do sistema (e alter-lo) do que tentar entender o sistema todo.

1.2 Mdulo
1.2.1 Principais caractersticas
a) So conjuntos de comandos visando a uma tarefa muito bem denida; b) Possuem um ponto de entrada e um ponto de sada; c) Um mdulo pode conter outros mdulos (decomposio sucessiva).

1.2.2 Tipos de mdulos


a) Que no retorna valor realiza uma tarefa, sem compromisso de retornar valores ao mdulo que o ativou. A execuo da funo ativada pela referncia ao seu nome. Quando for encontrada uma chamada a uma funo, o mdulo em execuo ser suspenso, e o controle ser passado funo. Aps a execuo da funo, ocorrer o retorno do processamento para o comando imediatamente aps a chamada. Na linguagem C++ uma funo que no retorna valor para o programa principal precedida pela palavra-chave void. Sintaxe da denio em C++: void <nome> (< parmetros >) { < variveis locais > comando 1; comando 2; . . comando n; }

e-Tec Brasil

16

Estrutura de Dados

b) Que retorna valor em geral recebe informaes de entrada (parmetros). Realiza algum processamento e retorna uma informao de sada. Possui um tipo associado, que o tipo de informao que a funo retorna. Sintaxe da denio em C++: <tipo do retorno> <nome da funo> (< lista de parmetros >) { < variveis locais > comando 1; comando 2; . . }

Exemplos de funes com e sem retorno de valor. // Retorno de valor #include <iostream> using namespace std; int produto(int x, int y) // Esta funo retorna valor. { return x*y; } int main() { int resp; resp = produto(10,11); //indicao de retorno de valor cout << O resultado << resp; return 0; // retorno com sucesso }

Aula 1 Programao modular

17

e-Tec Brasil

// sem retorno de valor. #include <iostream> using namespace std; void imprime_produto(int x, int y) // Essa funo no retorna valor. { cout << x * y << ; } int main() { impr_produto(10, 20); impr_produto(5, 6); impr_produto(8, 9); return 0; } Em geral, um mdulo sem retorno empregado como um comando, e com retorno como uma varivel. Veja os exemplos a seguir: // sem retorno LimparTela(); OrdenarVetor(v); Inc(x); // com retorno x = sin(y); cout << sqrt(a);

1.3 Escopo e tempo de vida de uma varivel


Escopo de uma varivel a rea do programa onde ela pode ser referenciada. Quanto ao escopo, as variveis podem ser: a) Globais So denidas numa seo prpria e podem ser referenciadas em qualquer parte do programa, exceto quando dentro de um mdulo for denida outra varivel com o mesmo nome. b) Locais S valem dentro do seu respectivo mdulo e devem ser declaradas internamente.
e-Tec Brasil

18

Estrutura de Dados

Valores contidos em variveis locais perdem-se aps a execuo do mdulo. O tempo de vida o intervalo de tempo durante o qual existe memria alocada para a varivel. O tempo de vida das variveis globais o tempo total de execuo de um programa. J o das variveis locais o perodo durante o qual esto ativos os mdulos a que elas pertencem. Exemplo: #include <iostream> using namespace std; int cont; // varivel global

void func2() { int cont; // varivel local cout << cont << endl; // imprime a varivel local } void func1() { cout << cont: << cont << endl;// acesso a varivel global cont func2(); }

int main() { int i; // varivel local for(i=0; i<10; i++) { cont = i * 2; func1(); } return 0; }

Aula 1 Programao modular

19

e-Tec Brasil

1.4 Parmetros
So variveis que recebem os valores de um argumento. Eventualmente, podem ser o veculo de entrada e sada de informaes. Os parmetros podem ser de trs tipos: a) Formal so variveis locais que se encontram na denio do mdulo. Exemplo: oat produto(oat f1, oat f2) { . . . } b) Real expresso presente na chamada do mdulo (um para cada parmetro formal). Ex.: oat r; r = produto (a+b,c); c) Argumento valor (ou varivel), produzida pelo parmetro real. No caso de passagem de parmetro por referncia, o argumento deve ser uma varivel (veremos no prximo tpico). Exemplo: void inc(int &x) { x++; } inc(x); inc(y); inc(x>y? x:y); O ltimo exemplo equivale a if (x>y) inc(x); else inc(y);

e-Tec Brasil

20

Estrutura de Dados

Os parmetros recebem os valores na mesma ordem em que so declarados. Deve haver correspondncia entre os parmetros formais e reais quanto ao nmero, tipo e posio entre eles.

1.5 Formas de passagem de parmetros


A passagem de parmetros em C++ pode ser por valor ou por referncia. Por valor, feita uma cpia dos valores das variveis utilizadas na chamada da sub-rotina para os parmetros formais da funo. Por referncia, o que enviado para a funo uma referncia s variveis utilizadas, e no uma simples cpia; dessa forma, as alteraes realizadas dentro da funo iro alterar os valores contidos nessas variveis. a) Passagem de parmetro por valor o contedo da varivel passado para o mdulo. S permite a leitura da varivel.
#include <iostream> using manespace std; void inc (int x) { } x++;

void palavra-chave usada quando uma funo no retorna valor ao mdulo que a ativou

int main {} { int a=2; inc (a); cout << a; retourn0;

a parmetro real e x parmetro formal, ambos do mesmo tipo de dado (int)


ativao da funo inc e passagem do parmetro real a

//ser exibido a tela o valor 2

Figura 1.1: Infogrco sobre passagem de parmetro


Fonte: Elaborada pela autora

O valor original do parmetro real a no foi alterado durante execuo da funo. No mecanismo de passagem de parmetro por valor, feita uma reserva de espao em memria para os parmetros formais, para que neles seja armazenada uma cpia dos parmetros reais (argumentos). b) Passagem de parmetros por referncia o endereo da varivel passado para o mdulo. Permite tanto a leitura como a alterao do contedo da varivel.

Aula 1 Programao modular

21

e-Tec Brasil

#include <iostream> using namespace std; void inc (int &x) { x++; } int main() { int a=2; inc (a); cout << a; // ser impresso o valor 3 return 0; } #include <iostream> using namespace std; void troca(int &x, int &y) { int temp; temp = x; // guarda o valor do endereo da varivel x x = y; // x recebe y y = temp; // y recebe x } int main() { int i, j; i = 10; j = 20; cout << Valor inicial de i e j: ; cout << i << << j << \n; troca(i,j); cout << Troca de valores de i e j: ; cout << i << << j << \n; return 0; }

e-Tec Brasil

22

Estrutura de Dados

Em C++, para diferenciar os dois tipos de passagem de parmetros, coloca-se o prexo & antes da denio dos parmetros formais passados por referncia. Um mesmo mdulo pode utilizar diferentes mecanismos de passagem de parmetros para parmetros distintos, veja o exemplo: void exemplo (int x, int y, oat &z, oat j) Exemplos: #include <iostream> using namespace std; oat prod (oat x, oat y) { oat result; result = x*y; return result; }

oat main() { oat a,b,c; a = 2; b = 10; c = prod(a,b); cout << c; return 0; { Como uma funo pode ser impressa, atribuda ou participar de clculos como uma varivel qualquer, isso nos permite, em vez de utilizar a varivel c, imprimir diretamente o resultado produzido pela funo da seguinte forma:

Aula 1 Programao modular

23

e-Tec Brasil

cout << prod(a,b); // teremos o mesmo resultado Observe o cdigo a seguir: #include <iostream> using namespace std; oat prod (oat x, oat &y) { return x*y; } int main() { oat a,b,c; a = 2; b = 10; cout << prod(a,b); return 0; } Aps a chamada da funo, as variveis x e y terminaram valendo 1. Mas na declarao da funo somente a varivel y recebe &. Isso implica que o valor nal de y passado de volta ao local onde foi solicitada a funo, fazendo com que b passe a tornar-se 1 ao invs do valor original 10. Isto tudo no ocorreu com a varivel a que continua valendo 2 tal como antes.

e-Tec Brasil

24

Estrutura de Dados

Resumo
Nesta aula estudamos o conceito de sub-rotinas, que tambm podem ser chamadas de mdulos ou funes. Para a construo de programas estruturados, sempre prefervel dividir as grandes tarefas de computao em tarefas menores e utilizar seus resultados parciais para compor o resultado nal desejado. Em termos funcionais existem dois tipos de mdulos, os que no retornam valor e os que retornam uma informao de sada. Quanto ao alcance das variveis ele pode ser global ou local. A comunicao entre os mdulos feita por meio dos parmetros, que podem ser do tipo formal ou real. A passagem de parmetros em C++ pode ser por valor ou por referncia.

Atividades de aprendizagem
Desenvolver mdulos em C++ que realizem as operaes a seguir: a) Que calcule o quadrado de um nmero. b) Que verique se um dado nmero par. c) Que receba dois valores e efetue as operaes bsicas (soma, subtrao, diviso e multiplicao). Deve-se utilizar a estrutura CASE para criao de um menu e sub-rotinas para cada uma das operaes. d) Que receba uma temperatura em graus centgrados e apresente-a convertida em graus Fahrenheit. A frmula de converso f = (9 *c+160)/5.

Aula 1 Programao modular

25

e-Tec Brasil

Aula 2 Agregados homogneos: vetores


Objetivos
Denir adequadamente uma funo, que se utiliza da estrutura de dados vetores. Resolver de forma correta problemas que envolvam a utilizao de vetores.

2.1 Quando devemos utilizar agregados homogneos


Muitas vezes, precisamos armazenar um grupo de informaes semelhantes, como nos exemplos a seguir: Idades de jogadores de um time de futebol; Notas dos alunos de uma turma; Conjunto de temperaturas; Nomes dos clientes de uma loja. Cada um desse conjunto de dados pode ser armazenado, empregando-se variveis normais (atmicas), entretanto, haver alguns inconvenientes, vejamos o exemplo abaixo que armazena notas dos alunos de uma turma. oat nota1, nota2, ..., nota9, nota10; cout << Informe a 1. Nota:\n; cin >> nota1; cout << Informe a 2. Nota:\n; cin >> nota2; . . .

Aula 2 Agregados homogneos: vetores

27

e-Tec Brasil

Figura 2.1: Dvida quanto forma de resoluo


Fonte: Banco de imagens dreamstime

E se forem 100 notas, 1000 etc.? Para facilitar o manuseio desses conjuntos, as linguagem de programao LP oferecem os tipos agregados homogneos, conhecidos como vetores e matrizes.
Vetores So um conjunto de variveis do mesmo tipo que so referenciadas pelo mesmo nome.

2.2 Declaraes de um vetor


tipo var_nome[tamanho]; Tipo: determina o tipo de dados de cada elemento no vetor. Tamanho: determina o nmero de elementos do vetor. Exemplo de declarao de um vetor: int vetidade [10];

e-Tec Brasil

28

Estrutura de Dados

2.3 Denio/declarao de um vetor


int vetidade [20] int i; . .
0 1 2
...

18

19

Figura 2.2: Alocao de memria para um vetor de 20 elementos do tipo inteiro


Fonte: Elaborada pela autora

int vetidade[20]; char vetnome[50]; int i; . .


0 1

2
...

18

19

1
...

48

49

Figura 2.3: Alocao de memria para um vetor de 20 e de 50 elementos respectivamente


Fonte: Elaborada pela autora

Alternativamente podemos denir um nome para um tipo de dado; veja o trecho de cdigo a seguir: typedef oat tvetsal[30]; tvetsal vetsal; int i; . . .

Aula 2 Agregados homogneos: vetores

29

e-Tec Brasil

Usando constantes const int N = 10; . . int main() { int a1[N], a2[N], a3[N]; int i; . . } Para alterar o tamanho do vetor, teremos somente que alterar o tamanho da constante N. Dessa forma o tamanho dos trs vetores automaticamente ser atualizado. Forma incorreta de denio do tamanho de um vetor: int n; oat salfunc[n]; cin >> n; . . . O tamanho de um vetor no pode car em aberto.

2.4 Operaes bsicas com vetores


A referncia a cada componente de um vetor realizada por meio de um ndice. Em C++, a indexao de um vetor varia de 0 a n-1, onde n representa a dimenso do vetor. Atribuio: int vetidade[20]; vetidade[0]=15; vetidade[1]=9;

e-Tec Brasil

30

Estrutura de Dados

0 15

1 9

2
...

18

19

Figura 2.4: Alocao dos elementos do vetor vetidade


Fonte: Elaborada pela autora

Os componentes sero lidos um de cada vez. Alm do nome do vetor, deve ser explicitada a posio do componente lido, por meio do ndice. int vetidade[20]; cin >> vetidade[0]; cin >> vetidade[1];

10 45

Figura 2.5: Tela de exibio dos elementos do vetor


Fonte: Elaborada pela autora

0 10

1 45

2
...

18

19

Figura 2.6: Alocao das idades no vetor vetidade


Fonte: Elaborada pela autora

2.5 Leitura de um vetor utilizando a estrutura for


int vetidade[20]; int i; { for (i=0; i<20; i++) { cout << Informe a idade << i << : ; cin >> vetidade[i]; } . . . }

Aula 2 Agregados homogneos: vetores

31

e-Tec Brasil

Informe Informe Informe . . . Informe Informe

a idade 0: 13 a idade 1: 25 a idade 2: 18

a idade 18: 40 a idade 19: 25

Figura 2.7: Exibio de entrada das idades no vetor vetidade


Fonte: Elaborada pela autora

a) Manuseio dos valores for (i=0; i<20; i++) { cout << Fornea o salrio << i <<: ; cin >> vetsal[i]; } for (i=0; i<20; i++) vetSal[i]= vetsal[i]*1.3; b) Exibio dos valores for (i=0; i<20; i++) { cout << Fornea o salrio << i <<: ; cin >> vetsal[i]; vetSal[i]= vetsal[i]*1.3; } cout << Salrios reajustados:\n; for (i=0; i<20; i++) cout << Salrio << i <<: << vetsal[i];

e-Tec Brasil

32

Estrutura de Dados

c) Identicao do menor elemento int vetidade[5]; int i,min; . . . min = vetidade[1]; for (i=2; i<=5; i++) if (vetidade[i] < min) min = vetidade[i]; cout << A menor idade : << min; d) Identicao do maior elemento for (i=1; i<=20; i++) { cout << Fornea o salrio << i <<: ; cin >> vetsal[i]; } max = vetsal[1]; for (i=2; i<=20; i++) if (vetsal[i] > max) max = vetsal[i]; cout << Maior salrio R$ << max;

Maior salrio: R$ 3500,00

Figura 2.8: Tela de sada, aps a identicao do maior salrio


Fonte: Elaborada pela autora

Aula 2 Agregados homogneos: vetores

33

e-Tec Brasil

e) Soma dos elementos int vetidade[5]; int i,soma; . . . soma = vetidade[1]; for (i=2; i<=5; i++) soma = soma + vetidade[i]; cout << Soma dos elementos: << soma;
1 9 2 18 3 13 4 25 5 21

Figura 2.9: Esquema representativo da memria alocada a partir da posio 1


Fonte: Elaborada pela autora

typedef int tvet[tam]; : int SomaElem (tvet vetidade, int n) { int i,soma;

soma = vetidade[0]; soma = soma + vetidade[i]; for (i=1; i<n; i++)

Sub-rotina responsvel em fornecer a soma dos elementos do vetor

} {

return soma;

int main () tvet vetidade; : result = SomaElem(vetidade,n); }


Chamada da sub-rotina e passagem dos parmetros reais

cout << "Soma dos elementos: " << result;

Figura 2.10: Exemplo de um cdigo usando modularizao com vetores


Fonte: Elaborada pela autora

e-Tec Brasil

34

Estrutura de Dados

Resumo
Nesta aula estudamos a forma mais simples de estruturamos um conjunto de dados: vetores ou arrays. Vimos que a denio de um vetor dada por meio da seguinte forma: o tipo de dado; nome da varivel (usando as mesmas convenes de uma varivel comum) e, por m, o tamanho necessrio do vetor, que deve estar entre colchetes. O acesso a todos os elementos do vetor feito por meio de uma indexao da varivel. Observamos que, em C++, a indexao de um vetor varia de 0 a n-1, onde n representa a dimenso do vetor.

Atividades de aprendizagem
Implementar mdulos em C++ que realizem as operaes a seguir: a) que calcule qual o menor salrio armazenado em um vetor de 20 posies. b) que fornea a maior idade armazenada em um vetor de 20 posies. c) que fornea quais os valores que so maiores que a mdia geral dos valores armazenados em um vetor com 20 posies para inteiro. d) que fornea quantos dos valores so maiores que a mdia geral dos valores armazenados em um vetor com 20 posies para inteiro.

Aula 2 Agregados homogneos: vetores

35

e-Tec Brasil

Aula 3 Agregados homogneos: matrizes


Objetivos
Identicar quando da necessidade de se utilizarem matrizes para o armazenamento de dados. Denir e resolver adequadamente uma funo que se utiliza da estrutura de dados matrizes ou agregados homogneos. Denir apropriadamente a assinatura de uma funo que se utiliza de conjuntos bidimensionais.

3.1 Quando devemos utilizar agregados homogneos


Em algumas aplicaes temos um conjunto de dados numricos, que se apresentam de forma bidimensional, como no exemplo a seguir: Notas de 40 alunos, obtidas em 3 bimestres letivos consecutivos. Nesse exemplo, ao invs de empregarmos 3 vetores (1 para cada bimestre), podemos empregar uma matriz, onde se agregaro todos os dados, da seguinte forma: 3 linhas (uma para cada bimestre) 40 colunas (uma para cada aluno) Assim, atravs da mesma estrutura, podemos obter, por exemplo: A 1. Nota do 10. Aluno... n = mat[0][9]; Assim como nos vetores, em C++ a primeira linha a linha 0, a primeira coluna a coluna 0, etc. A Figura 3.1 ilustra uma matriz de duas dimenses, sendo composta de 4 linhas e 3 colunas.
Matriz um conjunto de variveis, cada uma com um valor associado, como se fossem variveis simples, mas todas compartilham do mesmo nome. As variveis armazenadas nessa estrutura so do mesmo tipo de dado. Os elementos desse conjunto so dispostos em linhas e colunas e ndices so utilizados para referenci-los.

Aula 3 Agregados homogneos: matrizes

37

e-Tec Brasil

m[0][0] m[1][0] m[2][0] m[3][0] m[4][0]

m[0][1] m[1][1] m[2][1] m[3][1] m[4][1]

m[0][2] m[1][2] m[2][2] m[3][2] m[4][2]

Figura 3.1: Alocao dos elementos de uma matriz


Fonte: Elaborada pela autora

3.2 Declarao de uma matriz


tipo var_nome[num_linhas][num_colunas]; Exemplo de declarao de uma matriz: oat matnotas [4] [3];

float matnotas [4][3] int i,j; . .


0 0 1 2 3 1 2

5.0 6.5 6.5 8.0

8.0 7.0 9.0

7.5 8.5 9.5 Totalizando 12 notas

5.0 10.0

Figura 3.2: Alocao dos elementos de uma matriz


Fonte: Elaborada pela autora

3.3 Inicializao das matrizes


As matrizes podem ser inicializadas na declarao oat matnotas[4][3]={{5,8,7.5}, {6.5,5,10}, }; Ou podem ser inicializadas sequencialmente: oat matnotas[4][3] = {5,8,7.5,6.5,5,10, };

e-Tec Brasil

38

Estrutura de Dados

O nmero de elementos por linha pode ser omitido numa inicializao, mas o nmero de colunas deve ser sempre fornecido, por exemplo: oat matnotas [ ][3] = {5,8,7.5,6.5,5,10.0, ..., 9.5}

3.4 Principais operaes com matrizes


3.4.1 Atribuio
Para referenciar os componentes de uma matriz, utiliza-se indexao dupla: matnotas[i][j] . . . matnotas[0][0] = 5.0; matnotas[1][1] = 6.5;

5.0 6.5

Figura 3.3: Alocao dos elementos de uma matriz nas posies indicadas
Fonte:Elaborada pela autora

3.4.2 Leitura
Os componentes sero lidos um de cada vez. Alm do nome da matriz devem ser explicitadas as posies dos componentes lidos, por meio de seus ndices. { oat matnotas [4][3]; cin >> matnotas [0][0]; cin >> matnotas [0][1]; . . . }

Aula 3 Agregados homogneos: matrizes

39

e-Tec Brasil

a) Leitura usando a estrutura for: { oat matnotas [4][3]; int i,j; for (i=0; i<4; i++) for (j=0; j<3; j++) { cout << Informe a << i <<a. nota do << j << o. aluno: ); cin >> matnotas [i][j]; } } O primeiro ndice, i, acessa a linha, e o segundo, j, acessa a coluna. O processo de percurso de uma matriz se d linha a linha.

3.4.3 Escrita
Sintaxe da escrita em C++: { oat matnotas [4][3]; int i,j; . . . for (i=0; i<4; i++) for (j=0; j<3; j++) cout << matnotas [i][j]; }

3.5 Passagem de matrizes para funes


Uma matriz criada estaticamente representada por um ponteiro para um vetor-linha com o nmero de elementos da linha. Quando passamos uma matriz para uma funo, o parmetro da funo deve ser desse tipo. No exemplo a seguir, apresentamos dois prottipos de funes que recebem uma matriz declarada anteriormente. void transposta (..., oat matnotas[ ][3], ...); int SomaDiagPrin (tmat mat);

e-Tec Brasil

40

Estrutura de Dados

O acesso aos elementos da matriz dentro da funo feito com indexao dupla.

Resumo
Nesta aula estudamos como possvel criar vetores bidimensionais ou matrizes. Para declararmos uma matriz de valores inteiros com 3 linhas e 4 colunas, fazemos: int mat [3][4];. Essa declarao reserva um espao de memria necessrio para armazenar os 12 elementos da matriz, que so armazenados de maneira contnua, organizados linha a linha. Os elementos da matriz so acessados por indexao dupla: mat [i][j]. O primeiro ndice, i, refere-se linha e o segundo, j, coluna. Como em C++ a indexao comea em zero, o elemento da primeira linha e da primeira coluna acessado por mat [0][0].

Atividade de aprendizagem
Implementar mdulos em C++ que realizem as operaes a seguir. Denir as matrizes com dimenso 10 x 10, o que estabelecer a mxima ordem possvel. a) Ler uma matriz 3x4 e desenvolver uma sub-rotina que exiba os elementos em formato de matriz (linhas e colunas). Para isso, combine os comandos cout e endl. b) Vericar se uma matriz diagonal inferior. c) Denir trs matrizes A, B, e C, de mesma ordem (M x N). Desenvolver um programa que leia A e B, e uma sub-rotina que calcule e mostre a matriz C = A + B d) Construir um programa que realize o produto entre duas matrizes A e B. O usurio fornecer a ordem de A e de B, e o programa vericar, inicialmente se possvel o produto (nmero de colunas da primeira deve ser igual ao nmero de linhas da segunda). Se possvel, calcular e exibir a matriz resultante da operao. Caso contrrio emitir uma mensagem de erro.

Aula 3 Agregados homogneos: matrizes

41

e-Tec Brasil

Aula 4 Tcnicas de pesquisa e classicao de dados


Objetivos
Conhecer e aplicar as duas tcnicas que realizam pesquisa em vetores: sequencial e binria. Distinguir qual algoritmo de pesquisa pode ser mais adequado para uma determinada aplicao computacional. Conhecer o funcionamento bsico dos principais mtodos que realizam classicao em vetores, bem como, implement-los utilizando a linguagem C++.

4.1 Por que um estudo sobre tcnicas de pesquisa e ordenao de dados?


A aplicao de vetores em programao muito extensa. Em muitas dessas aplicaes, duas operaes so comumente realizadas: pesquisa e ordenao (ou classicao). Essas operaes sero apresentadas nesta aula.

4.2 Pesquisa em vetor


Essa operao consiste na vericao da existncia de um determinado valor dentro de um conjunto de dados (um vetor ou um arquivo) e, em muitos casos, da posio do(s) elemento(s) com aquele valor. Veremos dois mtodos de pesquisa bastante difundidos: pesquisa sequencial e pesquisa binria.

pesquisa A operao de busca empregada com bastante frequncia em aplicaes computacionais, sendo, dessa forma, importante conhecer as diversas estratgias para efetu-la. Por exemplo, um programa de controle de estoque pode buscar, dado um cdigo numrico ou um nome, a descrio e as caractersticas de um determinado produto. Se tivermos um grande nmero de produtos cadastrados, o mtodo para efetuar a busca dever ser eciente; caso contrrio, a busca poder ser muito demorada, inviabilizando-se assim, a operao. classicao Em diversas aplicaes, os dados devem ser armazenados de acordo com uma determinada ordem. Alguns algoritmos podem explorar a ordenao dos dados para operar de maneira mais eciente, do ponto de vista de desempenho computacional. Para ordenar os dados temos duas alternativas: ou inserimos os elementos na estrutura de dados respeitando a ordenao diz-se organizao garantida por construo ou, a partir de um conjunto de dados j inseridos, aplicamos um algoritmo para ordenar seus elementos. Veremos trs algoritmos de ordenao que podem ser empregados em aplicaes computacionais: insero, seleo e quicksort.

4.2.1 Mtodo de pesquisa sequencial


Esse mtodo, tambm conhecido como pesquisa linear, empregado para encontrar um elemento particular em um conjunto de dados no ordenado (isto , cujos elementos no esto organizados segundo algum critrio). A tcnica de pesquisa sequencial envolve a simples vericao de cada componente do vetor um aps o outro, at que o elemento desejado seja encontrado nesse caso diz-se que a pesquisa foi bem-sucedida ou que todos os elementos do vetor tenham sido vericados sem que o elemento procurado tenha sido encontrado pesquisa malsucedida. O cdigo a seguir implementa essa tcnica de pesquisa:
Aula 4 Tcnicas de pesquisa e classicao de dados

43

e-Tec Brasil

typedef oat TDado; // ou outro tipo qualquer int BuscaSeq (TVet vet, TDado valproc, int n) { int i; for (i=0; i<n; i++) { if (valproc == vet[i]) return i; } return -1; } Responda s seguintes perguntas: O algoritmo acima descrito ser sempre eciente? Caso a resposta anterior tenha sido negativa, em que situao este algoritmo ser ineciente?

4.2.2 Mtodo de pesquisa binria


Quando os elementos de um vetor esto previamente ordenados, uma tcnica de pesquisa mais eciente pode ser empregada. Descreveremos a seguir o mtodo de pesquisa binria. Seu funcionamento baseia-se no princpio de reduzir metade, sucessivamente, o universo de busca. Desse princpio resulta sua ecincia. Descrio detalhada do mtodo: Determinar o elemento que est no meio do vetor e compar-lo com o valor procurado (chave). Se o elemento central for igual chave, a pesquisa termina; Se o elemento central for menor que a chave, a pesquisa continuar na metade superior (a inferior ser desprezada); J se o elemento central for maior que a chave, continua-se a pesquisa somente na metade inferior do vetor. E assim sucessivamente... A pesquisa se encerrar em dois casos: ou quando a chave for encontrada, ou ento, quando no houver mais nenhum componente no universo de busca.

e-Tec Brasil

44

Estrutura de Dados

typedef oat tdado; // ou outro tipo qualquer int BuscaBin (tvet vet, tdado valproc, int n) { int baixo = 0; int alto = n-1; int meio; while (baixo <= alto) { meio = (baixo+alto) / 2; if (valproc < vet[meio] ) alto = meio-1; else if (valproc > vet[meio] ) baixo = meio+1; else return meio; } return -1; }

4.3 Classicao ou ordenao de vetores


Classicar um conjunto de dados consiste em arranjar seus elementos numa determinada ordem, segundo algum critrio especco. Por exemplo, organizar em ordem alfabtica um conjunto de dados alfanumricos, ou ento, ordenar de forma crescente ou decrescente os dados numricos.

4.3.1 Mtodo de seleo


Nesse mtodo o elemento de valor mais baixo identicado e permutado com o primeiro elemento; a seguir o segundo menor elemento identicado e permutado com o elemento da segunda posio; e assim por diante, at que o vetor esteja ordenado. Por exemplo, na sequncia da Figura 4.1, a ordenao se daria da seguinte maneira (em destaque, a parte j ordenada):
G J E H F C D A I B

Figura 4.1: Congurao inicial do vetor


Fonte: Elaborada pela autora

Aula 4 Tcnicas de pesquisa e classicao de dados

45

e-Tec Brasil

G J E H F C D A I B - Passo 1: coloca-se o menor elemento (A) na casa 1 (trocam-se as posies). A J E H F C D G I B - Passo 2: coloca-se 2. menor elemento (B) na casa 2. A B E H F C D G I J - Passo 3: coloca-se o 3. menor elemento (C) na casa 3. A B C H F E D G I J - Passo 4: coloca-se o 4. menor elemento (D) na casa 4. A B C D F E H G I J - Passo 5: coloca-se o 5. menor elemento (E) na casa 5. A B C D E F H G I J - Passo 6: coloca-se o 6. menor elemento (F) na casa 6. A B C D E F H G I J - Passo 7: coloca-se o 7. menor elemento (G) na casa 7. A B C D E F G H I J - Passo 8: coloca-se o 8. menor elemento (H) na casa 8. A B C D E F G H I J - Passo 9: coloca-se o 9. menor elemento (I) na casa 9. ABCDEFGHIJ Observe as armaes seguintes e responda pergunta que segue: No passo 6 no houve troca, pois o 6o menor elemento (F) j se encontrava em sua posio. Aps a colocao do penltimo elemento em sua posio, o ltimo j estar tambm na posio correta. Em qual(is) outro(s) passo(s) tambm no houve troca(s)?

4.3.1.1 Implementao do mtodo de seleo


void ClassifSelecao(tvet vet, int n) { int i,j,posmin,aux; for (i=0; i<n-1; i++) { posmin = i; for (j=i+1; j<n; j++) if (vet[j] < vet[posmin]) posmin = j; // trocar aux=vet[i];

e-Tec Brasil

46

Estrutura de Dados

vet[i]=vet[posmin]; vet[posmin]=aux; } }

4.3.2 Mtodo de insero


Esse mtodo comea considerando que o primeiro elemento um subvetor ordenado. Ento, o segundo elemento inserido nesse subvetor, com o que se tem dois elementos j ordenados relativamente. O terceiro ento colocado em sua posio correta em relao aos dois primeiros, e assim sucessivamente, at que todos os elementos tenham sido inseridos e estejam, portanto, em sua posio correta. Apresenta a vantagem de trabalhar menos em lista j ordenada. Por exemplo, na sequncia a seguir, a ordenao se daria da seguinte maneira (em destaque, de forma sublinhada, a parte j ordenada). Congurao inicial: consideramos o 1. elemento um subconjunto ordenado:
G J E H F C D A I B

Para entender melhor o mtodo da seleo, consulte o site da disciplina: no endereo: http://www.ifpa.edu.br, clique sobre o link estrutura de dados e posteriormente sobre o link mtodo de seleo e visualize a animao do algoritmo.

Figura 4.2: Congurao inicial do vetor considerando o 1o. elemento um subconjunto ordenado
Fonte: Elaborada pela autora

G J E H F C D A I B - Passo 1: insero do 2. elemento ( J ) E G J H F C D A I B - Passo 2: insero do 3. elemento ( E ) E G H J F C D A I B - Passo 3: insero do 4. elemento ( H ) E F G H J C D A I B - Passo 4: insero do 5. elemento ( F ) C E F G H J D A I B - Passo 5: insero do 6. elemento ( C ) C D E F G H J A I B - Passo 6: insero do 7. elemento ( D ) A C D E F G H J I B - Passo 7: insero do 8. elemento ( A ) A C D E F G H I J B - Passo 8: insero do 9. elemento ( I ) A B C D E F G H I J - Passo 9: insero do 10. elemento ( B )

Aula 4 Tcnicas de pesquisa e classicao de dados

47

e-Tec Brasil

4.3.2.1 Implementao do mtodo de insero


typedef int TVet[tam]; void ClassifInsercao(TVet vet, int n) { int i,j,aux; for (i=1; i<n; i++) { aux=vet[i]; j=i-1; while (j >= 0 && vet[j] > aux) { vet[j+1]=vet[j]; j--; } vet[j+1]= aux; } } Ou void ClassifInsercao(tvet vet, int n) { int i,j,aux; for (i=1; i<n; i++) { aux=vet[i]; j=i-1; while (vet[j] > aux) { vet[j+1] = vet[j]; j--; if (j<0) break; } vet[j+1]= aux; } }

Para entender melhor o mtodo da insero, consulte o site da disciplina: no endereo: http://www.ifpa.edu.br, clique sobre o link estrutura de dados e posteriormente sobre o link mtodo de insero e visualize a animao do algoritmo.

e-Tec Brasil

48

Estrutura de Dados

4.3.3 Mtodo de partio e troca quicksort


Esse, que um dos melhores mtodos de ordenao, baseia-se na interessante ideia de particionar sucessivamente a estrutura, visando ordenar pores menores, separadamente. O ganho de desempenho decorre do fato de que mais rpido ordenar dois vetores de tamanho N/2 do que um de tamanho N. Veja a Figura 4.3:

N/2
0
1

N/2

...

N-2

N-1

Figura 4.3: Partio de um vetor para implementao do mtodo quicksort


Fonte: Elaborada pela autora

Se para uma estrutura de tamanho N, o tempo gasto proporcional a N2, o tempo gasto para as duas metades ser proporcional a: (N/2)2 + (N/2)2 = 2 . (N/2)2 = 2 . (N2/4) = N2/2 Ou seja, se dividirmos a tarefa em duas partes, o tempo gasto se reduz metade tambm. Assim, realizando sucessivas divises, obteremos melhorias signicativas no desempenho, com tempos de processamento proporcionais a N.log2N. O quicksort funciona da seguinte maneira: inicialmente selecionamos um valor x como referncia (o elemento da posio mdia, por exemplo); ento, dividimos a estrutura em duas partes (no necessariamente de mesmo tamanho): a primeira com os elementos menores ou iguais a x, e a segunda com os maiores que x. Dessa forma, se ordenarmos os dois segmentos separadamente, a estrutura toda estar tambm ordenada. O processo descrito ser repetido em cada uma das duas partes, e assim sucessivamente (e recursivamente) at que a estrutura esteja ordenada, como mostrada na Figura 4.4.
D C H F E A I B G

Figura 4.4: Congurao inicial do vetor, exemplo para o 1o. particionamento


Fonte: Elaborada pela autora

Para entender melhor o mtodo da recursividade, consulte o site da disciplina no endereo: http://www.ifpa.edu.br, clique sobre o link estrutura de dados e no link denominado recursividade, visualize o rastreamento da funo fatorial resolvida recursivamente.

O valor x de comparao foi obtido no meio da matriz (elemento E). Percorremos da esquerda para a direita at encontrarmos elementos inadequados, ou seja, maiores que (ou iguais a) x, e da direita para a esquerda, em busca de elementos menores que (ou iguais a) x. Esses elementos sero permutados e, assim, enviados sua partio correta.

Aula 4 Tcnicas de pesquisa e classicao de dados

49

e-Tec Brasil

DCHFEAIBG DCBFEAIHG DCBAE FIHG

permutar H com B permutar F com A vetor dividido em duas parties

Agora podemos ordenar separadamente a primeira partio (valores menores ou iguais a E), e a segunda (valores maiores que E) e, assim, a estrutura toda estar ordenada. A cada partio ser aplicado o mesmo procedimento, recursivamente, at que isso seja desnecessrio (partio de 1 elemento).

4.3.3.1 Implementao do metdo quicksort


typedef int TVet[tam]; typedef int TDado; void QSort(TVet v, int esq, int dir) { int i,j; TDado x,aux; i = esq; j = dir; x = v[(esq+dir)/2]; do { while (v[i] <x) // procurar elemento fora de lugar i++; while (v[j] > x) // idem para a direita j--; if (i <= j) { // permutar aux = v[i]; v[i] = v[j]; v[j] = aux; i++; j--; } }

e-Tec Brasil

50

Estrutura de Dados

while (i <= j); // vetor dividido em duas parties if (esq < j) QSort(v,esq, j); if (i < dir) QSort(v,i, dir); }
Para entender melhor o mtodo quicksort, consulte o site da disciplina no endereo: http://www.ifpa.edu.br, clique sobre o link estrutura de dados e posteriormente sobre o link mtodo quicksort e visualize a animao do algoritmo.

Resumo
Nesta aula estudamos duas estratgias para efetuar pesquisas de um elemento em um determinado conjunto de dados. 1) Pesquisa sequencial, utilizada para vericar a presena de um ou vrios elementos numa sequncia, onde os dados no se encontram ordenados. Esse mecanismo consiste em percorrer o vetor, comparando os elementos que o constituem, com o elemento procurado; 2) Pesquisa binria, aplicada a um conjunto de dados ordenados. Esse algoritmo consiste em ir dividindo o universo de busca ao meio, de forma a torn-lo cada vez menor. Estudamos tambm trs algoritmos que permitem colocar os elementos de uma dada sequncia em uma determinada ordem; foram eles: mtodo de seleo, mtodo de insero e o mtodo de partio e troca (quicksort).

Atividades de aprendizagem
Desenvolver os cdigos a seguir: 1. Ler um vetor de N nmeros reais aleatrios. Desenvolver uma sub-rotina para coloc-los em ordem crescente e mostrar o novo vetor. 2. Ler um vetor de N nmeros inteiros aleatrios. Desenvolver uma sub-rotina para coloc-los em ordem crescente e mostrar somente o(s) nmero(s) par(es) do novo vetor.

Aula 4 Tcnicas de pesquisa e classicao de dados

51

e-Tec Brasil

Aula 5 Lista implementada por vetores


Objetivos
Identicar, para uma determinada aplicao, o tipo de representao de lista mais adequada. Conhecer os principais algoritmos envolvendo manipulao com listas. Desenvolver mdulos que realizem operaes com listas.

5.1 Denio de lista


Para Ferreira (2011) em sentido geral, uma lista uma relao (ou rol) de elementos. Uma lista de compras, por exemplo, uma enumerao de elementos a serem adquiridos. Notemos que essa lista poderia conter apenas o nome do item, mas poderia tambm especicar a quantidade a ser comprada. Nesse caso, a lista possuiria pares como elementos, cada um contendo um nome de item e a quantidade correspondente. Em certos casos, existe uma relao de ordem entre os elementos de uma lista. Por exemplo, isso ocorreria se fossem calculadas as temperaturas mdias mensais, de um certo local, de determinado ano. Para garantir a relao de cada temperatura com seu ms correspondente, uma soluo seria formamos uma lista de pares (ms, temperatura). Veja exemplo a seguir: [02 | 28,5] [03 | 30,0] [06 | 29,3]... Entretanto, a alternativa mais simples seria armazenar apenas as temperaturas, na ordem da coleta de dados. 28,5 30 29,3... Listas lineares, portanto so estruturas que permitem representar uma coleo de dados de forma a preservar a relao de ordem entre eles. Veja na Figura 5.1 a representao na memria da lista contgua com os valores calculados das temperaturas.

Lista linear um conjunto de elementos de um determinado tipo de dado, organizados de forma sequencial. Essa organizao estabelece uma relao de ordem, decorrendo da a possibilidade de identicar qualquer elemento da lista: o primeiro ou ltimo ou qual elemento precede ou sucede qualquer outro (SALVETTI; BARBOSA, 1998).

Aula 5 Lista implementada por vetores

53

e-Tec Brasil

28,5 30 29,3

Figura 5.1: Representao na memria


Fonte: Elaborada pela autora

Uma lista linear pode conter um conjunto de n 0 itens x1, x2, . . . , xn organizados estruturalmente de forma a reetir as suas posies relativas. A denio acima contempla a possibilidade de lista vazia (n=0) 0), que necessria em vrias situaes. Se n > 0, seguem as propriedades das posies relativas dos elementos na lista: x1 o primeiro elemento da lista; para 1 < k < n, o xk precedido por xk-1 e seguido de xk+1; xn o ltimo elemento da lista. O elemento xk da lista deve ser um determinado tipo, seja ele simples (inteiro, booleano, etc.) ou composto (um registro com vrios campos). Listas so adequadas para aplicaes nas quais no possvel prever a demanda por memria, permitindo a manipulao de quantidades imprevisveis de dados, de formato tambm imprevisvel. Entretanto o tamanho mximo da lista em linguagens como Pascal e C++ deve ser denido em tempo de compilao.

5.2 Operaes usuais com listas lineares


criar uma lista linear vazia; acessar o k-simo elemento para obter e/ou alterar seu contedo); inserir novo elemento antes/depois do k-simo elemento; remover o k-simo elemento; concatenar duas listas; determinar o tamanho (quantidade de elementos); pesquisar o elemento com determinado contedo; classicar os elementos quanto ao seu contedo.

e-Tec Brasil

54

Estrutura de Dados

5.3 Representao das listas


As duas principais formas de representao so: a) Por contiguidade. b) Por encadeamento. Nenhuma dessas alternativas de representao (ou implementao, ou, ainda, realizao) ideal. Cada uma se ajustar melhor a determinada aplicao, a depender da natureza das operaes realizadas e a frequncia com que so realizadas.

5.3.1 Representao por contiguidade


Nessa alternativa, os elementos da lista so armazenados em endereos contguos de memria. Assim, se for conhecido o endereo do elemento k, possvel obter o endereo do elemento k+1 (ou k-1), em funo do tamanho em bytes de cada elemento. Garante-se, portanto a relao de ordem entre os elementos. Essa estrutura corresponde ao agregado homogneo (construtor array), onde, a partir do endereo do primeiro elemento, pode-se acessar qualquer de seus elementos, com o deslocamento apropriado. importante lembrar que o tamanho (nmero de clulas) dos agregados homogneos denido estaticamente (em tempo de compilao). Por outro lado, o nmero de elementos de uma lista algo dinmico, isto , pode mudar ao longo da execuo do programa. Portanto, deve-se superdimensionar o vetor, adotando um tamanho tmax que se saiba ser suciente para acomodar o nmero mximo n de itens da lista. Ou seja, deve-se assegurar que n tmax. Assim, uma lista de n elementos poderia ser denida na linguagem C++ da seguinte forma:

Aula 5 Lista implementada por vetores

55

e-Tec Brasil

const int tmax = 100; // ou outro valor qualquer typedef int tdado; //ou outro tipo qualquer typedef struct tlista { int n; tdado elem[tmax]; }; Notemos que se optou por uma estrutura que agrega um vetor (Elem) e seu correspondente controle de tamanho lgico (N). Um exemplo de declarao de uma varivel desse tipo : tlista l;

5.3.2 Implementao de listas lineares por alocao sequencial


5.3.2.1 Obter o k-simo elemento
Considerando-se a lista l denida acima, para se obter o k-simo elemento de l, simplesmente escrevemos l.elem[k] em qualquer expresso. Contudo, necessrio testar se o valor do ndice i est dentro da faixa vlida, que de 1 a l.n. >> 1 a tmax toda a faixa sicamente disponvel. >> 1 a l.n a faixa efetivamente ocupada, sendo, portanto, a que interessa nesse teste... Uma opo, caso se deseje testar a validade do ndice, criar uma funo para realizar o acesso.

e-Tec Brasil

56

Estrutura de Dados

tDado Acesso(tlista l, int k) { if ((k < 1) || (k > l.n)) // ndice invlido return -9999; // cdigo de erro else return l.elem[k]; } Ao se chamar a funo Acesso, deve-se, logo em seguida vericar se foi retornado um valor vlido ou o cdigo de erro (-9999). Observe que esse valor s pode ser empregado como cdigo de erro se estiver fora da faixa de valores a serem armazenados na lista.

5.3.2.2 Alterar o k-simo elemento


void Alterar(tlista &l, int k, tdado val, bool &opok) { if ( (k < 1) || (k > l.n) ) //ndice invlido opok = false; else { opok = true; l.elem[k] = val; } } Observe que os parmetros l e opok foram passados por referncia. Sem isso, qualquer manipulao interna no teria qualquer efeito prtico aps o encerramento do mdulo.

5.3.2.3 Inserir um novo elemento antes do k-simo elemento


Para inserir um elemento na posio k, todos os elementos a partir de k (inclusive) devero ser deslocados direita. necessrio, entretanto, vericar se h pelo menos um espao livre no vetor para a abertura de espao e insero do novo elemento (l.n<tmax).

Aula 5 Lista implementada por vetores

57

e-Tec Brasil

void Inserir(tlista &l, int k, tdado val, bool &opok) { int i; if (l.n == tmax) // espao esgotado opok = false; else if ((k < 1) || (k > l.n+1)) //ndice invlido opok = false; else { opok = true; //deslocar elementos direita for (i=l.n; i>=k; i--) l.elem[i+1] = l.elem[i]; l.elem[k] = val; l.n++; //ajustar tamanho lgico } }

5.3.2.4 Remover o k-simo elemento


Para realizar essa operao, deslocamos uma posio esquerda todos os elementos posteriores posio k. importante, assim como no mdulo anterior, ajustar o tamanho lgico (l.n), nesse caso decrementando-o. void Remover(tlista &l, int k, bool &opok) { int i; if (k < 1 || k > l.n) // ndice invlido opok = false; else { opok = true; //deslocar elementos esquerda for (i= k; i<l.n-1; i++) l.elem[i] = l.elem[i+1]; l.n--; //ajustar tamanho lgico } }

e-Tec Brasil

58

Estrutura de Dados

O que aconteceria, se ao invs de l.n-1, empregssemos l.n...? void Remover(tLista &l, int k, bool &opok) { int i; if (k < 1 || k > l.n) // ndice invlido opok = false; else { opok = true; {deslocar elementos a esquerda} for (i= k; i<l.n; i++) l.elem[i] = l.elem[i+1]; l.n--; //ajustar tamanho lgico } }

Em aplicaes onde no haja como estimar o crescimento da lista, a utilizao de vetores, em linguagens como Pascal e C++, pode ser problemtica, porque nesse caso o tamanho mximo da lista tem que ser denido em tempo de compilao.

Resumo
Nesta aula estudamos o conceito de listas lineares sequenciais ou contguas. Para a acomodao desse tipo de lista utilizada a estrutura de dados vetores. A representao por vetor explora a sequencialidade da memria, de tal forma que os elementos de uma lista sejam armazenados em endereos contguos, ou igualmente distanciados uns dos outros. Estudamos a implementao de trs operaes bsicas para manipulao de listas contguas.

Aula 5 Lista implementada por vetores

59

e-Tec Brasil

Atividades de aprendizagem
Implementar mdulos para realizar as seguintes operaes em listas sequenciadas: 1. acessar uma posio na lista; 2. inserir um elemento antes do k-simo elemento; 3. alterar um elemento inserido; 4. remover o k-simo elemento; 5. exibir a lista; 6. localizar um elemento com determinado contedo.

e-Tec Brasil

60

Estrutura de Dados

Aula 6 Ponteiros
Objetivos
Conceituar e ilustrar a aplicao de variveis do tipo ponteiro, em algoritmos e programao de computadores.

Uma varivel dinmica no declarada na parte de declarao de variveis, porque ela ainda no existe antes do seu tempo de execuo. Dessa forma no possui sequer um nome, cando a cargo dos ponteiros desempenhar essa funo de nome. Uma varivel dinmica sempre referenciada indiretamente por um apontador, ou seja, para cada varivel dinmica criada deve existir um apontador, que literalmente aponta para ela, permitindo a sua manipulao.

6.1 O que so ponteiros?


Ponteiros (ou apontadores) so tipos especiais de varivel que armazenam no um dado, mas um endereo de memria reservado para um dado.

6.2 Declaraes em C++


Para declarar uma varivel do tipo ponteiro, usamos o * entre o tipo de dado apontado e o nome da varivel, tal como, no exemplo a seguir. int *ptint; // ponteiro para uma varivel inteira oat *ptreal; // ponteiro para uma varivel real

6.3 Operadores unrios


Operador unrio aquele que opera sobre um nico argumento. Para obter e acessar os endereos de memria a linguagem C++ oferece dois operadores unrios: & e *. Vejamos a seguir a forma de utilizao para a manipulao de ponteiros.

6.3.1 Operador unrio &


Esse operador unrio & (endereo de), obtm o endereo da posio da memria reservada para uma varivel.

Aula 6 Ponteiros

61

e-Tec Brasil

6.3.2 Operador unrio *


Esse operador unrio * (contedo de), aplicado s variveis do tipo ponteiro, acessa o contedo do endereo da posio da memria reservada para a varivel. O cdigo a seguir exemplica o uso dos operadores unrios. int a,b,s; int *pts,*pta,*ptb; cin >>a >>b; pta= &a; ptb= &b; pts= &s; *pts= *pta + *ptb; cout<< resultado: <<*pts;

6.4 Funo
A linguagem C++ possui duas funes, new e free, que so responsveis respectivamente por alocar e liberar memria dinamicamente. Suas formas de utilizao sero mostradas a seguir.

6.4.1 Funo new


A funo new cria dinamicamente (em tempo de execuo) uma nova varivel e faz uma varivel do tipo ponteiro apontar para ela.

6.4.2 Funo free


A funo free libera uma varivel criada dinamicamente, para que o Sistema Operacional (SO) possa reutilizar o espao de memria correspondente. O cdigo seguinte apresenta a utilizao das duas funes: { int *p; p = new int; *p = 2; cout << *p << endl; free(p); } A Figura 6.1 exibe passo a passo a execuo da funo new e free.

e-Tec Brasil

62

Estrutura de Dados

int *p ; p = new int ; *p = 2 ; cout << *P << endl ; free (p) ;

Alocao de Memria p

int *p ; p = new int ; *p = 2 ; cout << *p << endl ; free (p) ;

Alocao de Memria
p

int *p ; p = new int ; *p = 2 ; cout << *p << endl ; free (p) ;

Alocao de Memria
p

int *p ; p = new int ; *p = 2 ; cout << *p << endl ; free (p) ;

Alocao de Memria
p

Figura 6.1: Passo a passo da execuo das funes new e free


Fonte: Elaborada pela autora

Outras situaes comuns: Um ponteiro recebendo o endereo de outro: um ponteiro recebe o valor de outro por meio do comando de atribuio, como por exemplo: q = p;

Aula 6 Ponteiros

63

e-Tec Brasil

quando isso acontece, ele passa a apontar para o mesmo objeto que o outro aponta. Veja o passo a passo na Figura 6.2.
{

} {

*p, *q, *r; p = new int ; *p = 5; q = new int ; q = p; r = p; // ou q cout << *p; // ou *q ou *r free (q); // ou p ou r :

Alocao de Memria p q r

} {

*p, *q, *r; p = new int ; *p = 5; q = new int ; q = p; r = p; // ou q cout << *p; // ou *q ou *r free (q); // ou p ou r :

Alocao de Memria p q r

*p, *q, *r; p = new int ; *p = 5; q = new int ; q = p; r = p; // ou q cout << *p; // ou *q ou *r free (q); // ou p ou r :

Alocao de Memria p q r

*p, *q, *r; p = new int ; *p = 5; q = new int ; q = p; r = p; // ou q cout << *p; // ou *q ou *r free (q); // ou p ou r :

Alocao de Memria p q r

} {

*p, *q, *r; p = new int ; *p = 5; q = new int ; q = p; r = p; // ou q cout << *p; // ou *q ou *r free (q); // ou p ou r :

Alocao de Memria p q r

e-Tec Brasil

64

*p, *q, *r; p = new int ; *p = 5;

Alocao de Memria p q r

Estrutura de Dados

} {

r = p; // ou q cout << *p; // ou *q ou *r free (q); // ou p ou r :

*p, *q, *r; p = new int ; *p = 5; q = new int ; q = p; r = p; // ou q cout << *p; // ou *q ou *r free (q); // ou p ou r :

Alocao de Memria p q r

} {

5 *p, *q, *r; p = new int ; *p = 5; q = new int ; q = p; r = p; // ou q cout << *p; // ou *q ou *r free (q); // ou p ou r :

Alocao de Memria p q r

} {

*p, *q, *r; p = new int ; *p = 5; q = new int ; q = p; r = p; // ou q cout << *p; // ou *q ou *r free (q); // ou p ou r :

Alocao de Memria p q r

*p, *q, *r; p = new int ; *p = 5; q = new int ; q = p; r = p; // ou q cout << *p; // ou *q ou *r free (q); // ou p ou r :

Alocao de Memria p q r

Figura 6.2: Passo a passo da execuo do cdigo descrito esquerda


Fonte: Elaborado pela autora

Observe que a partir de q = p perdeu-se o acesso varivel criada com q = new int. Portanto, o manuseio de ponteiros exige cuidado!

Aula 6 Ponteiros

65

e-Tec Brasil

Resumo
Nesta aula estudamos o conceito de ponteiros que so utilizados quando precisamos armazenar endereos de memria de uma varivel; para isso, o valor desta deve ser correspondente ao do ponteiro. Para atribuir e acessar os endereos de memria, a linguagem C++ oferece dois operadores unrios: o operador unrio &, aplicado a variveis, resulta no endereo da posio da memria reservada para a varivel. O operador unrio *, aplicado varivel do tipo ponteiro, acessa o contedo do endereo de memria armazenado pela varivel ponteiro. A possibilidade de manipular ponteiros de variveis uma das maiores potencialidades de C++. Por outro lado, o uso indevido dessa manipulao pode fazer com que seu programa no funcione ou ocasionar efeitos colaterais imprevisveis.

Atividade de aprendizagem
Seja o seguinte trecho de programa: int i = 5; int j = 3; int *p, *q; p = &i; q = &j; Fornea o resultado das seguintes expresses? a) p == &i b) *p - *q c) **&p d) 3* - *p/(*q)+7

e-Tec Brasil

66

Estrutura de Dados

Aula 7 Lista encadeada


Objetivos
Identicar, para uma determinada aplicao, o tipo de representao de lista mais adequado. Conhecer os principais algoritmos envolvendo manipulao com listas encadeadas. Desenvolver mdulos que realizem operaes com listas encadeadas.

7.1 Denio de lista encadeada


Destacamos, em listas contguas (implementadas por vetores), a necessidade de se superdimensionar o vetor de tal forma que o tamanho lgico da lista nunca ultrapasse o tamanho fsico (que xo). Contudo h situaes em que no se pode, a priori, determinar com segurana o nmero mximo de elementos de uma lista. Nesses casos, ser invivel a alocao por contiguidade, pois em algum momento a realizao de uma insero seria impossvel, inviabilizando-se a continuidade do programa. Outro problema que poderia acontecer seria uma ocupao muito abaixo da capacidade do vetor (n muito menor que tmax). Nesse caso, estaramos subutilizando o espao de memria reservado. A alternativa que mais se ajusta para essas situaes adotar estruturas de dados que cresam medida que precisarmos armazenar novos elementos e diminuam medida que excluirmos elementos armazenados, liberando o espao de memria correspondente. Essas estruturas so chamadas dinmicas por requererem, conforme a operao, alocao (ou desalocao) dinmica de espao de memria. Na alocao dinmica, um comando especial demanda explicitamente a alocao de um espao de memria, conforme a necessidade.

Aula 7 Lista encadeada

67

e-Tec Brasil

O comando new, por exemplo, desempenha essa tarefa em vrias linguagens de programao (LP). Os espaos de memria relativos a ns excludos tambm so dispensados (desalocados) dinamicamente, o que pode ser realizado: explicitamente (comando dispose do Pascal ou free do C++), automaticamente: sistema de garbage collection (coleta de lixo), adotado em LP mais modernas, como por exemplo, em Java. Uma lista encadeada tipicamente implementada fazendo-se uso de ponteiros. Cada n estruturado como um registro contendo: o dado propriamente dito; um ponteiro que guardar a referncia para o prximo n (ou um ponteiro nulo quando se tratar do ltimo n). A Figura 7.1 exibe esquematicamente uma lista com quatro elementos esquerda, e, direita, uma lista vazia. Emprega-se um ponteiro que referencia o primeiro n, a partir do qual podemos ter acesso a todos os outros. A barra (/), representativa do ponteiro nulo (NULL em C++) indica que no h (mais) elementos a serem apontados.

3 / Lista vazia

Lista com 4 elementos


Fonte: Ferreira (2011)

Figura 7.1: Lista com quatro elementos esquerda e lista vazia direita

Emprega-se um ponteiro que referencia o primeiro n, a partir do qual podemos ter acesso a todos os outros. Para se ter acesso aos elementos da lista, necessrio que haja sempre uma varivel ponteiro apontando para a cabea da lista (primeiro n). A barra (/), representativa do ponteiro nulo (NULL em C++), indica que no h (mais) elementos a serem apontados.

e-Tec Brasil

68

Estrutura de Dados

Em geral, no incio da execuo do programa, a lista comea vazia e, para cada novo elemento a ser inserido na estrutura, aloca-se um espao de memria suciente para armazen-lo. No h contiguidade fsica entre os ns, pois estes no so necessariamente armazenados em espaos adjacentes (vizinhos) de memria. Podemos dizer que h uma contiguidade lgica, como sugere a Figura 7.1. Portanto no temos acesso direto aos elementos da lista, como no caso do uso de arrays. Para que seja possvel acessar o k-simo n, precisamos percorrer todos os k-1 anteriores (a menos que, ocasionalmente, se disponha de algum ponteiro referenciando diretamente o n que se deseja acessar). Por convenincia, representamos esquematicamente os ns lado a lado, conforme a Figura 7.1. Entretanto, as suas localizaes no heap podem ser bastante dispersas, conforme mostra a Figura 7.2.

p q
...

7 2

Figura 7.2: Uma possvel disposio fsica dos elementos de uma lista na memria
Fonte: Elaborada pela autora

Para o acesso s informaes contidas em um certo n de uma lista encadeada, deve-se observar que: necessrio ter um ponteiro que referencie esse n. O objeto apontado pelo ponteiro um registro.

heap

Aula 7 Lista encadeada

... 69
e-Tec Brasil

Os ponteiros que participam da estrutura da lista encadeada apontam para o n como um todo e no para um campo especco. Assim, o acesso ao primeiro elemento da lista da gura acima seria expresso da seguinte forma: p->dado

EXPRESSO P
p

SIGNIFICADO O ponteiro O objeto apontado (um registro) O campo dado do objeto apontado O campo prox do objeto apontado O campo ado do segundo n

p > p > dado p > prox


(p > prox) > Dado

...

Figura 7.3: Detalhamento de uma varivel do tipo ponteiro


Fonte: Elaborada pela autora

Observemos, na Figura 7.3, que na ltima expresso: como p->.prox um ponteiro (o ponteiro presente no primeiro n), pode-se empreg-lo para chegar ao prximo n e assim sucessivamente. Entretanto, o acesso a ns distantes, baseando-se nessa ideia, produz expresses longas e de difcil interpretao.

7.2 Economia de espao

Figura 7.4: Como se d a economia de memria


Fonte: Banco de imagens dreamstime

Como visto, empregando-se listas encadeadas, o espao total de memria gasto pela estrutura proporcional ao nmero de elementos nela armazenado. No h espao ocioso.

e-Tec Brasil

70

Estrutura de Dados

Contudo, nas listas encadeadas requerido, em cada n, um espao adicional para o ponteiro.
p

...

Figura 7.5: Lista encadeada com dois ns


Fonte: Ferreira (2011)

Portanto, para se avaliar uma possvel economia de memria, devemos considerar esse aspecto. O signicado dessa sobrecarga no uso da memria relativo. Se o n armazena um char (1 byte) mais o ponteiro (4 bytes), h uma sobrecarga de 400%. Entretanto, se estivermos armazenando uma cadeia de caracteres de 100 bytes, mais o ponteiro (4 bytes) a sobrecarga ser de apenas 4%. Essa anlise deve fazer parte da escolha entre a alocao por contiguidade onde h um necessrio superdimensionamento, mas no sobrecarga e a alocao dinmica.

7.3 Denio (recursiva) da estrutura de um n em C++


typedef oat tDado; // ou qualquer outro tipo typedef struct tNo { tDado dado; tNo *prox; }; typedef tNo *tPtNo; tPtNo p,q; No incio da execuo do programa s h ponteiros (p,q) para ns. Estes podero, dinamicamente, ser empregados para construir uma lista.
Para saber mais sobre recursividade, consulte o site da disciplina Estrutura de Dados no endereo: http://www.ifpa. edu.br, no tpico denominado recursividade.

Aula 7 Lista encadeada

71

e-Tec Brasil

Qualquer varivel do tipo tPtNo pode ser empregada para indicar o primeiro n de uma lista (ou qualquer outro n, conforme o interesse do programador).

7.4 Funo de inicializao


Inicializar uma lista simplesmente criar uma lista vazia, sem nenhum elemento. Como a lista representada pelo ponteiro para o primeiro elemento, uma lista vazia representada pelo ponteiro nulo (NULL), pois no existem elementos na lista. p = NULL;

7.5 Criao de ns
Para se inserir um elemento em uma lista necessrio alocar um novo n, o que feito (em C++) por meio do comando new. Por exemplo, empregando-se o ponteiro p j inicializado com NULL (lista vazia), por meio dos comandos mostrados na Figura 7.6, inicialmente criamos um novo n (automaticamente, o endereo do espao de memria correspondente a esse n atribudo a p). Na sequncia, so inseridos os valores para dado e prox, com o que teramos uma lista com apenas um elemento.
/

p= new tNo; p>dado = 7; p>prox = NULL


Lista vazia Aps criao de um n

7 /

Aps insero de valores

Figura 7.6: Lista encadeada com dois ns


Fonte: Ferreira (2011)

...assim temos uma lista com apenas um elemento. No cdigo a seguir, mostramos a criao de uma lista com dois elementos:

p > DADO

acesso ao objeto apontado por p


Fonte: Elaborada pela autora

acesso ao campo especco

Figura 7.7: Representao grca de um ponteiro

e-Tec Brasil

72

Estrutura de Dados

{ tPtNo p,q; p = new tNo; p->dado = 7; q = new tNo; q->dado = 3; p->prox = q; q->prox = NULL; : }

7.6 Principais algoritmos


7.6.1 Insero no incio da lista
Podemos denir um procedimento que, independentemente do estado da lista (vazia ou no) insere um n no incio. Uma possvel implementao mostrada a seguir. // insero de um n incio de uma lista void InsIni(tPtNo &p, tdado v) { tPtNo q; q=new tNo; q->dado = v; q->prox = p; p=q; }

Devemos notar que o ponteiro que representa a lista, apontando o primeiro n, deve ter seu valor atualizado (o primeiro n passar a ser o segundo...). Por essa razo, o parmetro que estar vinculado ao ponteiro que aponta para o incio da lista deve ser passado por referncia.

7.6.2 Percorrer os elementos da lista


De acordo com Ferreira (2011) o percurso em uma lista encadeada, em geral, segue o procedimento a seguir:

Aula 7 Lista encadeada

73

e-Tec Brasil

um ponteiro auxiliar inicialmente deve apontar para o primeiro elemento; na sequncia, esse ponteiro avana, ou seja, recebe sempre o ponteiro para o prximo n, at que seja atingido o ltimo n. Dado um ponteiro auxiliar q, o comando que produz esse avano : q = q->prox; O efeito desse comando ilustrado a seguir:

q
Antes Depois 7 4

...
Fonte: Ferreira (2011)

...

Figura 7.8: Ilustrao do efeito do comando q = q->prox;

No estado inicial, q->prox o ponteiro contido no primeiro n da Figura 7.6, que, portanto, aponta para o segundo. Quando o ponteiro q recebe esse valor, ele passa a apontar tambm para o segundo n (sempre que a um ponteiro p1 atribudo o contedo de outro ponteiro p2, p1 passa a apontar o mesmo objeto que p2 aponta). Para exemplicar a implementao da operao de percurso por uma lista encadeada, vamos considerar um mdulo que imprime todos os elementos armazenados em uma lista: void ExibirElementos(tPtNo p) { tPtNo q; //varivel auxiliar para percorrer a lista q = p; while (q != NULL); { cout << q->dado; q = q->prox; } }

e-Tec Brasil

74

Estrutura de Dados

7.6.3 Exemplicando uma operao usando lista encadeada


Como faramos para inserir um novo n em uma lista, entre dois ns existentes, armazenando no novo n o valor 2? Para criar um novo n entre dois ns existentes de um ponteiro, devemos realizar os seguintes passos: Criar um novo n qualquer; Atribuir a este um valor; Direcionar ponteiro do n a ser adicionado para o n seguinte; Direcionar ponteiro do n anterior para o n a ser adicionado.

Chamando o ponteiro a que se deseja adicionar um novo n no meio de p e o ponteiro criado para se adicionar o n entre dois ns do ponteiro p de q. Na Figura 7.9, segue a ilustrao da sequncia de passos que deve ser executada.
{

q = new tNo; q ->dado = 2 ; q ->prox = p->prox; p->prox = q; q = NULL; :

Alocao de Memria
p q

3 /

q = new tNo; q ->dado = 2 ; q ->prox = p->prox; p->prox = q; q = NULL; :

Alocao de Memria
p q

q = new tNo; q ->dado = 2 ; q ->prox = p->prox; p->prox = q; q = NULL; :

Alocao de Memria
p q

2 7 3

Aula

q = new tNo; q ->dado = 2 ; q ->prox = p->prox; p->prox = q; 7q = Lista encadeada NULL; :

Alocao de Memria
p q

75

e-Tec Brasil

:
7

2 3

q = new tNo; q ->dado = 2 ; q ->prox = p->prox; p->prox = q; q = NULL; :

Alocao de Memria
p q

2 7 3

q = new tNo; q ->dado = 2 ; q ->prox = p->prox; p->prox = q; q = NULL; :

Alocao de Memria
p q

2 7 3

q = new tNo; q ->dado = 2 ; q ->prox = p->prox; p->prox = q; q = NULL; :

Alocao de Memria
p q

2 7 3

Alocao de Memria
p q

Figura 7.9: Ilustrao dos passos para a insero de um novo n entre dois ns existentes
Fonte: Elaborada pela autora

7.7 Perguntas frequentes


1. Sempre que precisar de um ponteiro, preciso cri-lo, com new? No. O simples fato de se declarar o ponteiro (varivel global, local ou parmetro) faz com que o sistema aloque memria para ele. O comando new() deve ser usado para criar um objeto (sem identicao) para o qual o ponteiro usado como argumento apontar.O tipo do objeto criado depender do tipo de ponteiro. Por exemplo, caso o cdigo a seguir seja executado:

e-Tec Brasil

76

Estrutura de Dados

q = new tNo; q = p; O novo elemento criado perdido; observe a Figura 7.10.

q
novo elemento

Figura 7.10: Uso inapropriado da funo new


Fonte: Elaborada pela autora

2. Ao encerrar um mdulo, devo desalocar os ponteiros, empregando free? No. No encerramento do mdulo, todas as variveis locais e parmetros (inclusive ponteiros) so desalocados automaticamente. Ao se utilizar free(r), o objeto referenciado por r que ser excludo. No o ponteiro em si. 3. Quando se cria um objeto (comando new) empregando-se um ponteiro, s se pode empregar aquele ponteiro para desalocar aquele objeto? No. O n no pertence ao ponteiro que foi empregado na sua criao. Qualquer ponteiro que esteja apontando para certo objeto pode ser usado para a sua desalocao. 4. Ao empregar-se uma varivel local (ponteiro) para alocar um objeto, esse objeto ser tambm local, desaparecendo, portanto, aps a execuo daquele mdulo? No. O objeto criado alocado na rea de memria denominada heap (rea prpria para alocao dinmica). Variveis de heap no so nem globais nem locais.

Aula 7 Lista encadeada

77

e-Tec Brasil

Variveis globais: seu tempo de vida o intervalo de tempo de execuo do programa. Variveis locais: seu tempo de vida o intervalo de execuo do mdulo onde foram declaradas. Variveis de heap: seu tempo de vida arbitrrio, dependendo de uma criao (new) e da posterior desalocao.

7.8 Listas duplamente encadeadas


Nas listas duplamente encadeadas, os ns so ligados no s aos posteriores, mas tambm aos anteriores. Portanto, a estrutura do n deve possuir dois ponteiros.
no h n anterior...
p

no h n posterior...

/
Fonte: Elaborada pela autora

...

Figura 7.11: Arranjo esquemtico de uma lista duplamente encadeada na memria

7.8.1 Representao em C++


typedef int tDado; // ou qualquer outro tipo typedef struct tNo { tPtNo ant; tDado dado; tPtNo tPtNo; }; typedef tNo *tPtNo; tPtNo p,q;

e-Tec Brasil

78

Estrutura de Dados

/
Fonte: Elaborada pela autora

...

Figura 7.12: Representao esquemtica de uma lista duplamente encadeada

Com relao s operaes com lista duplamente encadeada, partindo-se das operaes com listas de encadeamento simples, basta fazermos alguns ajustes. necessrio considerar que nessa estrutura h dois ponteiros, conforme pode ser visto na Figura 7.12.

Resumo
Nesta aula estudamos a estrutura da lista encadeada, em que para cada novo elemento inserido na estrutura, alocamos um espao de memria para armazen-lo. Dessa forma, o espao total de memria gasto pela estrutura proporcional ao nmero de elementos armazenados. Nessa estrutura no podemos garantir que os elementos armazenados na lista ocuparo um espao de memria contguo; portanto, no temos acesso direto aos elementos da lista. Para percorrer todos os elementos da lista, devemos explicitamente guardar o seu encadeamento, o que feito armazenando-se, junto com a informao de cada elemento, um ponteiro para o prximo elemento da lista.

Atividades de aprendizagem
Implementar mdulos para realizar as operaes a seguir: 1. inserir/excluir um n no nal da lista; 2. inserir/excluir o ltimo n da lista; 3. incluir/excluir um n na k-sima posio; 4. calcular a soma dos elementos da lista; 5. calcular o tamanho da lista; 6. exibir os elementos da lista.

Aula 7 Lista encadeada

79

e-Tec Brasil

Aula 8 Cadeia de caracteres


Objetivos
Reconhecer as funes necessrias para o desenvolvimento de algoritmos envolvendo cadeias de caracteres. Identicar as principais tcnicas para a manipulao de cadeias de caracteres em C++. Desenvolver algoritmos envolvendo cadeias de caracteres. Nesta aula apresentaremos a forma bsica para representar cadeias de caracteres em C++.
cadeias de caracteres Um texto representado por uma sequncia (ou cadeia) de caracteres. A representao de cadeias de caracteres de fundamental importncia para o desenvolvimento de programas computacionais. Por exemplo, quando enviamos uma mensagem por correio eletrnico (e-mail), a mensagem tem de ser representada internamente no programa de mensagens para ento ser enviada. De modo anlogo, quando escrevemos um texto, o editor de texto responsvel por representar internamente o texto escrito, para ento poder salv-lo em disco, imprimi-lo etc.

8.1 Tipo caractere (char)


Um caractere qualquer dgito numrico, letra do alfabeto ou um smbolo especial. Em C/C++, variveis do tipo ordinal char so usadas para armazenar quaisquer caracteres da tabela ASCII. Constantes caracteres so escritas entre aspas simples. Ex: A, 3, b, * , &, etc. O caractere aspa simples () pode ser representado por \. Veja exemplo no cdigo a seguir: { char ch; ch = \; cout << ch << endl; // aparecer somente... : }

Aula 8 Cadeia de caracteres

81

e-Tec Brasil

8.2 Cadeias de caracteres em C++


Uma cadeia de caracteres pode ser implementada em C/C++ como um array de caracteres (char). Sintaxe da declarao: char <var> [constante]; // var o nome da varivel Exemplo: char S[20]; Em C++, constantes string so sempre escritas entre aspas. Para indicar, dentro de uma constante string, uma aspa, utilizado o smbolo \. Veja o exemplo a seguir. cout << Duas ONG\s foram criadas \n;

Duas ONGs foram criadas

Figura 8.1: Tela com a exibio da mensagem


Fonte: Elaborada pela autora

8.3 Controle do tamanho dinmico de uma cadeia de caracteres


O tamanho dinmico (tamanho da cadeia armazenada em um dado momento) controlado, na linguagem C++, acrescentando-se a ela o caractere nulo ( \0 ) ao nal.
I N S T I T U T O \0

Figura 8.2: Exemplo de nalizao de uma cadeia de caracteres


Fonte: Elaborada pela autora

e-Tec Brasil

82

Estrutura de Dados

Portanto, para armazenarmos uma cadeia de caracteres, devemos reservar uma posio adicional para esse caractere. No exemplo a seguir: s3 = Raquel Marques Ferreira; // 23 caracteres Dessa forma, ser armazenado em s3[23] o caractere \0. Os 23 caracteres da cadeia propriamente dita sero armazenados nas posies de 0 a 22. Podemos manipular individualmente os caracteres de uma cadeia por meio de indexao, assim como qualquer array. Por exemplo, podemos obter o terceiro caractere armazenado em uma varivel S com o comando ch = S[2]; ou cout << S[2]; Da mesma forma, podemos armazenar na 5 posio da mesma varivel o caractere A, por exemplo, com o comando s[4] = A; Para conhecer o cdigo ASCII completo, basta executar o cdigo a seguir: { unsigned char i; for (i=0; i<255; i++) cout << i << << (char) i << endl; }

8.4 Lendo cadeia de caracteres a partir do teclado


A maneira mais fcil de ler uma cadeia de caracteres fornecida pelo usurio via teclado utilizando o comando cin. Por exemplo, o cdigo a seguir l uma cadeia fornecida pelo usurio: // Usando cin para ler uma cadeia de caracteres fornecida via teclado. #include <iostream> using namespace std; int main() { char cadeia[40]; cout << Fornea uma frase: ;
Aula 8 Cadeia de caracteres

83

e-Tec Brasil

cin >> cadeia; // l a cadeia fornecida via teclado cout << A frase fornecida foi: ; cout << cadeia; return 0; } Embora esse programa esteja tecnicamente correto, h um problema. Para vericar qual , veja a seguir o exemplo de execuo do cdigo do programa acima. Fornea uma frase: Raquel Marques Ferreira A frase fornecida foi: Raquel Como voc v, quando o programa exibe a cadeia, ele mostra apenas a palavra Raquel, e no a frase completa tal como foi digitada. Isso se d em razo de que o operador >> para de ler a cadeia de caracteres quando o primeiro espao em branco for encontrado. O caractere espao em brando inclui espaos, tabulaes e novas linhas. Uma maneira de contornar esse problema utilizar a funo da biblioteca do C++, denominada gets ( ). A forma geral da chamada da funo gets () : gets(nome do array); A funo gets () vai continuar lendo os caracteres at que voc pressione ENTER. No cabealho de um programa usando gets () deve ser includa a biblioteca <cstdio>. No cdigo a seguir consta a verso do programa anterior usando a funo gets (). // usando o gets() para ler uma cadeia de caracteres do teclado #include <iostream> #include <cstdio> using namespace std; int main() { char cadeia[40]; cout << Fornea uma frase: ; gets(cadeia); // ler a cadeia fornecida via teclado

e-Tec Brasil

84

Estrutura de Dados

cout << A frase fornecida foi: ; cout << cadeia; return 0; } Agora, quando voc executar o programa e digitar a cadeia de caracteres Raquel Marques Ferreira, a frase toda ser lida e exibida, como mostra o exemplo a seguir de execuo. Fornea uma frase: Raquel Marques Ferreira A frase fornecida foi: Raquel Marques Ferreira Tenha em mente que nem >> nem gets ( ) executam qualquer vericao de limites no array. Portanto, se o usurio digitar uma cadeia de caracteres maior que o tamanho declarado do array, este ser sobrescrito. Isso faz com que ambos os mtodos de leitura de uma cadeia sejam potencialmente perigosos.

8.5 Funes predenidas que manipulam cadeias de caracteres


Em C++ suportado uma ampla gama de funes de manipulao de cadeia de caracteres. As mais comuns so: strcpy ( ) strcat ( ) strlen ( ) strcmp ( ) Todas as funes de cadeia de caracteres utilizam o mesmo cabealho, <cstring>. Vamos estudar cada uma dessas funes nas sees seguintes.

8.5.1 Funo strcpy( )


Funo usada para copiar cadeias de caracteres. O cdigo do programa a seguir copiar a cadeia Ferreira e Raquel para as variveis S1 e S2 respectivamente. O tamanho do array deve ser suciente para guardar a sequncia de caracteres. Lembre-se que necessrio 1 byte a mais para indicar o m da cadeia; caso o tamanho declarado no seja o desejvel, seu programa, provavelmente, poder falhar por acesso a reas indevidas de memria.
Aula 8 Cadeia de caracteres

85

e-Tec Brasil

{ char s1[20],s2[20]; strcpy (s1, Raquel); strcpy (s2, Ferreira); . . } O comando de atribuio direta S1 = Raquel; no aceito por C/C++, a menos que se esteja empregando (apenas em C++) a class string.

8.5.2 Funo strcat( )


Funo usada para concatenar cadeias de caracteres. No exemplo a seguir, a cadeia s2 ser anexada ao nal de s3; s3 se manter inalterada. O cdigo que segue exibir Raquel Ferreira na tela. { char s1[20], s2[20], s3[20]; strcpy (s1, Raquel); strcpy (s2, Ferreira); strcpy(s3,s1); strcat(s3, ); strcat(s3,s2); cout << s3 << endl; // Raquel Ferreira } A concatenao direta (+) no possvel com cadeias implementadas como arrays de char. J a class string (apenas em C++) permite a forma s3 = s1+s2.

8.5.3 Funo strlen( )


Funo que retorna o tamanho de uma cadeia de caracteres. O cdigo que segue exibir o tamanho de uma cadeia de caracteres fornecida via teclado.

e-Tec Brasil

86

Estrutura de Dados

{ char s[20]; int tam; cout << Digite uma frase: ; gets(s); tam = strlen(s); // tam armazenar a quantidade de // caracteres fornecida para S. }

8.5.4 Funo strcmp( )


Funo usada para comparar duas cadeias de caracteres retornando 0 caso elas sejam iguais. Se s1 for maior que s2 lexicogracamente (de acordo com a organizao do dicionrio), ento um valor positivo retornado; se for menor que s2, um valor negativo ser retornado. Veja o cdigo a seguir: bool senha () // retorna true se senha aceita; // ou false, caso contrrio. { char s[80]; cout << Digite sua senha: ; gets(s); if (strcmp(s, senha) != 0) // strings diferentes { cout << senha invalida.\n; return false; } return true; // strings comparadas iguais } int main() { if(senha () ) cout << Logado.\n; else cout << Acesso negado.\n; return 0; }

Aula 8 Cadeia de caracteres

87

e-Tec Brasil

J a class string (apenas em C++) permite que os seguintes operadores sejam usados: == != < > <= >= Esses operadores so empregados para comparar duas constantes ou variveis do tipo cadeia de caracteres. Por exemplo: BALA < BOLA resultar true. Note que para caracteres e cadeias de caracteres, menor (<) no signica menor comprimento, mas precedncia na ordenao alfabtica. Portanto ABACAXI menor que BOCA. Note ainda que como as letras maisculas vm antes das minsculas no Cdigo ASCII, DADO precede dado. (DADO < dado resultar true).

Resumo
Nesta aula estudamos como cada caractere representado na linguagem C++. As cadeias de caracteres so representadas por vetores do tipo char terminadas, obrigatoriamente, pelo caractere nulo (\0). Portanto, para armazenar uma cadeia de caracteres, devemos reservar uma posio adicional para o caractere de m de cadeia. Estudamos os algoritmos das funes predenidas que manipulam cadeia de caracteres: Copiar, concatenar, tamanho e comparao.

Atividades de aprendizagem
Desenvolver os seguintes mdulos: 1. Funo Tamanho Retornar o tamanho dinmico de uma cadeia. Declarao: typedef char TCadeia [40]; // tamanho fsico = 40 int Tamanho ( TCadeia s) Exemplo { strcpy(s, Estrutura de Dados); cout << Tamanho(s); // ser exibido 20 }

e-Tec Brasil

88

Estrutura de Dados

2. Funo Copiar Retornar uma subcadeia de uma cadeia. Declarao: typedef char TCadeia [40]; void Copiar( TCadeia s, int i, int cont, Tcadeia result ) A funo deve retornar uma cadeia contendo cont caracteres iniciando na posio i de S. Exemplo: { TCadeia sub,s; strcpy(s, Marcos da Silva Lemos); Copiar(s,10,5,sub); cout << sub; // ser exibido Silva } Renamento: Prever as seguintes situaes: Se i maior que o tamanho de S, ser retornada uma cadeia vazia. Se cont especicar mais caracteres do que existe comeando na posio i, somente o resto da cadeia deve ser retornado. 3. Funo Excluir Exclui uma subcadeia de uma cadeia. Declarao: void Excluir (TCadeia s, int i, int cont) A funo exclui cont caracteres de S, a partir da posio i.

Aula 8 Cadeia de caracteres

89

e-Tec Brasil

Exemplo: { TCadeia s; strcpy (s,Marcos da Silva Lemos); Excluir(s,7,9); cout << s; //Marcos Lemos } Renamento: Prever as seguintes situaes: se i for maior que o tamanho de s, nenhum caractere ser excludo. Se cont especicar mais caracteres do que existe comeando na posio i, somente o resto da cadeia deve ser excludo. 4. Funo PosSub Procurar uma subcadeia em uma cadeia. Declarao: int PosSub(Tcadeia sub, TCadeia s) PosSub tenta localizar Sub em S, e retorna a posio (ndice) do primeiro caractere de Sub dentro de S (primeira ocorrncia). Se Sub no for encontrado, PosSub deve retornar -1. Exemplo: { TCadeia s; int p; strcpy (s, 123.5); p = PosSub(23, s); cout << p; // exibe 4 - espaos em branco // so considerados }

e-Tec Brasil

90

Estrutura de Dados

5. Funo Concatenar Concatenar duas cadeias. Declarao: TCadeia Concatenar(TCadeia s1, TCadeia s2) O resultado a concatenao de s1 e s2. Exemplo: { TCadeia s; strcpy (s,Concatenar(ABC, DEF)); // ABCDEF } A funo Concat da linguagem Pascal mais verstil que a acima declarada, na medida em que permite que vrias cadeias sejam passadas em uma nica chamada. Exemplo: s = Concat(s1,s2,...,sn); Em C++, o operador +, se aplicado a cadeias de caracteres da class string, tambm cumpre a mesma funo: string s,s1,s2,s3; s = s1+s2+s3; 6. Funo Inserir Inserir uma subcadeia em uma cadeia. Declarao: void Inserir(TCadeia sub, TCadeia s, int p)

Aula 8 Cadeia de caracteres

91

e-Tec Brasil

Sub deve ser inserida em s a partir da posio p. Exemplo: { TCadeia s; strcpy (s,Arthur Ferreira); Inserir(Marques , s, 7); // Arthur Marques Ferreira } Renamento: Prever as seguintes situaes: 1) se P (posio de insero) for maior que T (tamanho de S), a subcadeia ser includa a partir da posio T+1. Exemplo: { TCadeia s; strcpy (s,Instituto); Inserir( Federal,s,100); cout << (s); // Instituto Federal }

e-Tec Brasil

92

Estrutura de Dados

Aula 9 Pilhas
Objetivos
Identicar para uma determinada aplicao quando esta pode ser representada pela estrutura pilha. Conhecer os principais algoritmos envolvendo manipulao com pilhas; Desenvolver mdulos que realizem operaes com pilhas.

9.1 Introduo
Para Celes et al. (2004, p.161), uma das estruturas de dados mais simples a pilha. Provavelmente por essa razo, a estrutura de dados mais utilizada em programao. Sua ideia fundamental que todo o acesso aos seus elementos seja feito a partir do topo. Assim, quando um elemento novo introduzido na pilha, ele passa a ser o elemento do topo. O nico elemento que pode ser removido da pilha o do topo. A pilha funciona da seguinte forma: o primeiro elemento a ser retirado o ltimo que tiver sido inserido.

9.2 Pilhas implementadas por vetores (array)


typedef struct tPilha { int topo; tDado elem[tmax]; }; tPilha p;

Aula 9 Pilhas

93

e-Tec Brasil

TMax

Topo Elem
Figura 9.1: Representao esquemtica de uma pilha
Fonte: Elaborada pela autora

9.2.1 Principais operaes


a) Inicializao p.topo = 0;

b) Empilhamento do valor V void Empilha(tPilha &p, tDado v, bool &opok ) { if (p.topo == tmax) opOk = false; else { opok = true; p.elem[p.topo] = v; p.topo++; } }

e-Tec Brasil

94

... ...
2 1 0

Estrutura de Dados

c) Desempilhamento void Desempilha(tPilha &p, bool &opok) { if (p.topo == 0) opok = false; else { opok=true; (p.topo)--; } } d) Obteno do elemento do topo tDado ElementoTopo(tPilha p) { if (p.topo == 0) return -9999; else return p.elem[p.topo]; }

9.3 Pilhas implementadas por ponteiros


typedef struct tNo { tDado dado; tNo *prox; }; typedef tNo *tPtNo; tPtNo p,q;

Aula 9 Pilhas

95

e-Tec Brasil

9.3.1 Principais operaes


a) Inicializao p = NULL; b) Empilhamento do valor V void Empilha(tPtNo &p, tDado v) { tPtNo q; q = new tNo; q->dado = v; q->prox = p; p = q; } c) Desempilhamento void Desempilha(tPtNo &p, bool &opok) { tPtNo q; if (p == NULL) opok = false; else { opok = true; q = p; p = p->prox; free(q); } } d) Obteno do elemento do topo tDado ElementoTopo(tPtNo p) { if (p == NULL) return -9999; else return p->dado; }

http://algol.dcc.ua.br/~heitor/ Projetos/TBC_AED_GRAFOS_ WEB/TBC_AED_GRAFOS_WEB_ arquivos/estruturasEstaticas/ pilha/Pilha.html

e-Tec Brasil

96

Estrutura de Dados

Resumo
Nesta aula vimos que cada novo elemento de uma pilha inserido no topo, e s temos acesso ao elemento do topo da pilha. Logo, os elementos da pilha s podem ser retirados na ordem inversa ordem em que foram introduzidos: o primeiro que sai o ltimo que entrou. Existem duas operaes bsicas que devem ser implementadas em uma estrutura de pilha: a operao para empilhar um novo elemento, o inserido no topo, e a operao para desempilhar um elemento, removendo-o do topo.

Atividade de aprendizagem
Desenvolver em C++ dois programas que implementem as rotinas de pilhas descritas nesta aula: 1) implementao por vetores e 2) implementao por lista encadeada. Desenvolver um menu para as opes possveis de escolha.

Aula 9 Pilhas

97

e-Tec Brasil

Aula 10 Filas
Objetivos
Identicar para uma determinada aplicao quando esta pode ser representada pela estrutura la. Conhecer os principais algoritmos envolvendo manipulao com las. Desenvolver mdulos que realizem operaes com las. Fila uma estrutura de dados bastante usada em computao. O que a diferencia da pilha a ordem de sada dos elementos: enquanto na pilha o ltimo que entra o primeiro que sai, na la o primeiro elemento que entra o primeiro que sai (First In First Out), ou simplesmente FIFO. Sua ideia fundamental que s podemos inserir um novo elemento no nal da la e s podemos retirar o elemento do incio.

10.1 Funcionamento das las


Nessa estrutura o primeiro elemento que foi inserido, dentre os que permanecem, ser o primeiro a ser retirado.

10.2 Representao por contiguidade (array)


const int tmax = 100; typedef oat tDado; //ou outro tipo qualquer typedef struct tFila { int ini,m; tDado elem[tmax]; }; tFila f;

Aula 10 Filas

99

e-Tec Brasil

10.2.1 Principais operaes


a) Inicializao f.ini = 1; f.m = 0; b) Insero do valor V void InsereElem (tFila &f, tDado v, bool &opok) { if (f.m == tmax-1) opok=false; else { opok=true; f.m++; f.elem[f.m]= v; } } c) Retirada (completar o mdulo a seguir...) . . . if (f.m < f.ini) Erro else (f.ini++); . . d) Consulta tDado ConsultaFila (tFila f) { if (f.m < f.ini) return -9999; else return(f.elem[f.ini]); }

e-Tec Brasil

100

Estrutura de Dados

10.3 Representao em C++ por ponteiros


typedef struct tNo { tDado dado; tNo *prox; }; typedef tNo *tPtNo; typedef struct tDscr // descritor { tPtNo ini; tPtNo m; }; tDscr f;

10.3.1 Principais operaes


a) Inicializao f.ini = NULL; f.m = NULL; b) Insero do valor V void InsereFl (tDscr &f, tDado v) { tPtNo q; q = new tNo; q->dado = v; q->prox = NULL; if (f.ini == NULL) //la vazia f.ini = q; else { f.m->prox = q; f.m = q; } }

Aula 10 Filas

101

e-Tec Brasil

c) Retirada void RetiraFl (tDscr &f, bool &opok) { if (f.ini == NULL) opok = false; else { opok = true; q = f.ini; f.ini = f.ini->prox; free(q); if (f.ini == NULL) f.m = NULL; } } d) Consulta tDado ConsultFl (tDscr f) { if (f.ini == NULL) return -9999; else return f.ini->dado; }

10.4 Filas circulares


Implementando-se las por contiguidade, ocorrer a seguinte situao, aps vrias inseres e retiradas:

e-Tec Brasil

102

Estrutura de Dados

Aps quatro inseres... Elem


5 6 2 3

mais duas retiradas... Elem


2 3

mais quatro inseres... Elem


2 3 9 0 4 1

mais duas retiradas... Elem mais uma inseres... Elem


9 0 4 1 7 9 0 4 1

Figura 10.1: Sequncia de sucessivas inseres e retiradas em uma la contgua


Fonte: Elaborada pela autora

Na situao nal (Figura 10.1), o array ainda tem espao; contudo, o algoritmo descrito anteriormente testar se f.m == tmax-1, o que resultar TRUE, e no seria possvel inserir outro elemento. Como a la tem esse comportamento tpico de se deslocar para o nal do array, alguma medida deve ser tomada para aproveitar o espao que est efetivamente disponvel. Uma soluo quando o m for atingido, vericar se possvel deslocar os elementos para o incio (exerccio). Outra soluo (mais empregada): Fila circular. Poderamos imaginar a la na situao anterior da seguinte maneira, de acordo com a Figura 10.2.

Aula 10 Filas

103

e-Tec Brasil

TMax-1 7 1 4 0 9

Elem

0 1 2 ...

Figura 10.2: Arranjo esquemtico da memria de uma la circular


Fonte: Elaborada pela autora

Dessa forma, possvel continuar inserindo elementos no m da la empregando-se a casa 0 e as seguintes. Ou seja: Quando m == tmax-1, ele passar ao valor 0 (e no m + 1) Quando ini == tmax-1, ele passar ao valor 0 (e no ini + 1) Isso se obtm com as seguintes expresses: m = (m+1) % tmax ini = (ini+1) % tmax

Resumo
Nesta aula estudamos a estruturas de dados denominadas de la. Vimos duas estratgias para a implementao de uma la: utilizando-se de um vetor ou de uma lista encadeada. Para a implementao de uma la, estudamos que devemos inserir os novos elementos em uma extremidade, o m, e retirar elementos da outra extremidade, o incio.

Aprofunde seus estudos no site: http://www.ic.unicamp. br/~rezende/Astral.htm Tutorial sobre as estrutura de dados estudada nesta aula: http://www. tutorialdeestruturadedados.8m. com

Atividades de aprendizagem
Adaptar as rotinas de las realizadas por contiguidade (insero, retirada e consulta) localizadas na seo 10.2.1, para la circular.

e-Tec Brasil

104

Estrutura de Dados

Referncias
CELES, Waldemar; CERQUEIRA, Renato; RANGEL, Jos Lucas. Introduo estrutura de dados: com tcnicas de programao em C. Rio de Janeiro: Editora Campus, 2004. 295p. FERREIRA, Benedito de Jesus Pinheiro. Pgina eletrnica sobre estrutura de dados. Disponvel em: <http://www.cultura.ufpa.br/ferreira/>. Acesso em: 20 abr.2011. PEREIRA, Silvio do Lago. Estrutura de dados fundamentais: conceitos e aplicaes. So Paulo: rica, 2006. SALVETTI, Dirceu Douglas; BARBOSA, Lisbete Madsen. Algoritmos. So Paulo: Makron Books, 1998. VILAS, Marcos Viana. Estrutura de dados: conceitos e tcnicas de implementao. Rio de Janeiro: Campus, 1985. VELOSO, Paulo; SANTOS, Clesio Saraiva dos; AZEREDO, Paulo; FURTADO, Antonio Luz. Estruturas de dados. Rio de Janeiro: Campus, 1984. 228 p.

Referncias

105

e-Tec Brasil

Currculo da professora-autora
Graduada em Tecnologia de Processamento de Dados. Especialista em Anlise de Sistemas. Mestre em Anlise Experimental do Comportamento. Doutoranda em Educao Novas Tecnologias Educacionais pela PUC/SP. Professora do Curso de Informtica no Instituto Federal de Educao, Cincia e Tecnologia do Par. Tem experincia na rea de Cincia da Computao, com nfase em desenvolvimento de sistemas e informtica aplicada Educao. Atua com os seguintes temas: formao de recursos humanos para informtica na educao; ambientes virtuais e comunidades de aprendizagem; softwares educacionais para o ensino de programao.

e-Tec Brasil

106

Estrutura de Dados

ISBN: