capítulo 1 introdução A representação dos valores manipulados por uma aplicação pode ser feita por diferentes estruturas de dados. As principais linguagens de programação oferecem um elenco de tipos primitivos, como inteiro (para valores inteiros), real (para valores fracionários), lógico (para valores booleanos) e caractere (para representar caracteres). Oferecem, ainda, alguns tipos estruturados para representar conjuntos de valores, como arranjos (também denominados de vetores e matrizes), registros, conjuntos e seqüências. ■ ■ 30 Estruturas de Dados Entretanto, os tipos estruturados presentes nas linguagens de programação têm grandes limitações quando se quer representar estruturas de dados mais complexas, que envolvem diferentes tipos e associações entre eles. Para tornar os programas mais eficientes, surgiu a necessidade de serem definidas estruturas de dados mais apropriadas, com a definição de operações eficientes para cada uma delas. Neste livro são analisadas duas estruturas de dados que, embora muito comuns em programas de aplicação, não são fornecidas diretamente pelas linguagens de programação: listas lineares e árvores. Elas são compostas por conjuntos de elementos onde são armazenadas as informações, denominados nodos. O que as diferencia entre si é o relacionamento lógico entre estes nodos: nas listas lineares o relacionamento é de ordem; nas árvores, existe um relacionamento de subordinação. Para cada uma destas estruturas serão analisadas formas de organizar os dados, como armazenar fisicamente a estrutura, e algoritmos que implementam as principais operações para sua manipulação. O objetivo deste livro é servir como apoio a disciplinas de Estruturas de Dados em cursos de graduação em Ciência da Computação. Não se pretende, de modo algum, esgotar a análise destas estruturas de dados. Para um estudo mais aprofundado dos assuntos apresentados o leitor deve consultar as leituras recomendadas. É importante ressaltar que é considerada somente a representação de informações em memória principal. Técnicas de armazenamento em memória secundária são tratadas em outra(s) disciplina(s), como Organização de Arquivos. Capítulo 1 1.1 Introdução 31 pré-requisitos Para acompanhar este livro são necessários os seguintes conhecimentos prévios: ■ ■ ■ programação básica, utilizando alguma linguagem de programação procedimental (Pascal, C, Fortran, …); além da utilização de variáveis simples, o conhecimento de estruturas presentes nas linguagens de programação, como arranjos e registros; utilização de ponteiros e de alocação dinâmica de variáveis. 1.2 estrutura do texto Os demais capítulos deste livro estão estruturados como segue. No capítulo 2 são brevemente apresentados alguns conceitos básicos, necessários para o desenvolvimento do restante do texto. Inicialmente é visto o conceito de Tipos Abstratos de Dados, utilizado em linguagens de programação e como uma das bases para as estruturas estudadas a seguir. Todos os algoritmos apresentados utilizam este conceito, o que facilita a sua implementação. Em seguida são analisadas duas formas para armazenar fisicamente as estruturas vistas a seguir. Em cada uma delas serão analisadas estas duas formas de armazenamento físico. A partir do capítulo seguinte são detalhadas duas estruturas de dados que têm larga utilização em problemas de aplicação. São analisadas as diferentes formas de armazenamento físico e as operações básicas que podem ser executadas sobre elas, com apresentação dos algoritmos correspondentes. O capítulo 3 detalha a estrutura particular denominada Lista Linear. Filas e pilhas, tipos particulares de listas com limitações na disciplina de acesso, são analisadas no capítulo 4. O capítulo 5 introduz a estrutura denominada árvore. Um tipo particular denominado árvore binária é detalhado no capítulo 6. Árvores Binárias de Pesquisa e árvores AVL, tipos especiais de árvores binárias, são também analisadas neste capítulo. 32 Estruturas de Dados No final de cada capítulo é apresentada uma lista de exercícios sugeridos, agrupados por assunto, finalizando com algumas aplicações. Todos os algoritmos ao longo do texto são escritos na pseudolinguagem apresentada no Anexo. Finalmente, as leituras recomendadas reúnem alguns livros disponíveis no Brasil, que podem complementar os conceitos aqui apresentados. Selecionamos somente livros em português, com exceção de três (Aho 1983, Knuth 1968 e Knuth 1973) que influenciaram a maior parte das pesquisas em estruturas de dados realizadas ao longo dos últimos anos.