Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
Estrutura
DE DADOS
unidade
2
Estrutura de Dados - II
Prezado estudante,
Estamos começando uma unidade desta disciplina. Os textos que a compõem foram organizados com
cuidado e atenção, para que você tenha contato com um conteúdo completo e atualizado tanto quanto
possível. Leia com dedicação, realize as atividades e tire suas dúvidas com os tutores. Dessa forma,
você, com certeza, alcançará os objetivos propostos para essa disciplina.
OBJETIVO GERAL
• Compreensão da importância da aplicação da Estrutura de dados, apresentação dos
tipos de dados, uso de listas, listas sequenciais, encadeadas e dinâmicas
OBJETIVOS ESPECÍFICOS
• Identificar uma estrutura de dados.
• Reconhecer dados heterogêneos e homogêneos.
• Aplicar dados homogêneos (vetores e matrizes) e ponteiros.
• Identificar os softwares em camadas
• Compreender estrutura de dados
• Aplicar o uso de Pré e Pós condições
• Identificar o que é um Tipo Abstrato de Dados (TAD)
• Descrever como é criado um TAD.
• Reconhecer a criação de um TAD - Conjunto
• Reconhecer um TAD do tipo lista
• Descrever os elementos de uma lista
• Compor listas estáticas
• Identificar o funcionamento de uma lista (inserção, remoção, atualização e consulta
em qualquer ponto da lista).
OBJETIVOS ESPECÍFICOS
• Reconhecer como funcionam funções e procedimentos de uma lista (inserção,
remoção, atualização e consulta).
• Aplicar o uso de listas
• Identificar formas de armazenamento em uma lista
2
Parte 1
Estrutura de Dados
Estrutura de dados
Objetivos de aprendizagem
Ao final deste capítulo, você deve apresentar os seguintes aprendizados:
Introdução
Para o profissional da área da Ciência da Computação, é importante
conhecer a forma como os dados são armazenados, organizados e mani-
pulados, pois essa atividade é uma das principais que são desenvolvidas
pelos sistemas computacionais.
Nesse sentido, a estrutura de dados é um elemento que vem, princi-
palmente na linguagem de programação C, para auxiliar na representação
e na abstração de estruturas mais complexas, executando operações
de armazenamento e busca de dados na memória, de maneira mais
sofisticada e robusta.
Neste capítulo, você vai estudar sobre estrutura de dados e dados
heterogêneos e homogêneos e sobre a aplicação de dados homogêneos,
como vetores e matrizes, e ponteiros.
A estrutura de dados
A área da Ciência da Computação trata diretamente com o armazenamento,
a organização, a manipulação e a utilização de dados e informações, por
isso, é importante entender como isso acontece. Estudar estruturas de dados,
principalmente na linguagem C, envolve (TENENBAUM; LANGSAM; AU-
GENSTEIN, 1995):
Estrutura de Dados - II UNIDADE 2
22 Estrutura de dados Estrutura de dados PARTE 1 83
A utilização de uma estrutura de dados serve, via de regra, para que os dados
que são vistos na vida real possam ser armazenados pelo computador, daí o
seu grau de abstração. As estruturas de dados envolvem o armazenamento de
dados organizados na memória de uma maneira mais sofisticada do que pela
utilização de variáveis básicas usadas em algoritmos simples. Quando se deseja
representar dados de forma direta, a referência a eles é feita normalmente por
meio de variáveis, mas quando se utiliza uma estrutura de dados, a referência
aos dados é feita normalmente por índices.
A representação das cartas pode ser feita por dois valores do tipo ca-
ractere, que são o naipe e o valor da carta.
As operações que podem ser feitas com as cartas são:
a) embaralhar todas as cartas;
b) comprar uma carta do topo do baralho;
c) retirar uma carta de um lugar qualquer do meio do baralho;
d) inserir uma carta na base do baralho.
struct nome_da_estrutura {
tipo_do_campo1 nome_do_campo1;
tipo_do_campo2 nome_do_campo2;
tipo_do_campo3 nome_do_campo3;
...
};
struct boletim (
char nome_do_aluno(50);
char nome_disciplina(50);
int qtd_faltas;
float nota1;
float nota2;
float nota_exame;
);
86
Estrutura de dados 25
nome_da_estrutura[índice].nome_do_campo;
Por sua vez, uma estrutura de dados que armazena somente um tipo de dado
é conhecida, então, como dados homogêneos. Os elementos que compõem
uma estrutura de dados homogênea correspondem às posições de memória,
as quais são identificadas por meio de um mesmo nome, individualizadas por
índices que são todos dos mesmos tipos de dados. Os dados homogêneos são
representados pelos vetores, ou estruturas de dados unidimensionais, e pelas
matrizes, que são estruturas de dados bidimensionais (LAUREANO, 2008).
Vetores
Os vetores são estruturas de dados unidimensionais lineares e, por isso, pre-
cisam de um único índice para fazer o endereçamento e para percorrer toda
a estrutura. Um vetor é uma estrutura de dados utilizada para fazer o arma-
zenamento de uma lista de valores do mesmo tipo, ou seja, em uma mesma
variável, vários valores de mesmo tipo são armazenados.
Quando um vetor é definido, é declarada uma quantidade fixa de posições
que ele deve ter, ou seja, um vetor é um elemento que será dividido em várias
posições que serão entendidas e reconhecidas pelo computador. Cada uma
dessas posições vai ser responsável por armazenar um único valor do vetor e
cada uma delas será reconhecida por um índice, ou endereço, e será por ele que
essa posição será encontrada e poderá ser referenciada. Logo, apesar de essa
estrutura ser de somente um tipo de dado, ela terá vários valores diferentes
do mesmo tipo.
Uma estrutura de dados do tipo vetor tem as seguintes características
(DEITEL; DEITEL, 2011):
tipo_de_dado nome_do_vetor[quantidade_de_posicoes_do_vetor]
Em C:
float nota[5];
nota[0] = 9.5;
nota[1] = 7.4;
nota[2] = 8.1;
nota[3] = 4.6;
nota[4] = 4.5;
Matrizes
As matrizes são estruturas de dados bidimensionais, os quais precisam de dois
índices para fazer o endereçamento e para percorrer toda a estrutura: um que
servirá para referenciar a linha e outro que servirá para referenciar a coluna
da matriz (TENENBAUM; LANGSAM; AUGENSTEIN, 1995).
Estrutura de Dados - II UNIDADE 2
28 Estrutura de dados Estrutura de dados PARTE 1 89
Uma matriz envolve dois ou mais vetores, os quais são definidos por um
conjunto de elementos, ou seja, cada dimensão da matriz é formada por um
vetor. A primeira dimensão de elementos é considerada o primeiro vetor, a
segunda é considerada o segundo vetor, a terceira dimensão de elementos é
considerada o terceiro vetor, e assim por diante.
A sintaxe para a definição da matriz acima seria:
tipo_de_dado
nome_da_matriz[quantidade_de_linhas][quantidade_de_colunas]
90 Estrutura de dados 29
Em C:
char letras[3][6];
letras[0][0] = “M”;
letras[0][1] = “A”;
letras[0][2] = “R”;
letras[0][3] = “C”;
letras[0][4] = “O”;
letras[0][5] = “S”;
letras[1][0] = “N”;
letras[1][1] = “A”;
letras[1][2] = “S”;
letras[1][3] = “S”;
letras[1][4] = “E”;
letras[1][5] = “R”;
letras[2][0] = “D”;
letras[2][1] = “O”;
letras[2][2] = “N”;
letras[2][3] = “A”;
letras[2][4] = “L”;
letras[2][5] = “D”;
Estrutura de dados 31
Como a matriz é formada de vários vetores, mas tem mais de uma dimensão,
uma das melhores maneiras de inserir elementos em uma matriz é utilizar
laços de for encadeados, nos quais um faz a varredura nas posições da linha e
outro faz a varredura nas posições da coluna. Entre as linhas 11 e 16, o código
faz a inserção de valores nas posições da matriz.
Logo a seguir, nas linhas 18 a 24, são utilizados laços de for encadeados,
novamente, para fazer a exibição do valor contido em cada uma das posições
da matriz.
Finalizando, entre as linhas 26 e 34 está o código utilizado para verificar
qual é o maior elemento da matriz. Dessa forma, novamente são utilizados
laços de for encadeados, mas, para isso, é feito um teste para cada um dos
valores das posições para verificar se estes são maiores do que uma variável,
a qual foi inicializada com 0, mas recebe um valor maior, caso seja encontrado
(Figura 5).
94
Estrutura de dados 33
Ponteiros
Um ponteiro é um tipo de dado que se diferencia de uma variável, no sentido
de que a variável faz uma referência direta a um valor. Já o ponteiro faz uma
referência indireta a um valor. Quando se faz a modificação do valor de um
ponteiro, está sendo modificado o valor da variável para a qual o ponteiro está
apontando. Em outras palavras, o ponteiro é um tipo de dado que permite
referenciar a posição de um objeto na memória, mas também o próprio objeto
(DEITEL; DEITEL, 2011).
Quando se trabalha com ponteiros, o operador unário * é utilizado para
acessar o conteúdo da variável para o qual o ponteiro está apontando, enquanto
o operador unário & é utilizado para acessar o endereço da variável para o
qual o ponteiro está apontando.
É importante lembrar que cada ponteiro deve ser declarado conforme o
tipo de dado da variável para a qual ele vai apontar e que a declaração de um
ponteiro é feita ao colocar um * na frente da variável:
Estrutura de Dados - II UNIDADE 2
34 Estrutura de dados Estrutura de dados PARTE 1 95
DEITEL, P. J.; DEITEL, H. M. Como programar em C. 6. ed. São Paulo: Pearson, 2011.
LAUREANO, M. Estrutura de dados com algoritmos e C. São Paulo: Brasport, 2008.
TENENBAUM, A. A.; LANGSAM, Y.; AUGENSTEIN, M. J. Estruturas de dados usando C.
São Paulo: Makron Books, 1995.
PREZADO ESTUDANTE
2
Parte 2
Introdução
Na área da ciência da computação, os tipos de dados e as estruturas de
dados são utilizados pelos programas para armazenar informações por
meio de operações específicas escritas em linguagem de programação.
Para quem desenvolve programas de computação, é muito mais simples
quando se pode trabalhar com as estruturas de dados por meio das
operações que elas podem executar, e não com a maneira como elas
são implementadas. Quando isso é possível, fica configurado um tipo
abstrato de dados (TAD).
Neste capítulo, você estudará o que é TAD, como fazer a sua criação
e como fazer a criação de um TAD conjunto.
Além das características dos TAD, podem ser identificadas algumas van-
tagens na sua utilização, conforme você pode ver a seguir (VAREJÃO, 2015).
O TAD nada mais é do que um conjunto de valores que tem o seu com-
portamento definido por meio de operações que são implementadas em forma
de funções. Um TAD é construído a partir de tipos básicos de dados, como
o char, o int e o double, mas também pode ser construído a partir de tipos
estruturados, como o array, o struct e o union.
Nesse sentido, os TAD são elementos teóricos, que são usados para sim-
plificar a maneira de descrever algoritmos sobre coisas abstratas, pois, para
que um TAD seja criado, é fundamental que alguns dados sejam ocultados do
programador, como a sua implementação, que deve ser totalmente invisível.
Dessa forma, o TAD funciona como uma espécie de caixa-preta para o
programador, que jamais tem acesso direto às informações que se encontram
armazenadas nele, uma vez que a sua implementação se encontra desconectada
da sua utilização, pois, novamente, quando se define um TAD, a preocupação é
com o que ele é capaz de fazer, e não com a maneira como as coisas são feitas.
Um TAD especifica tudo o que é necessário saber sobre um tipo de dado
específico, mas não faz referência à forma como ele foi implementado, mas
às operações possíveis para as quais ele possa ser utilizado.
Os sistemas que utilizam TAD ficam divididos em programas que utilizam
o TAD, chamados de clientes ou interfaces, e programas que definem a sua
Estrutura de Dados - II UNIDADE 2
4 Tipos abstratos de dados Tipos Abstratos de Dados 1 PARTE 2 103
TAD
Operações
Criar
Destruir
Programa do
Dados
Usuário
Atualizar
Consultar
Esses dois arquivos devem ter o mesmo nome, o que vai mudar entre eles
é somente a extensão, que será .H ou .C. Dessa maneira, é feita a separação
entre a parte da definição do TAD e a parte que faz a implementação dele.
Para entender melhor como é feita a criação de um TAD, podemos usar
o exemplo de um TAD para transações em contas correntes bancárias. Para
que esse exemplo seja implementado, é necessário dividir o código em três
programas: o primeiro funcionará como o programa principal, o segundo
conterá os protótipos das funções e o terceiro conterá a declaração das funções.
Os códigos dos programas do exemplo são apresentados a seguir.
2
Parte 3
Introdução
Neste capítulo, você vai estudar e compreender sobre as principais estru-
turas de dados, estas que são de extrema importância para o desenvol-
vimento de sistemas (software). Se bem utilizadas, as estruturas auxiliam
na otimização e na organização dos dados, para que estes possam ser
utilizados eficientemente. Além de compreender as estruturas de dados,
veremos também como podemos dividi-los em diferentes camadas,
fazendo com que o código continue legível em longo prazo.
Vamos imaginar o desenvolvimento de um sistema de médio porte
hoje. Será que daqui a 10 anos você se lembrará o que ou como desen-
volveu/programou algo feito 10 anos atrás? Por esse e outros motivos
que precisamos entender e compreender o conceito sobre estrutura
de dados e, de certa forma, saber desenvolver e identificar um software
separado em camadas.
Os tipos de dados
Para criar variáveis, as linguagens oferecem uma série de tipos de dados, que
costumam ser bastante parecidas, apesar de variarem em pequenos detalhes
ou intervalos. Em resumo, podemos separar os dados em números inteiros,
números reais, caracteres ou valores lógicos (verdadeiro ou falso).
122 ESTRUTURA DE DADOS
Tipos abstratos de dados 5
quanto liberar a memória. Utilizamos esse tipo de alocação quando não temos
como prever a quantidade de dados que serão manipulados pelo programa.
Por exemplo, imaginemos que estamos desenvolvendo um programa que
coletará as respostas de uma pesquisa e o pesquisador não sabe quantas pes-
soas ele conseguirá entrevistar no dia. Então, para cada nova resposta que
precisarmos armazenar, alocamos um novo espaço na memória.
As estruturas de dados
Podemos separar os tipos de dados manipulados pelos softwares em dois
grupos: atômicos ou compostos.
Um dado atômico é aquele que podemos considerar indivisível, ou seja,
que não podemos separar em partes. Exemplos: a idade de uma pessoa e o
percentual de desconto. Já os dados compostos são aqueles que são formados
por um conjunto de dados atômicos, como, por exemplo, uma data, que é
composta por dia, mês e ano.
Para manipular os dados compostos, temos as estruturas de dados, que
consistem em relacionar, logicamente, um conjunto de dados, com o objetivo
de resolver problemas com maior rapidez e produtividade e com melhor de-
sempenho. Vamos conhecer as principais estruturas de dados a seguir.
Vetores
Um vetor é uma estrutura de dados unidimensional que armazena uma de-
terminada quantidade de dados de um mesmo tipo e em uma mesma variável
de forma sequencial. Essa variável é organizada em índices que servem para
endereçar os dados. Cada índice aponta para uma posição no vetor, e cada
posição consegue armazenar um único dado.
No ato da declaração de um vetor, deve ser especificado o tipo de dado e a
quantidade de índices que ele conterá. Por exemplo, se declararmos um vetor
do tipo int com 5 posições chamado de valores, conseguimos armazenar nele 5
valores diferentes do tipo inteiro, cada um em uma posição. A alocação de um
vetor é estática, ou seja, na execução do programa será reservado, na memória,
um espaço para a quantidade de dados que definirmos, mesmo que nem todas
as posições sejam utilizadas. A Figura 1 mostra a representação de um vetor.
124 ESTRUTURA DE DADOS
Tipos abstratos de dados 7
Matrizes
Uma matriz é uma estrutura de dados bidimensional que utiliza dois tipos de
índices, um para indicar a linha e outro para indicar a coluna. Ao criar uma
matriz, precisamos indicar quantas linhas e quantas colunas ela terá, bem
como o tipo de dado que ela armazenará. Em C, as matrizes são de alocação
estática e sequencial.
Algumas linguagens oferecem vetores e matrizes com alocação dinâmica, como, por
exemplo, a linguagem PHP. Cada vez que estivermos trabalhando com uma linguagem
diferente, precisamos entender os recursos que ela oferece e como manipular cada
um destes.
Filas
A fila é uma estrutura de dados de alocação dinâmica que permite armazenar
dados utilizando a regra FIFO. A sigla FIFO significa que o primeiro elemento
que entrará na fila será o primeiro a sair (em inglês, first in first out). Mas o
que isso quer dizer? Vamos pensar em uma fila de um banco. Sempre teremos
pessoas entrando na fila e essas pessoas entram no final dela, o que faz com
que ela aumente, no entanto, as pessoas, ao serem atendidas, estão saindo no
início da fila. A fila de um banco é uma fila do tipo FIFO.
Estrutura de Dados - II UNIDADE 2
8 Tipos abstratos de dados Tipos Abstratos de Dados 2 PARTE 3 125
Pilha
A pilha também é um tipo de estrutura de dados de alocação dinâmica, porém,
do tipo LIFO. A sigla LIFO significa que o último elemento que entrará na
fila será o primeiro a sair (em inglês, last in last out).
Vamos pensar em um aplicativo. A maioria deles tem muitas telas, ou seja,
as telas são empilhadas. Quando entramos na tela inicial de um aplicativo,
como, por exemplo, o WhatsApp, temos a tela de conversas. Agora vamos
pensar em abrir uma conversa e o que acontece? O app acaba de empilhar duas
telas, ou seja, a tela inicial, mais a tela da conversa selecionada. Quando você
pressiona o botão de sair ou fechar, a última tela aberta é a tela que será fechada.
Lista
A lista é uma estrutura linear na qual a posição atual aponta para o próximo
elemento da lista e sempre o último elemento apontará para nulo, indicando
que não há mais nenhum elemento na lista.
Há dois tipos de lista: a linear encadeada e a duplamente encadeada. Na
primeira, só é possível percorrer do início ao fim, enquanto na segunda é
possível percorrer para frente e para trás.
Árvores
As árvores são um pouco mais complexas do que filas, pilhas e listas. Esse tipo
de estrutura tem um conceito diferente das demais estruturas, isso porque os
dados serão dispostos em árvore de forma hierárquica, tendo cada elemento
um ou mais elementos associados.
Para começar a entender árvore, vamos tentar imaginar alguns exemplos.
Imagine uma empresa e sua estrutura de funcionários e cargos dispostos em
um organograma. Um organograma é uma representação de uma árvore, em
que nós teremos, conforme a Figura 2.
126 ESTRUTURA DE DADOS
Tipos abstratos de dados 9
Grafos
Os grafos se baseiam em dois conjuntos de dados, um conjunto em que são
armazenados os vértices, outro conjunto de arcos e uma função que associa os
pares de vértices. Esses conjuntos servem, basicamente, para percorrer uma
árvore, conforme visto anteriormente. A árvore tem raiz e pode ter filhos e
mais filhos, ou seja, pode ser uma estrutura complexa para percorrer.
Vamos imaginar um exemplo prático para entender uma estrutura de grafo.
Pense o seguinte: você está em casa e precisa sair para ir até o centro de sua
cidade. Quantas rotas você pode escolher? Com certeza mais de uma, certo?
Estrutura de Dados - II UNIDADE 2
10 Tipos abstratos de dados Tipos Abstratos de Dados 2 PARTE 3 127
Pré e pós-condições
Para manipular estruturas de dados, criamos métodos e rotinas, as quais
necessitam de pré e pós-condições. Estas permitem que o desenvolvedor
indique o que o método ou a rotina devem realizar.
Pré-condição
A pré-condição é tudo, por exemplo, que vai anteceder a execução de algum
algoritmo. Indica o que deve ser verdadeiro quando a rotina ou o método forem
acionados, como por exemplo:
Para realizar a divisão de dois números, precisamos ter dois números, o valor e o
divisor, ou seja, a pré-condição é receber os dois números e o divisor não pode ser 0.
Vamos observar o trecho de código abaixo:
Para que essa função funcione como pré-condição, ela deve receber dois números,
sendo que o segundo não pode ser 0. Caso um deles não seja informado ao acionar
a função, não será possível executar seu comando.
Assim, para acionar a função acima, utiliza-se seu nome e entre parênteses devemos
informar o valor correspondente a valor e o valor correspondente a divisor:
Pós-condição
A pós-condição é tudo que vai acontecer após a execução de algum algoritmo,
como, por exemplo, após somar os dois números, a função será responsável
por retornar a soma deles.
Vamos observar o trecho de código abaixo:
resultado = somarNumeros(7,3);
https://goo.gl/SkeTDt
Vamos imaginar que estamos em um caixa eletrônico. Nele, temos várias opções, sendo
que cada uma delas será executada por uma ou mais funções, como, por exemplo:
função de sacar;
função de depositar;
função de transferir.
Estrutura de Dados - II UNIDADE 2
Tipos Abstratos de Dados 2 PARTE 3 129
12 Tipos abstratos de dados
Para que a função de sacar funcione, ela necessita de condições, tais como:
Pré-condições:
a função necessita receber uma quantia para poder efetuar o saque da conta,
devendo ser um valor inteiro e positivo;
a função necessita verificar se a conta tem no mínimo a quantia solicitada para
o saque.
Pós-condições:
a função deve separar a quantia desejada para o cliente;
a função deve emitir um comprovante eletrônico ou impresso para o cliente.
Referência
Leituras recomendadas
BACKES, A. R. Estrutura de dados descomplicada: em linguagem C. Rio de Janeiro:
Elsevier, 2016.
BARANAUSKAS, J. A. Pré-condições e pós-condições. [2010?]. Algoritmos e Estruturas
de Dados I. Disponível em: <http://dcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-
-I-Pre-Pos-Condicoes.pdf>. Acesso em: 19 mar. 2018.
FARIAS, R. Filas – Queue. 2009. Disponível em: <http://www.cos.ufrj.br/~rfarias/cos121/
filas.html>. Acesso em: 19 mar. 2018.
FARIAS, R. Pilhas – Stack. 2009. Disponível em: <http://www.cos.ufrj.br/~rfarias/cos121/
pilhas.html>. Acesso em: 19 mar. 2018.
FEOFILOFF, P. O que é um grafo? 2017. Disponível em: <https://www.ime.usp.br/~pf/
algoritmos_em_grafos/aulas/grafos.html>. Acesso em: 19 mar. 2018.
LAUREANO, M. A. P. Estrutura de dados com algoritmos e C. Rio de Janeiro: Brasport, 2008.
PREZADO ESTUDANTE
2
Parte 4
Listas
Listas
Objetivos de aprendizagem
Ao final deste texto, você deve apresentar os seguintes aprendizados:
Introdução
Relacionar itens em listas é uma atividade comum no dia a dia de mui-
tas pessoas, seja para auxiliá-las em diversas atividades, como comprar
presentes de natal, construir uma relação de tarefas a serem executadas
ou até para definir os presentes de casamento. Na estrutura de dados,
as listas apresentam formas adequadas para automatizar processos do
mundo real, de acordo com a necessidade ou o objetivo da situação,
sem deixar de atender às características que definem os requisitos de
sua manipulação.
Neste capítulo, você estudará sobre o tipo abstrato de dados (TAD)
do tipo lista, descreverá e construirá lista s estáticas.
Na linguagem C, uma estrutura TAD pode ser criada por meio da instrução
struct.
Listas 3
inclusão exclusão
i i
1 2 3 4 1 2 3 4 5
a e o u a e i o u
1 2 3 4 5 1 2 3 4
a e i o u a e o u
Uma lista estática do tipo TAD é determinada por uma quantidade limitada de itens,
geralmente implementada por meio de um array de elementos de uma estrutura
abstrata. Apesar de receber e perder itens, seu tamanho máximo é definido na sua
criação, por isso, se caracteriza como estática.
Uma lista estática do tipo TAD pode ser composta de dois elementos. O
primeiro é conhecido como dado e define um array da estrutura, por exemplo,
dado[MAX] que contém o nome, a nota e a turma de Aluno. Já o segundo
elemento, nomeado de n, é um contador que armazena o total de itens da lista
em tempo de execução.
1 2 3 4 5
Turma 1 2 1 3 3
Uma lista estática é mais genérica que filas e pilhas, porque não existe uma definição
de ordem de entrada ou retirada de elementos. Isso significa que esses itens podem
ser inseridos e excluídos de qualquer posição, desde que ela seja sequencial e não
tenha elementos nulos (EDELWEISS; GALANTE, 2009).
Uma lista pode ser criada/inicializada quando o seu contador for definido como
zero, sem elementos, estando vazia e pronta para receber seus primeiros itens.
O algoritmo a seguir apresenta o pseudocódigo dessa função.
Estrutura de Dados - II UNIDADE 2
6 Listas Listas PARTE 4 137
Uma lista está vazia quando o seu contador de elementos for igual a zero. O
pseudocódigo que ilustra o algoritmo dessa função será mostrado a seguir.
Verificar se a lista está cheia é uma das funções mais importantes, uma vez
que ela não pode permitir mais elementos que a quantidade máxima prevista.
Para identificar isso, compara-se o seu contador de itens com a constante que
define o número máximo de elementos, conforme é descrito neste algoritmo:
A função que insere um novo elemento na lista deve receber três parâme-
tros: a lista que irá recebê-lo, a posição em que ele será inserido e o valor que
deverá ser armazenado.
Arquivo lista.h
Esse arquivo define o número máximo de elementos da lista, a estrutura TAD
do aluno, o array que vai armazenar os dados desses alunos em cada posição
e os protótipos das funções de acesso a ela.
Estrutura de Dados - II UNIDADE 2
10 Listas Listas PARTE 4 141
Arquivo lista.c
Esse arquivo contém a implementação das funções de acesso à lista. Ele requer
a inclusão do arquivo lista.h que, por sua vez, inclui os protótipos das funções,
bem como a sua estrutura de definição.
142 ESTRUTURA DE DADOS Listas 11
Arquivo hello.c
Esse arquivo contém o módulo principal do exemplo, porque nele é realizada
a declaração do array da estrutura TAD Aluno e as chamadas das respectivas
funções de acesso à lista. Para acessar os métodos da lista, bem como a sua
estrutura, é preciso realizar a inclusão do arquivo lista.c.
Já para testar a inclusão de elementos na lista, deve-se criar uma função,
chamada “instancia”, que irá preparar os dados de entrada, tendo como pa-
râmetros as informações do aluno: nome, nota e turma.
Estrutura de Dados - II UNIDADE 2
12 Listas Listas PARTE 4 143
Listas 13
CELES, W.; CERQUEIRA, R.; RANGEL, J. L. Introdução a estrutura de dados. São Paulo:
Campus, 2004.
EDELWEISS, N.; GALANTE, R. Estrutura de dados. Porto Alegre: Bookman, 2009. (Série
Livros Didáticos Informática UFRGS, v. 18).
FORBELLONE, A. L. Lógica de programação: a construção de algoritmos e estruturas
de dados. 3. ed. São Paulo: Pearson, 2005.
MATTOS, P.; LORENZI, F.; CARVALHO, T. Estruturas de dados. São Paulo: Thomson, 2007.
PREZADO ESTUDANTE
2
Parte 5
Listas Sequenciais
Listas sequenciais
Objetivos de aprendizagem
Ao final da leitura deste capítulo, você deverá apresentar os seguintes
aprendizados:
Introdução
As listas sequenciais são estruturas que servem para armazenar elementos
de maneira relacionada e lógica, ficando estes dispostos um depois do
outro, por isso o nome sequencial dado a ela. Na literatura, encontramos as
listas sequenciais referenciadas também por listas lineares, listas estáticas
lineares ou listas estáticas sequenciais. A sua aplicação é mais adequada
para os casos em que o conjunto de dados é pequeno e bem definido
e para quando for possível fazer as operações de inserção e remoção de
elemento no final da lista.
Neste capítulo, você vai estudar o funcionamento de uma lista, reco-
nhecer como funcionam as funções e os procedimentos de uma lista, tais
como a inserção, a remoção, a atualização e a consulta de um elemento,
e também como aplicar as listas sequenciais.
ou linear pode ser chamada também de lista estática linear ou lista estática
sequencial (LAUREANO, 2008).
Quando se trabalha com uma estrutura do tipo lista, é possível saber o
seguinte sobre ela:
Uma lista estática sequencial é mais adequada para os casos em que o con-
junto de elementos é pequeno, quando existe um tamanho bem definido para
a quantidade de elementos da lista, e para quando se deseja fazer a inserção
ou a remoção de elementos no final da lista.
A utilização de uma lista estática sequencial traz como vantagens básicas:
Uma pilha é uma lista sequencial, sendo que o primeiro elemento a entrar
será o último elemento a sair. Essa característica é conhecida também pela
expressão em inglês LIFO (last in first out). A pilha só tem uma entrada, que é
o topo, e é a partir dele que os elementos entram e saem da estrutura (Figura 2).
Para fazer a abstração de uma pilha, imagine uma pilha de pratos, ou uma pilha
de livros, ou ainda uma pilha de cartas de baralho. Fazer a inserção e a remoção
de um elemento pelo topo é uma atividade bem mais prática nessas pilhas.
Estrutura de Dados - II UNIDADE 2
Listas Sequenciais PARTE 5 151
4 Listas sequenciais
0 1 2 3 4
int n
Figura 3. Criação de uma lista sequencial.
0 1 2 3 4
a b c d e
int = 5
Figura 4. Inicialização de uma lista sequencial.
0 1 2 3 4
O uso de listas
As listas sequenciais são utilizadas, preferencialmente, quando é necessário
manipular listas pequenas, quando se pode limitar o seu tamanho e quando
a inserção e a remoção de um elemento puderem ser realizadas utilizando a
última posição.
156 ESTRUTURA DE DADOS
Listas sequenciais 9
DEITEL, P.; DEITEL, H. C: como programar. 6. ed. São Paulo: Pearson Education, 2011.
818 p.
LAUREANO, M. Estrutura de dados com algoritmos e C. São Paulo: Brasport, 2008. 182 p.
LORENZI, F.; MATTOS, P.; CARVALHO, T. Estruturas de dados. São Paulo: Cengage Le-
arning, 2007. 200 p.
NEMEROFF, N. 32ee0c45cd10702651560f31136dcdec.jpg. 12 mar. 2017. Altura: 601 pixels.
Largura: 650 pixels. 51 KB. Formato JPEG. Pngtree. Disponível em: <https://pngtree.
com/freepng/line-up-people_3030246.html>. Acesso em: 2 abr. 2018.
PREZADO ESTUDANTE
2
Parte 6
Listas Encadeadas
Listas encadeadas
Objetivos de aprendizagem
Ao final deste texto, você deve apresentar os seguintes aprendizados:
Introdução
Na estrutura de dados, as listas são, geralmente, utilizadas para relacionar
itens que precisam ser exibidos ou manipulados por meio de estrutu-
ras estáticas ou dinâmicas. Diversas são as atividades que podem ser
realizadas com listas e cada uma delas requer um tipo adequado, de
acordo com os objetivos e funcionalidades da aplicação. Ao conhecer
essas estruturas, um profissional de tecnologia da informação (TI) será
capaz de identificar o uso correto de cada tipo de lista, bem como poderá
apresentar soluções confiáveis e otimizadas para o desenvolvimento de
sistemas.
Neste capítulo, você estudará sobre formas de armazenamento em
lista, listas com encadeamento simples e comparação entre listas enca-
deadas e estáticas.
Lista estática
Uma lista estática é uma relação de itens armazenados em uma estrutura de
tamanho fixo, como um array. Nessa estrutura, a quantidade de elementos é
reservada no momento de sua criação e o seu tamanho não pode ser redimen-
sionado em tempo de execução (DEITEL; DEITEL, 2011).
A alocação de memória de uma lista estática é sequencial, isto é, os itens
estão localizados em posições contínuas da memória, o que permite a busca
de elementos ser realizada diretamente em determinada posição, por meio
de seu índice.
No entanto, por mais que uma lista estática não ocupe todas as posições
definidas na sua criação, os espaços de memória reservados por ela não po-
derão ser ocupados por outra aplicação. Dessa forma, o programa não utiliza
os recursos de memória de maneira eficiente, pois pode reservar mais que o
necessário (MATTOS; LORENZI; CARVALHO, 2007).
A Figura 1 apresenta uma lista que reserva 10 posições na memória, mas
que ocupa apenas as quatro primeiras.
1 2 3 4 5 10
a b c d ...
agilidade nas consultas — acesso direto aos elementos por meio dos
índices do array;
tempo de acesso constante — a velocidade das pesquisas não reduz
com o crescimento da lista.
Lista dinâmica
Uma lista dinâmica realiza a alocação de memória em tempo de execução
para a acomodação de novos itens, isto é, reserva memória apenas quando
precisa aumentar a lista e, quando reduz, libera a memória ocupada. Assim,
o programa utiliza a memória de forma dinâmica, sem ocupar mais espaço
que o necessário (DEITEL; DEITEL, 2011).
Não existe um índice de acesso aos elementos de uma lista dinâmica. A
lista mantém o endereço da posição inicial, sendo necessário percorrer os
itens de forma sequencial para encontrar determinado elemento na relação.
A relação entre os elementos de uma lista dinâmica se dá pelo uso de
ponteiros de memória, ou seja, cada elemento possui um apontador para o
endereço de memória de um ou mais elementos da lista, fazendo ela ficar
ligada, sem ocupar posições contínuas na memória (CELES; CERQUEIRA;
RANGEL, 2004). Observe a representação da Figura 2.
Estrutura de Dados - II UNIDADE 2
Listas Encadeadas PARTE 6 167
4 Listas encadeadas
a b
c d
e f
Listas encadeadas 5
“Não liberar memória alocada dinamicamente quando ela não mais for necessária
pode fazer com que o sistema esgote prematuramente sua memória. Algumas vezes
isso é chamado um vazamento de memória” (DEITEL; DEITEL, 2010, p. 552).
Encadeamento simples
d
a c
b e
Encadeamento duplo
d
a c
b e
&e1
e1
&prox
e1 e2 e3 e4
Por fim, deve-se liberar os recursos de memória alocados. Para isso, você
deve fazer uma varredura na lista e liberar cada elemento por meio da ins-
trução free.
Inserção de item
A inclusão de um elemento em uma lista estática pode fazer alguns elementos
da lista terem que ser reposicionados. Isso provoca deslocando dos elemen-
tos à direita do novo item para abrir espaço para a sua inserção, conforme
demonstrado na Figura 7.
Estrutura de Dados - II UNIDADE 2
Listas Encadeadas PARTE 6 173
10 Listas encadeadas
1 2 3 4 5 6
a b c d e
1 2 3 4 5 6
a b x c d e
d
a c
b e
d
a c
b e
Exclusão de item
Assim como na inclusão de um item em uma lista estática, a exclusão de um
elemento pode fazer alguns itens da lista terem que ser reposicionados. Assim,
ocorre o deslocando dos elementos à direita do item retirado para fechar o
espaço antes ocupado, conforme ilustrado na Figura 9.
1 2 3 4 5 6
a b c d e
1 2 3 4 5 6
a b c d e
d
a c
b e
d
a
b e
Indicação Listas pequenas, com quantidade Listas grandes, sem limite defi-
de uso limitada de itens, cujas inserções/ nido de itens, que tendem a re-
exclusões são raras e ocorrem ceber mais inserções/exclusões
normalmente no final da lista. de elementos.
176 ESTRUTURA DE DADOS
Listas encadeadas 13
CELES, W.; CERQUEIRA, R.; RANGEL, J. L. Introdução a estrutura de dados. São Paulo:
Campus, 2004.
DEITEL, P. J.; DEITEL, H. M. C: como programar. 6. ed. Rio de Janeiro: Pearson, 2011.
EDELWEISS, N.; GALANTE, R. Estrutura de dados. Porto Alegre: Bookman, 2009. (Série
Livros Didáticos Informática UFRGS, v. 18).
FORBELLONE, A. L. Lógica de programação: a construção de algoritmos e estruturas
de dados. 3. ed. São Paulo: Pearson, 2005.
MATTOS, P.; LORENZI, F.; CARVALHO, T. Estruturas de dados. São Paulo: Thomson, 2007.
PREZADO ESTUDANTE
2
Parte 7
Introdução
As listas encadeadas simples são normalmente utilizadas para relacionar
itens que precisam ser exibidos ou manipulados por meio de estruturas
dinâmicas. Com isso, é possível implementar operações que permitem
redimensionar as listas de acordo com a quantidade de itens manipulados,
ocupando exatamente a memória necessária para alocar os elementos
que pertencem à lista. Conhecer a definição das listas encadeadas sim-
ples, bem como suas operações de manipulação e acesso, permite que
o profissional de TI (tecnologia da informação) identifique e aplique
soluções confiáveis e otimizadas para o desenvolvimento de sistemas.
Neste capítulo, você vai estudar sobre listas encadeadas simples e
suas operações de manipulação e acesso.
a b
c d
e f
&e1
e1
&prox
Figura 2. Estrutura de um elemento de uma lista encadeada.
e1 e2 e3 e4
“Não liberar memória alocada dinamicamente quando ela não mais for necessária
pode fazer com que o sistema esgote prematuramente sua memória. Algumas vezes
isso é chamado um vazamento de memória” (DEITEL; DEITEL, 2010, p. 552).
listaProduto.proximo = nulo
Incluir um novo elemento no início da lista é uma tarefa simples. Para isso, é
preciso ajustar o apontamento inicial da lista, que vai indicá-lo como primeiro
elemento, definindo como seu próximo elemento aquele que ocupava essa
posição anteriormente (Figura 4).
d
c
a e
b
d
a c
b e
novoProduto.proximo = listaProduto.proximo
listaProduto.proximo = novoProduto
Estrutura de Dados - II UNIDADE 2
8 Listas encadeadas simples Listas Encadeadas Simples PARTE 7 185
d
c
a b e
x
d
a c
b e
d
a c
b e
d
a c
b e
d
a c
b e
d
a
b e
primeiro= listaProduto.proximo
listaProduto.proximo= primeiro.proximo
liberarMemoria(primeiro)
Para excluir um elemento do final, é preciso fazer uma varredura na lista até
chegar à última posição, definir o apontamento do penúltimo elemento como
nulo e liberar a memória do elemento que ocupava a última posição.
anterior= listaProduto
atual= listaProduto.proximo
enquanto atual.proximo diferente nulo
anterior= atual
atual= atual.proximo
188 ESTRUTURA DE DADOS
Listas encadeadas simples 11
fim enquanto
anterior.proximo= nulo
liberarMemoria(atual)
anterior= listaProduto
atual= lisProduto.proximo
enquanto atual.proximo diferente nulo
se atual.proximo igual a valor
anterior.proximo= atual.proximo
liberarMemoria(atual)
sair
fim se
anterior= atual
atual= atual.proximo
fim enquanto
Para excluir uma lista encadeada inteira, é preciso percorrer todos os elementos,
a partir do início, e liberar a alocação de memória de cada elemento, bem como
indicar que seu próximo elemento aponta para nulo para evitar o apontamento
de alguma posição desatualizada na memória.
atual= listaProduto
enquanto atual.proximo diferente nulo
proximo= atual.proximo
atual.proximo= nulo
liberarMemoria(atual)
fim enquanto
Estrutura de Dados - II UNIDADE 2
12 Listas encadeadas simples Listas Encadeadas Simples PARTE 7 189
Uma lista encadeada está vazia se ela aponta para nulo, isto é, se ela não
aponta para nenhum elemento.
primeiro= listaProduto.proximo
imprime primeiro
Não é possível acessar diretamente o último elemento da lista, uma vez que
uma lista encadeada simples não permite acesso direto aos elementos. Dessa
forma, é preciso percorrer toda a lista a partir do primeiro elemento.
190 ESTRUTURA DE DADOS
Listas encadeadas simples 13
elemento= listaProduto.proximo
enquanto elemento diferente nulo
se elemento.proximo igual a nulo
imprime elemento
fim se
elemento= listaProduto.proximo
fim enquanto
Sabendo que uma lista encadeada simples não permite acessar diretamente
os elementos, é preciso realizar uma varredura na lista a partir da primeira
posição. Dessa forma, compara-se cada elemento da lista com o dado pesqui-
sado, buscando localizar a informação desejada.
elemento= listaProduto.proximo
enquanto elemento diferente nulo
se elemento.proximo igual a informação desejada
imprime elemento
fim se
elemento= listaProduto.proximo
fim enquanto
elemento= listaProduto.proximo
enquanto elemento diferente nulo
imprime elemento
elemento= listaProduto.proximo
fim enquanto
Estrutura de Dados - II UNIDADE 2
Listas Encadeadas Simples PARTE 7 191
14 Listas encadeadas simples
CELES, W.; CERQUEIRA, R.; RANGEL, J. L. Introdução a estrutura de dados. São Paulo:
Campus, 2004.
DEITEL, P. J.; DEITEL, H. M. Como programar em C. 6. ed. São Paulo: Pearson, 2011.
EDELWEISS, N.; GALANTE, R. Estrutura de dados. Porto Alegre: Bookman, 2009. (Série
Livros Didáticos Informática UFRGS, v. 18).
FORBELLONE, A. L. Lógica de programação: a construção de algoritmos e estruturas
de dados. 3. ed. São Paulo: Prentice Hall, 2005.
MATTOS, P.; LORENZI, F.; CARVALHO, T. Estruturas de dados. São Paulo: Thomson, 2007.
PREZADO ESTUDANTE
2
Parte 8
Introdução
Uma lista encadeada dupla é um tipo de lista dinâmica em que os ele-
mentos têm dois apontamentos: um para o elemento anterior e outro para
o elemento posterior. Com o encadeamento duplo, é possível percorrer
uma lista em ambos os sentidos, isto é, da esquerda para a direita e vice-
-versa, proporcionando mais versatilidade na navegação dos elementos
da lista. As operações em uma lista com encadeamento duplo são as
mesmas das listas simplesmente encadeadas, com pequenas variações
nos apontamentos existentes.
Neste capítulo, você vai estudar sobre o uso, a navegação e as ope-
rações com listas encadeadas duplas.
a e1 p a e3 p a e3 p
De acordo com Celes, Cerqueira e Rangel (2004), uma lista dinâmica com
encadeamento duplo apresenta as seguintes características:
Aluno
nome
nota
turma
e1 e2 e3 e4
&prox &prox &prox &prox
&e1 n = 4 &e4
Descritor
a e1 p a e3 p a e3 p
a e4 p
a e1 p a e3 p a e3 p
a e4 p
a e1 p a e3 p a p
a e4 p
a e1 p a e3 p
CELES, W.; CERQUEIRA, R.; RANGEL, J. L. Introdução a estrutura de dados: com técnicas
de programação em C. Rio de Janeiro: Campus, 2004. 294 p.
EDELWEISS, N.; GALANTE, R. Estrutura de dados. Porto Alegre: Bookman, 2009. 262 p.
(Série Livros Didáticos Informática UFRGS, 18).
LORENZI, F.; MATTOS, P.; CARVALHO, T. Estruturas de dados. São Paulo: Cengage Le-
arning, 2007. 200 p.
Leitura recomendada
FORBELLONE, A. L. V.; EBERSPÁCHER, H. F. Lógica de programação: a construção de
algoritmos e estruturas de dados. 3 ed. São Paulo, Pearson, 2005. 232 p.
PREZADO ESTUDANTE
2
Parte 9
Lista Dinâmica
Lista dinâmica
Objetivos de aprendizagem
Ao final deste texto, você deve apresentar os seguintes aprendizados:
Introdução
As listas dinâmicas ou encadeadas são normalmente utilizadas para
relacionar itens que precisam ser exibidos ou manipulados em tempo
de execução. Com isso, é possível implementar métodos que permitem
redimensionar as listas conforme os itens são inseridos ou removidos,
ocupando exatamente a memória necessária para alocar os elementos
que pertencem à lista. Conhecer a implementação de listas dinâmicas
e seus métodos de acesso e manipulação permite que o profissional de
TI (tecnologia da informação) identifique e aplique soluções robustas e
otimizadas para o desenvolvimento de sistemas.
Neste capítulo, você vai estudar sobre listas dinâmicas e suas opera-
ções de manipulação e acesso com a linguagem C.
Lista dinâmica
Lista dinâmica, ou lista encadeada simples, é uma relação de elementos ligados,
formando uma sequência de itens na qual cada elemento se liga ao elemento
posterior. Os elementos dessa relação são formados por uma estrutura que
pode conter variáveis de vários tipos de dados (Figura 1) (EDELWEISS;
GALANTE, 2009).
Estrutura de Dados - II UNIDADE 2
Lista Dinâmica PARTE 9 209
2 Lista dinâmica
e1 e2 e3 e4
Produto
codigoBarras
descricao
categoria
preco
e1 e2 e3 e4
&prox &prox &prox &prox
Lista dinâmica 9
Lista dinâmica 13
CELES, W.; CERQUEIRA, R.; RANGEL, J. L. Introdução a estrutura de dados: com técnicas
de programação em C. Rio de Janeiro: Campus, 2004. 294 p.EDELWEISS, N.; GALANTE,
R. Estrutura de dados. Porto Alegre: Bookman, 2009. 262 p. (Série Livros Didáticos
Informática UFRGS, 18).
LORENZI, F.; MATTOS, P.; CARVALHO, T. Estruturas de dados. São Paulo: Cengage Le-
arning, 2007. 200 p.
Leituras recomendadas
DEITEL, P.; DEITEL, H. C: como programar. 6. ed. São Paulo: Pearson Education, 2011.
818 p.
FORBELLONE, A. L. V.; EBERSPÁCHER, H. F. Lógica de programação: a construção de
algoritmos e estruturas de dados. 3 ed. São Paulo, Pearson, 2005. 232 p.
PREZADO ESTUDANTE