Escolar Documentos
Profissional Documentos
Cultura Documentos
Laboratório de
Estrutura de Dados I
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 2
2
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 3
Laboratório de
Estrutura de Dados I
Manaus - AM
2008
3
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 4
Ficha Técnica
Érica Lima
Projeto gráfico
4
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 5
5
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 6
6
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 7
a a
Prof. Dr. Marilene Corrêa da Silva Freitas
Reitora da Universidade do Estado do Amazonas
7
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 8
8
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 9
EXERCÍCIOS..............................................................................89
9
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 10
10
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 11
Lista de Figuras
11
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 12
12
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 13
Lista de Algoritmos
13
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 14
14
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 15
Lista de Programas
Programa 1.1: Forma geral para definição de uma estrutura.
Programa 1.2: Aplicação da forma geral para definição de uma
estrutura de cliente.
Programa 1.3: Aplicação declarando duas variáveis do mesmo
tipo.
Programa 1.4: Declaração de variáveis do tipo estrutura como
variáveis locais.
Programa 1.5: Forma geral de referenciar um campo de uma var-
iável estrutura.
Programa 1.6: Criando 100 conjuntos de variáveis.
Programa 1.7: Percurso em todos os elementos de uma matriz de
estruturas.
Programa 1.8: Forma geral de definição de tipo – typedef.
Programa 1.9: Exemplo de utilização do typedef.
Programa 1.10: Exemplo de utilização do typedef com struct.
Programa 1.11: Forma geral da definição de uma função.
Programa 1.12: Exemplo de TAD básico.
Programa 1.13: Arquivo tadconta.h.
Programa 1.14: Arquivo tadconta.c.
Programa 1.15: Arquivo contendo o programa com a função prin-
cipal, main().
15
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 16
17
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 18
18
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 19
CAPÍTULO 1
Implementando
Tipos Abstratos de Dados
1.1 Introdução
struct nome_estrutura {
tipo nome_do_campo1;
tipo nome_da_campo2;
...
}[<lista_de_variáveis>];
struct TipoCliente {
char nome[25];
char endereco[15];
float saldo;
} cliente;
Programa 1.2: Aplicação da forma geral para definição de uma estrutura de cliente
struct TipoCliente {
char nome[25];
char endereco[15];
float saldo;
} clientePessoa, clienteEmpresa;
20
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 21
struct cliente {
char nome[25];
char endereco[15];
float saldo;
};
main(){
struct cliente cliente1, cliente2, cliente3;
…
}
nome_da_variavel.nome_do_campo;
scanf(“%s”, clientePessoa.nome);
strcpy(clienteEmpresa.nome, “MinhaEmpresa”);
clientePessoa.saldo = 2050.50;
clienteEmpresa.saldo = 2000400;
gets(cliempresa.nome);
scanf(“%s”, clienteEmpresa.endereco);
21
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 22
struct TipoCliente {
char nome[25];
char endereco[15];
float saldo;
} clientes[100];
22
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 23
23
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 24
typedef struct {
int dia;
int mes;
int ano;
}TipoData;
24
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 25
25
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 26
Onde:
tipo - define o tipo da informação que a função vai retornar,
podendo ser qualquer tipo válido. Se nenhum tipo for
especificado o compilador assume que a função devolve um
resultado inteiro (default), quando a função não retorna nenhum
resultado coloca-se void;
nome_da_função – identificador criado pelo programador;
lista_de_parâmetros – são as informações passadas para a
função, também conhecidas como argumentos. Uma função pode
não conter argumentos, neste caso, uma lista vazia entre parên-
teses. Todos os parâmetros da função devem conter o tipo e o
nome da variável.
26
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 27
#include <stdio.h>
/* DEFINIÇÃO DA ESTRUTURA */
struct ContaCliente {
int numero;
char nome[50];
float saldo;
};
ContaCliente conta;
void ExcluirConta ()
{ ... }
void AlterarConta ()
{ ... }
27
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 28
Exemplo
Problema:
Utilizando TADs e registros construa um algoritmo, que realize o
cadastro de contas bancárias. São dadas as seguintes informações:
a) Número da conta;
b) Nome do cliente;
c) Saldo da conta.
O banco permitirá o cadastramento de apenas 10 contas e não
pode haver mais de uma conta com o mesmo número. Crie o menu de
opções abaixo:
28
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 29
Menu
1. Cadastro de contas;
2. Mostrar todas as contas de um determinado cliente;
3. Excluir a conta com menor saldo (supondo que não existam
saldos iguais);
4. Sair.
Resolução:
Passo1
• Crie um arquivo .h;
• Crie um registro e a definição de tipo;
• Crie o protótipo das operações.
Passo2
• Crie o arquivo .c;
• Crie um procedimento de cadastro de contas dos clientes
(número, nome e saldo);
• Crie um procedimento para mostrar as contas do cliente solici-
tado;
• Crie um procedimento para excluir a conta com o menor saldo.
Passo3
• Crie o arquivo main.c;
• Crie um menu de opções.
29
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 30
30
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 31
#include <stdio.h>
#include <string.h>
#include <values.h>
#include "tadconta.h"
31
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 32
#include <stdio.h>
#include <string.h>
#include "tadconta.h"
main(void)
{
TConta contas[max];
int i, op;
while(op != 4) {
printf("\n\nMenu de Opções:");
printf("\n1 - Cadastrar Contas");
printf("\n2 - Visualizar Contas Cliente");
printf("\n3 - Excluir Conta de menor saldo");
printf("\n4 - Sair");
printf("\n\nDigite a sua Opção:");
scanf(“%d”, &op);
switch (op){
case 1:
CadastrarConta(contas); break;
case 2:
VisualizarConta(contas); break;
case 3:
ExcluirConta(contas); break;
default:
printf("\nErro: Opção Inválida");
}
}
}
32
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 33
CAPÍTULO 2
Ponteiros e Alocação
Dinâmica de Memória
2.1 Introdução
Neste capítulo será estudado como declarar uma variável do tipo
ponteiro, bem como os diversos usos que se pode fazer desse tipo de
variável, como alocação dinâmica de memória e alocação de um vetor.
var
i : inteiro
r : real
c : caractere
pi : Ponteiro inteiro
pr : Ponteiro real
pc : Ponteiro caractere
inicio
pi <- ENDERECO i
pr <- ENDERECO r
pc <- ENDERECO c
fimalgoritmo
Algoritmo 2.1: Atribuição de endereços de variáveis a ponteiros.
33
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 34
tipo *nome_da_variável;
Onde:
• tipo é um tipo primitivo da linguagem (int, char, etc.) ou
um tipo definido pelo programador, como um registro,
por exemplo.
• nome_da_variável é um descritor (nome de variável),
definido pelo programador, obedecendo às regras de definição de
descritores. Exemplo: int *pi;
34
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 35
#include <stdio.h>
int i, *pi;
float r, *pr;
char c, *pc;
main()
{ pi = &i;
pr = &r;
pc = &c;
}
inicio
...
escreva(“Digite um valor inteiro”)
leia(CONTEUDO pi)
escreva(i) //escreve o valor lido
fimalgoritmo
35
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 36
#include <stdio.h>
int i, *pi;
float r, *pr;
char c, *pc;
main() {
pi = &i;
pr = &r;
pc = &c;
printf(“Digite um valor inteiro”);
scanf(“%d”,pi);
printf(“Valor lido: %d%”,*pi);
}
36
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 37
...
#include <stdio.h>
#include <stdlib.h>
main()
{
int *p;
p = (int *) malloc(sizeof(int));
...
}
38
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 39
39
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 40
40
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 41
inicio
...
PF <- ALOCAR(TAMANHO_DE(TFuncionario))
leia(PF->nome, PF->salario, PF->idade)
...
#include <stdio.h>
#include <stdlib.h>
struct TFuncionario
{ char nome[40];
float salario;
int idade;
};
main()
{
struct TFuncionario *PF;
42
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 43
TFuncionario *PF;
inicio
...
leia (tam)
vet <- ALOCAR(TAMANHO_DE(TFuncionario) * tam)
para i de 1 ate tam faca
leia(vet[i].nome, PF[i].salario, PF[i].idade)
fimpara
...
43
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 44
typedef struct
{
char nome[40];
float salario;
int idade;
} TFuncionario;
main()
{
TFuncionario *vet;
int tam, i;
44
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 45
CAPÍTULO 3
Listas
3.1 Introdução
45
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 46
TipoLista = registro
item : vetor[1..max] de TipoItem
tamanho : inteiro
fimregistro
46
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 47
47
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 48
48
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 49
Exemplo:
Existem no vetor os códigos 344, 356, 363, 365 e deseja-se inserir
o código 347, que passará a ocupar a posição dois no vetor.
Faz-se necessário, portanto, deslocar os valores das posições 2, 3
e 4 para as posições 3, 4 e 5, respectivamente.
Para que não ocorra perda de nenhum valor, o vetor deve ser per-
corrido do final até a posição que deve resultar vazia.
No caso desse exemplo, deve-se copiar primeiro o valor da posição
4 para a posição cinco, depois da posição 3 para 4 e, por fim, da
posição 2 para 3.
Para realizar essa cópia, não é necessário copiar campo a campo
do registro de cada posição do vetor. É suficiente fazer a atribuição de
um registro a outro: lista.item[x] <- lista.item[y] e todos os
campos do registro item serão copiados da posição x para a posição y
do vetor.
A Figura 3.2 traz um exemplo de informações digitadas para duas
posições do vetor. O campo lista.tamanho tem valor dois,
significando que dois registros foram implantados.
50
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 51
void listar(TLista l)
{
int i;
if (vazia(l))
printf("Nao ha produto cadastrado");
else {
printf("\n\nProdutos cadastrados:");
for (i = 0; i < l.tamanho; i++){
printf("\nCodigo: %5d",l.item[i].cod);
printf(" Especificacao: %s",l.item[i].especif);
printf(" Preco: %6.2f ", l.item[i].preco);
printf("Qtd: %3i, l.item[i].quant);
}
}
}
51
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 52
#include <stdio.h>
#include "lista.h"
main(void) {
char op = ' ';
TLista lista;
cria_lista_vazia(&lista);
while (op != '3') {
printf("\n\n\t\tCadastro de produtos");
printf("\n\n\t\t1 - Inserir dados
printf("\n\t\t2 - Listar");
printf("\n\t\t3 - Encerrar programa");
printf("\n\n\t\tOpcao escolhida: ");
__fpurge(stdin);
scanf("%c", &op);
switch(op) {
case '1':
inserir(&lista); //argumento passado por ref.
break;
case '2':
listar(lista); //argumento passado por valor
break;
}
}
return 0;
}
52
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 53
TipoLista = registro
inicio : Ponteiro TipoItem
fimregistro
53
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 54
typedef struct {
TipoChave cod;
char especif[30];
float preco;
int quant;
} TipoDado;
struct Celula {
TipoDado Dado;
struct Celula *Proximo;
}TipoCelula;
typedef struct {
TipoCelula *Inicio;
} TipoLista;
54
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 55
55
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 56
56
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 57
57
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 58
if (ListaVazia(lista))
printf("Erro: Nao ha produtos cadastrados!");
else {
aux = lista.Inicio;
printf("\n\nProdutos cadastrados:");
do {
printf("\nCodigo: %5d", aux->Dado.cod);
printf("\nEspecificacao: %s", aux->Dado.especif);
printf("\nPreco: %6.2f ", aux->Dado.preco);
printf("\nQuantidade: %3i", aux->Dado.quant);
noatual = aux->Proximo;
} while (aux != NULL);
}
}
58
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 59
CAPÍTULO 4
Pilhas
4.1 Introdução
Para a implementação do Tipo Abstrato de Dados Pilha, é preciso,
inicialmente, definir os tipos necessários para a sua criação. Seguindo
a disciplina de acesso “o último que entra é o primeiro a sair” ou do
inglês LIFO (Last In, First Out), será mostrado o conteúdo dos
arquivos deste TAD:
• Arquivo de cabeçalho (pilha.h). Contém as definições de tipo
(typedef) e a interface das funções;
• Arquivo fonte (pilha.c). Armazena a implementação das
operações definidas sobre o TAD Pilha.
#ifndef PILHA_H_
#define PILHA_H_
#define Max 3
typedef int TipoChave;
typedef struct {
TipoChave chave;
/* outros campos */
} TipoDado;
typedef struct {
int Topo;
TipoDado Dados[Max];
} TipoPilha;
#endif /*PILHA_H_*/
60
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 61
61
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 62
62
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 63
63
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 64
#ifndef PILHAD_H_
#define PILHAD_H_
typedef struct {
TipoChave chave;
/* outros campos */
} TipoDado;
typedef struct {
TipoCelula *Topo;
} TipoPilha;
#endif /*PILHAD_H_*/
64
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 65
65
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 66
66
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 67
67
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 68
68
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 69
CAPÍTULO 5
Filas
5.1 Introdução
69
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 70
#ifndef FILA_H_
#define FILA_H_
typedef struct {
TipoChave chave;
/* outros campos */
} TipoDado;
typedef struct {
int Frente, Tras;
TipoDado Dados[Max];
} TipoFila;
#endif /*FILA_H_*/
70
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 71
71
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 72
/* compactacao do vetor */
for (i = 0; i < fila->Tras; i++)
fila->Dados[i] = fila->Dados[i+1];
fila->Tras--;
return 1;
}
}
72
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 73
73
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 74
#ifndef FILAD_H_
#define FILAD_H_
typedef struct {
TipoChave chave;
/* outros campos */
} TipoDado;
typedef struct {
TipoCelula *Frente, *Tras;
} TipoFila;
#endif /*FILAD_H_*/
75
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 76
if (Fila_Vazia(*fila))
fila->Frente = novo;
else
fila->Tras->Proximo = novo;
fila->Tras = novo;
return 1;
}
}
76
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 77
if (Fila_Vazia(*fila))
fila->Frente = novo;
else
fila->Tras->Proximo = novo;
fila->Tras = novo;
return 1;
}
}
77
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 78
aux = fila.Frente;
while(aux != NULL)
{
cont++;
aux = aux->Proximo;
}
return cont;
}
78
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 79
79
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 80
80
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 81
CAPÍTULO 6
Recursividade
6.1 Introdução
#include <stdio.h>
main(void)
{
int i,num;
while (num != 0)
{
printf (“—> %d\n”, num);
--num;
}
return 0;
}
82
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 83
#include <stdio.h>
int dec(int i)
{
printf ("--> %d\n", i);
if (i == 1)
return 1;
else
return dec(i-1);
}
main()
{
int i,num;
i = dec(num);
return 0;
}
0! = 1
N! = N x (N-1)!, para N >= 0
83
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 84
3! = 3 x (3-1)! = 3 x 2 x 1 x 1 = 6
(3-1)! = 2 x (2-1)! = 2 x 1 = 2
(2-1)! = 1 x (1-1)! = 1 x 1 = 1
(1-1)! = 0! = 1
int fatorial(int n)
{
if (n == 0)
return 1;
else
return n * fatorial(n-1);
}
int main(void)
{
printf(“%d”,fatorial(5));
return 0;
}
fatorial(5)
84
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 85
85
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 86
#include <stdio.h>
#include <stdlib.h>
if (qtd == 2) {
if (vet[0] < vet[1])
return vet[1];
else
return vet[0];
}
if (qtd == 1)
return vet[0];
x = maximo(qtd-1, vet);
if (x < vet[qtd-1])
return vet[qtd-1];
else
return x;
}
86
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 87
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a,b;
char op;
87
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 88
#include <stdio.h>
#include <stdlib.h>
88
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 89
Exercícios
89
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 90
90
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 91
91
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:48 Page 92
92
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 93
93
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 94
94
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 95
Anexo A
Implementação do TAD Conta utilizando vetores.
conta-tad.h
#ifndef CONTATAD_H_
#define CONTATAD_H_
#endif /*CONTATAD_H_*/
95
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 96
conta-tad.c
#include <stdio.h>
#include <string.h>
#include <values.h>
#include “conta-tad.h”
96
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 97
97
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 98
aplicacao-conta.c
#include <stdio.h>
#include <string.h>
#include “conta-tad.h”
int main(void) {
TConta contas[max];
int i, op = 0;
while (op != 4) {
printf(“\n\nMenu de Opcoes:”);
printf(“\n1 - Cadastrar Contas”);
printf(“\n2 - Visualizar Contas Cliente”);
printf(“\n3 - Excluir Conta de menor saldo”);
printf(“\n4 - Sair”);
printf(“\n\nDigite a sua Opcao:”);
scanf(“%d”, &op);
switch (op) {
case 1:
CadastrarConta(contas);
break;
case 2:
VisualizarConta(contas);
break;
case 3:
ExcluirConta(contas);
break;
default:
printf(“\nErro: Opção Inválida”);
}
}
return 0;
}
98
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 99
Anexo B
Implementação do TAD Lista utilizando vetores.
lista.h
#ifndef LISTA_H_
#define LISTA_H_
#endif /*LISTA_H_*/
99
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 100
lista.c
#include <stdio.h>
#include “lista.h”
if (vazia(l))
printf(“Nao ha produto cadastrado”);
else {
printf(“\n\nProdutos cadastrados:”);
for (i = 0; i < l.tamanho; i++) {
printf(“\nCodigo: %5d”, l.item[i].cod);
printf (“ Especificacao: %s”,
l.item[i].especif);
printf(“ Preco: %6.2f “,
l.item[i].preco);
printf(“Qtd: %3i”, l.item[i].quant);
}
}
}
100
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 101
aplicacao-lista.c
#include <stdio.h>
#include “lista.h”
int main(void) {
char op = ‘ ‘;
TLista lista;
cria_lista_vazia(&lista);
while (op != ‘3’) {
printf(“\n\n\t\tCadastro de produtos”);
printf(“\n\n\t\t1 - Inserir dados”);
printf(“\n\t\t2 - Listar”);
printf(“\n\t\t3 - Encerrar programa”);
printf(“\n\n\t\tOpcao escolhida: “);
__fpurge(stdin);
scanf(“%c”, &op);
switch (op) {
case ‘1’:
inserir(&lista); //argumento passado por ref.
break;
case ‘2’:
listar(lista); //argumento passado por valor
break;
}
}
return 0;
}
101
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 102
102
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 103
Anexo C
Implementação do TAD Lista utilizando variáveis dinâmicas.
listad.h
#ifndef LISTAD_H_
#define LISTAD_H_
typedef struct {
TipoChave cod;
char especif[30];
float preco;
int quant;
} TipoDado;
typedef struct {
TipoCelula *Inicio;
} TipoLista;
#endif /*LISTAD_H_*/
103
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 104
listad.c
#include <stdio.h>
#include <stdlib.h>
#include “listad.h”
104
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 105
if (ListaVazia(*lista)) {
printf(“Erro: Nao ha produtos
cadastrados!”);
return 0;
}
105
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 106
aux = lista->Inicio;
if (cod == lista->Inicio->Dado.cod) {
//retira a primeira celula
*dado = lista->Inicio->Dado;
//salva o dado no parametro
lista->Inicio = lista->Inicio->Proximo;
free(aux);
return 1;
}
while (aux->Proximo != NULL && aux->Proximo->Dado.cod != cod) {
// busca celula
aux = aux->Proximo;
}
if (aux->Proximo == NULL) {
// nao achou o dado solicitado
printf(“Erro: Este produto nao esta cadastrado!”);
return 0; // cod nao cadastrado, retorna falso
}
*dado = aux->Proximo->Dado;
//salva o dado no parametro
aux2 = aux->Proximo;
aux->Proximo = aux->Proximo->Proximo;
free(aux2);
return 1; // item retirado, retorna verdadeiro
}
106
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 107
if (ListaVazia(lista)) {
printf(“Erro: Nao ha produtos cadastrados!”);
return 0;
}
aux = lista.Inicio;
while (aux != NULL) { // busca celula
if (cod == aux->Dado.cod) {
//retira a primeira celula
*dado = lista.Inicio->Dado;
//salva o dado no parametro
return 1;
}
aux = aux->Proximo;
}
printf(“Erro: Este produto nao esta cadastrado!”);
return 0; // cod nao cadastrado, retorna falso
}
noatual = lista->Inicio;
107
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 108
if (ListaVazia(lista))
printf(“Erro: Nao ha produtos cadastrados!”);
else {
noatual = lista.Inicio;
printf(“\n\nProdutos cadastrados:”);
do {
printf(“\nCodigo: %5d”, noatual->Dado.cod);
printf(“\nEspecificacao: %s”,
noatual->Dado.especif);
printf(“\nPreco: %6.2f“, noatual->Dado.preco);
printf(“\nQuantidade: %3i”,
noatual->Dado.quant);
noatual = noatual->Proximo;
} while (noatual != NULL);
}
}
108
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 109
aplicacao-listad.c
#include <stdio.h>
#include <stdlib.h>
#include “listad.h”
int main(void) {
TipoLista l;
TipoDado d;
TipoChave cod;
int opcao;
CriaLista(&l);
do {
printf(“\n Lista de Produtos”);
printf(“\n\n1 - Inserir um produto”);
printf(“\n2 - Remover um produto”);
printf(“\n3 - Listar todos os produtos”);
printf(“\n4 - Consultar um produto”);
printf(“\n5 - Apagar a lista”);
printf(“\n\n6 - Sair”);
printf(“\n\nOpcao -> “);
scanf(“%d”, &opcao);
switch (opcao) {
case 1:
printf(“\nCadastro de Produto: “);
printf(“\n\nCodigo: “);
scanf(“%d”, &d.cod);
printf(“\nEspecificacao: “);
scanf(“%s”, d.especif);
printf(“\nPreco: “);
scanf(“%f”, &d.preco);
printf(“\nQuantidade: “);
scanf(“%d”, &d.quant);
if (InsereOrdenadoLista(&l, d)) {
printf(“Produto CODIGO = %d
inserido com sucesso!\
n”, d.cod);
}
break;
109
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 110
case 2:
printf(“\n\nCodigo para retirada: “);
scanf(“%d”, &cod);
if (RetiraLista(&l, cod, &d)) {
printf(“Produto CODIGO = %d
removido com sucesso!\
n”, d.cod);
}
break;
case 3:
ListarItens(l);
break;
case 4:
printf(“\n\nCodigo para pesquisa: “);
scanf(“%d”, &cod);
if (ConsultaItem(l, cod, &d)) {
printf(“\nDados do Produto: “);
printf(“\n\nCodigo: %5d”,
d.cod);
printf(“\nEspecificacao: %s”,
d.especif);
printf(“\nPreco: %6.2f”,
d.preco);
printf(“\nQuantidade: %3d\n”,
d.quant);
}
break;
case 5:
ApagarLista(&l);
break;
case 6:
printf(“\n\nSaindo....\n”);
break;
default:
printf(“\n\nErro: Opcao invalida\n”);
}
} while (opcao != 6);
return 0;
}
110
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 111
Anexo D
Implementação do TAD Pilha utilizando vetores.
pilha.h
#ifndef PILHA_H_
#define PILHA_H_
typedef struct {
TipoChave chave;
/* outros campos */
} TipoDado;
typedef struct {
int Topo;
TipoDado Dados[Max];
} TipoPilha;
#endif /*PILHA_H_*/
111
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 112
pilha.c
#include <stdio.h>
#include <stdlib.h>
#include "pilha.h"
112
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 113
aplicacao-pilha.c
#include <stdio.h>
#include <stdlib.h>
#include “pilha.h”
int main(void) {
TipoPilha p;
TipoDado d;
int opcao;
Cria_Pilha(&p);
do {
printf(“\n Operacoes sobre uma pilha”);
printf(“\n\n1 - Empilhar um dado”);
printf(“\n2 - Desempilhar um dado”);
printf(“\n3 - Consultar o dado no topo da pilha”);
printf(“\n\n4 - Sair”);
printf(“\n\nOpcao -> “);
scanf(“%d”, &opcao);
113
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 114
switch (opcao) {
case 1:
printf(“\nChave: “);
scanf(“%d”, &d.chave);
if (Empilha(&p, d)) {
printf(“Elemento Empilhado ->
%d\n”, d.chave);
}
break;
case 2:
if (Desempilha(&p, &d)) {
printf(“Elemento Desempilhado ->
%d\n”, d.chave);
}
break;
case 3:
if (Consulta_Topo(p, &d)) {
printf(“Topo -> %d\n”, d.chave);
}
break;
case 4:
printf(“\n\nSaindo....\n”);
break;
default:
printf(“\n\nErro: Opcao invalida\n”);
}
} while (opcao != 4);
return 0;
}
114
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 115
Anexo E
Implementação de pilha utilizando alocação dinâmica.
pilhad.h
#ifndef PILHAD_H_
#define PILHAD_H_
typedef struct {
TipoChave chave;
/* outros campos */
} TipoDado;
typedef struct {
TipoCelula *Topo;
} TipoPilha;
#endif /*PILHAD_H_*/
115
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 116
pilhad.c
#include <stdio.h>
#include <stdlib.h>
#include “pilhad.h”
if ( (novo = (TipoCelula *)
malloc(sizeof(TipoCelula))) == NULL){
printf(“\n\nErro de alocacao de memoria!”);
return 0;
} else {
novo->Dado = dado;
novo->Anterior = pilha->Topo;
pilha->Topo = novo;
return 1;
}
}
116
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 117
117
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 118
aplicacao-pilhad.c
#include <stdio.h>
#include <stdlib.h>
#include “pilhad.h”
int main(void) {
TipoPilha p;
TipoDado d;
int opcao;
Cria_Pilha(&p);
do {
printf(“\n Operacoes sobre uma pilha”);
printf(“\n\n1 - Empilhar um dado”);
printf(“\n2 - Desempilhar um dado”);
printf(“\n3 - Consultar o dado no topo da pilha”);
printf(“\n\n4 - Sair”);
printf(“\n\nOpcao -> “);
scanf(“%d”, &opcao);
switch (opcao) {
case 1:
printf(“\nChave: “);
scanf(“%d”, &d.chave);
if (Empilha(&p, d)) {
printf(“Elemento Empilhado ->
%d\n”, d.chave);
}
break;
case 2:
if (Desempilha(&p, &d)) {
printf(“Elemento Desempilhado ->
%d\n”, d.chave);
}
break;
118
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 119
case 3:
if (Consulta_Topo(p, &d)) {
printf(“Topo -> %d\n”, d.chave);
}
break;
case 4:
printf(“\n\nSaindo....\n”);
break;
default:
printf(“\n\nErro: Opcao invalida\n”);
}
} while (opcao != 4);
return 0;
}
119
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 120
120
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 121
Anexo F
Implementação de fila utilizando vetores.
fila.h
#ifndef FILA_H_
#define FILA_H_
typedef struct {
TipoChave chave;
/* outros campos */
} TipoDado;
typedef struct {
int Frente, Tras;
TipoDado Dados[Max];
} TipoFila;
#endif /*FILA_H_*/
121
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 122
fila.c
#include <stdio.h>
#include “fila.h”
122
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 123
/* compactacao do vetor */
for (i = 0; i < fila->Tras; i++)
fila->Dados[i] = fila->Dados[i+1];
fila->Tras--;
return 1;
}
}
123
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 124
aplicacao-fila.c
#include <stdio.h>
#include “fila.h”
int main(void)
{
TipoFila f;
TipoDado d;
int opcao;
Cria_Fila(&f);
do
{
printf(“\n Operacoes sobre uma fila
(Tamanho Maximo: %d)”, Max);
printf(“\n\n1 - Enfileirar um dado”);
printf(“\n2 - Desenfileirar um dado”);
printf(“\n3 - Consultar o dado da frente da fila”);
printf(“\n\n4 - Sair”);
printf(“\nOpcao -> “);
scanf(“%d”, &opcao);
switch(opcao)
{
case 1:
printf(“\nChave: “);
scanf(“%d”, &d.chave);
if (Enfileira(&f, d))
printf(“Elemento Enfileirado -> %d\n”, d.chave);
break;
124
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 125
case 2:
if(Desenfileira(&f, &d))
printf(“Elemento Desenfileirado -> %d\n”, d.chave);
break;
case 3:
if(Consulta_Frente(f, &d))
printf(“Frente -> %d\n”, d.chave);
break;
case 4:
printf(“\n\nSaindo....\n”);
break;
default:
printf(“\n\nErro: Opcao invalida”);
}
}while(opcao != 4);
return 0;
}
125
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 126
126
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 127
Anexo G
Implementação de fila utilizando alocação dinâmica.
filad.h
#ifndef FILAD_
#define FILAD_
typedef struct {
TipoChave chave;
/* outros campos */
} TipoDado;
typedef struct {
TipoCelula *Frente, *Tras;
} TipoFila;
#endif /*FILAD_*/
127
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 128
filad.c
#include <stdio.h>
#include <stdlib.h>
#include “filad.h”
if ((novo = (TipoCelula *)
malloc(sizeof(TipoCelula))) == NULL) {
printf(“\n\nErro de alocacao de memoria!”);
return 0;
} else {
novo->Dado = dado;
novo->Proximo = NULL;
if (FilaVazia(*fila))
fila->Frente = novo;
else
fila->Tras->Proximo = novo;
fila->Tras = novo;
return 1;
}
}
128
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 129
if (Fila_Vazia(*fila))
fila->Tras = NULL;
return 1;
}
}
129
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 130
aux = fila.Frente;
while(aux != NULL)
{
cont++;
aux = aux->Proximo;
}
return cont;
}
130
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 131
aplicacao-filad.c
#include <stdio.h>
#include <stdlib.h>
#include “filad.h”
int main(void) {
TipoFila f;
TipoDado d;
int opcao;
Cria_Fila(&f);
do {
printf(“\n Operacoes sobre uma Fila”);
printf(“\n\n1 - Enfileirar um dado”);
printf(“\n2 - Desenfileirar um dado”);
printf(“\n3 - Consultar o dado na frente da fila”);
printf(“\n4 - Quantidade de itens na fila”);
printf(“\n\n5 - Sair”);
printf(“\n\nOpcao -> “);
scanf(“%d”, &opcao);
switch (opcao) {
case 1:
printf(“\nChave: “);
scanf(“%d”, &d.chave);
if (Enfileira(&f, d)) {
printf(“Elemento Enfileirado -> %d”,
d.chave);
}
break;
131
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 132
case 2:
if (Desenfileira(&f, &d)) {
printf(“Elemento Desenfileirado -> %d”,
d.chave);
}
case 3:
if (Consulta_Frente(f, &d)) {
printf(“Frente -> %d”, d.chave);
}
break;
case 4:
printf(“\n\nTotal de itens na fila:
%d\n”, Quantidade_Fila(f));
break;
case 5:
printf(“\n\nSaindo....”);
break;
default:
printf(“\n\nErro: Opcao invalida”);
}
} while (opcao != 5);
return 0;
}
132
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 133
Anexo H
Implementação de fila circular.
filacircular.h
#ifndef FILACIRCULAR_H_
#define FILACIRCULAR_H_
#define Max 10
typedef struct {
TipoChave chave;
/* outros campos */
} TipoDado;
typedef struct {
int Frente, Tras;
TipoDado Dados[Max];
} TipoFila;
#endif /*FILACIRCULAR_H_*/
133
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 134
filacircular.c
#include <stdio.h>
#include “filacircular.h”
134
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 135
135
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 136
aplicacao-filacircular.c
#include <stdio.h>
#include “filacircular.h”
int main(void) {
TipoFila f;
TipoDado d;
int opcao;
CriaFilaCircular(&f);
do {
printf(“\n Operacoes sobre Fila Circular
(Tam. Maximo: %d)”, Max);
printf(“\n\n1 - Enfileirar um dado”);
printf(“\n2 - Desenfileirar um dado”);
printf(“\n3 - Consultar o dado da frente da fila”);
printf(“\n\n4 - Sair”);
__fpurge(stdin);
printf(“\nOpcao -> “);
scanf(“%d”, &opcao);
switch (opcao) {
case 1:
printf(“\nChave: “);
scanf(“%d”, &d.chave);
if (EnfileiraCircular(&f, d))
printf(“Elemento Enfileirado -> %d\n”,
d.chave);
break;
case 2:
if (DesenfileiraCircular(&f, &d))
printf(“Elemento Desenfileirado -> %d\n”,
d.chave);
break;
136
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 137
case 3:
if (ConsultaFrenteFilaCircular(f, &d))
printf(“Frente -> %d\n”, d.chave);
break;
case 4:
printf(“\n\nSaindo....\n”);
break;
default:
printf(“\n\nErro: Opcao invalida”);
}
} while (opcao != 4);
return 0;
}
137
01_laboratorio_de_estrutura_de_dados_i.qxp 5/8/2008 15:49 Page 138
138