Você está na página 1de 22

ALGORITMO E

ESTRUTURA DE DADOS

Docente: Dikiefu Fabiano, Msc


Assistente: Hélio Santana
Sumário

1. Introdução
1.1 Tipo de dados Abstracto -TDA
1.2 Funções
1.3 Ponteiros
1.4 Estruturas e tipos de dados definidos pelo programador
1.5 Estruturas de dados recursivas
2. Listas Lineares
2. 1 Listas Sequenciais
2.2 Listas ligadas
2.3 Listas Circulares
2.4 Listas duplamente ligadas
2.5 Pilhas
2.5.1 Implementação sequencial da pilha
2.5.2 Implementação dinâmica da pilha
2.6 Filas
2.6.1 Implementação sequencial da fila
2.6.2 Implementação dinâmica da fila

CC-FCUAN 2
Sumário - cont

3. Árvores
3.1 Introdução
3.2 Tipos de árvores
3.3 Árvores binárias
3.3.1 Estrutura de uma árvore binária
3.3.2 Descrição
3.3.3 Altura
3.3.4 Representação em C
3.4 Árvores Genéricas
3.4.1 Estrutura de uma árvore genérica
3.4.2 Representação em C
3.4.3 Problemas com Representação

CC-FCUAN 3
Sumário - cont
4. Gráfos
4.1 Conceitos
4.2 Representação em C
5. Ordenação
5.1 Ordenação por Selecção
5.2 Ordenação por Inserção
5.3 Shellsort
5.4 Quicksort
5.5 Heapsort
6. Pesquisa
6.1 Pesquisa Sequencial
6.2 Pesquisa Binária
6.3 Árvores de Pesquisa
6.4 Indexação
6.5 Hashing
CC-FCUAN 4
Introdução

Sumário:
1.1 Tipo de Dado Abstracto (TDA)
1.2 Funções
1.3 Ponteiros
1.4 Estruturas de Dados
1.5 Estruturas Recursivas

CC-FCUAN 5
Conceitos
• Algoritmos e Estruturas de Dados
• Estuda as técnicas computacionais para a organização e
manipulação eficiente de quaisquer quantidades de informação.
• Em um projecto de software, 2 aspectos devem ser
considerados para sua implementação:
• De que forma estão organizados os dados, qual a sua estrutura.
• Quais procedimentos actuam sobre estes dados, ou seja, que
operações podem ser realizadas sobre eles.
• Ao estudar estruturas de dados teremos sempre este par:
• Um conjunto estruturado de informações
• Uma classe de objetos ou um tipo de dados.
• Um conjunto definido de operações sobre estes dados:
• Um conjunto de métodos ou funções.

CC-FCUAN 6
Tipos de Dados
 Tipo de dados de uma variáveis
 define o conjunto de valores que a variável pode assumir.
 Especifica a quantidade de bytes que deve ser reservadas a ela.
 Tipos de dados podem ser vistos como métodos para interpretar
o conteúdo da memória do computador
 Podemos ver o conceito de tipo de dados de uma outra
perspectiva: não em termos do que um computador pode fazer
(interpretar os bits …) mas em termos do que o utilizador
desejam fazer (somar dois inteiros…)

CC-FCUAN 7
Estrutura de Dados

• É um método particular de se implementar um TDA


• Cada ED é construída dos tipos primitivos (inteiro, real,
char, …) ou dos tipos compostos (array, registo, …) de uma
linguagem de programação.
Exemplo em C a estrutura de dados pessoa, com os campos nome,
idade, sexo e peso, pode ser representado da seguinte forma:
struct pessoa{
char nome[25];
int idade;
char sexo;
float peso;
}

CC-FCUAN 8
Tipos de Dados Abstractos - TDA

• Tipo de Dado Abstracto


• Agrupa a estrutura de dados juntamente com as operações que podem ser
feitas sobre esses dados
• O TDA encapsula a estrutura de dados. Os utilizadores do TDA só tem
acesso a algumas operações disponibilizadas sobre esses dados
• Utilizador do TDA x Programador do TDA
• Utilizador só “enxerga” a interface, não a sua implementação, dessa
forma, o utilizador pode abstrair da implementação específica.
• A criação ou modificação dessa implementação fica restrita ao
programador do TDA
• A escolha de uma representação específica é fortemente influenciada pelas
operações a serem executadas

CC-FCUAN 9
Funções

• Conceito:
• É uma unidade autónoma de código do programa e é desenhada
para cumprir uma tarefa particular.
• Sintaxe
tipo nome_da_função (parametros){
comandos;
}

CC-FCUAN 10
Funções
• Quando uma função não retorna um valor para função que a chamou ela é
declarada como void.
• Ex:
#include<stdio.h>
void linha (char ch, int size){
int i;
for (i=1; i<= size; i++)
putchar(ch);
}
main(){
char lin;
int tamanho;
printf(“Introduza o tipo de linha”);
scanf(“%c”, &lin);
printf(“Introduza o tamanho da linha”);
scanf(“%d”, &tamanho);

linha(lin, tamanho);
getchar();
}

CC-FCUAN 11
Funções - Função com retorno

O tipo de retorno tem que ser


declarada. ltado se
rá de main(){
su
que o re o
Isso ind ica
tipo int
eir int b, e;
Ex1 : printf(“Introduza a base e expoente”);
scanf(“%d%d”, &b, &e);
int potencia (int base, int expoente){
printf(“valor=%d\n”, potencia(b,e));
int i, pot=1; getchar();
if (expoente<0) }
return 0;
for (i=1; i <= expoente; i++)
pot=pot*base;
return pot;
}

CC-FCUAN 12
Apontadores

• Na realidade, C permite que o programador referencie a posição de


objectos bem como os próprios objectos (isto é, o conteúdo de suas
posições)

• O objectivo:
– Armazenar o endereço de outra variável.
• Sintaxe
tipo * ptr
• ptr – é o nome da variável do tipo apontador
• tipo – o tipo da variável para qual apontará.
• * – indica que é uma variável do tipo apontador
• Exemplo 1:
char *pc;
int *pi;
float *pf;
CC-FCUAN 13
Apontadores

• Um ponteiro é como qualquer outro tipo de dado em C.


• O valor de um ponteiro é uma posição de memória - da mesma
forma que o valor de um inteiro é um número.
• Os valores dos ponteiros podem ser atribuídos como qualquer
outro valor.
• A conversão de pf do tipo “ponteiro para um número de ponto
flutuante” para o tipo “ponteiro para um inteiro” pode ser feita
escrevendo-se:
pi = (int *) pf;
• Se pi é um ponteiro para um inteiro, então pi+1 é o ponteiro
para o inteiro imediatamente seguinte ao inteiro *pi em
memória, pi–1 é o ponteiro para o inteiro imediatamente
anterior a *pi.
CC-FCUAN 14
Apontadores

• Por exemplo, suponha que determinada máquina usa


endereçamento de bytes, que um inteiro exija 4 bytes e que valor
de pi seja 100 (isto é, pi aponta para inteiro *pi na posição 100).
Sendo assim, o valor de pi–1 é 96, o valor de pi+1 é 104.

*pi
96 100 104 108

pi-1 pi pi+1

• De modo semelhante, se o valor da variável pc é 100 e um


caractere tem um byte, pc – 1 refere-se a posição 99 e pc+1 à
posição 101.

CC-FCUAN 15
Inicialização automática de apontadores

• Um bom hábito para evitar problemas de programação é a


inicialização sempre dos apontadores
• A constante simbólica NULL, quando colocada num
apontador, indica que este não aponta para nenhuma
variável.
int x = 5;
float *pi = NULL;

CC-FCUAN 16
Passagem de parâmetro

• Uma área na qual os ponteiros de C func(int y)


desempenham um notável papel é {
passagem de parâmetro para ++y;
funções. printf(“%d\n”, y);
• Normalmente, os parâmetros são }
passados para uma função em C por void main(){
valor, isto é, os valores sendo
int x =5;
passados são copiados nos
parâmetros da função de chamada printf(“%d\n”, x) // imprime 5
no momento em que a função for func(x); // imprime 6
chamada. Se o valor de um printf(“%d\n”, x) // imprime 5
parâmetro for alterado dentro da }
função, o valor no programa
chamada não será modificado.

CC-FCUAN 17
Passagem por referência

void func(int *py)


{
++(*py);
Se precisar usar func para printf(“%d\n”, *py);
modificar o valor de x, }
precisaremos passar o void main(){
endereço de x.
int x =5;
printf(“%d\n”, x); // imprime 5
func(&x); // imprime 6
printf(“%d\n”, x); // imprime 6
}

CC-FCUAN 18
Estrutura de dados
• Estruturas são peças contíguas de armazenamento que contém
vários tipos de dados simples agrupados numa entidade.
• Estrutura são manifestadas através da palavra reservada struct
seguida pelo nome da estrutura e por uma área delimitada por
colchetes que contém campos.
• Exemplo:
struct pessoa {
char nome[30];
int idade;
char sexo;
};

CC-FCUAN 19
Tipo de dados definido pelo utilizador
• Para criação de novos tipos de estrutura de dados em C utiliza-se a
palavra-chave: typedef
• Exemplo:
typedef struct pessoa {
char nome[30];
int idade;
char sexo;
} PESSOA;
• Portanto, PESSOA passa ser um tipo de dado composto

CC-FCUAN 20
Estrutura de dados
• Para obter directamente o valor de um campo, a forma é
<nome_da_estrutura>.<campo>.
Exemplo 1:
PESSOA ps;
ps.idade=15;
printf(“%d”, ps.idade)
• Para obter o valor de um campo apontado por um ponteiro a forma
é
<nome_da_estrutura> -> <campo>
Exemplo 2:
PESSOA *ps;
ps->idade=15;
printf(“%d”, ps->idade)

CC-FCUAN 21
Estruturas de dados Recursivas

• Estruturas podem ser recursivas, i.e., podem conter


ponteiros para si mesmas. Esta peculiaridade ajuda a
definir estruturas do tipo lista ligada.

struct lista{
struct lista *prox;
int dado;
}
CC-FCUAN 22

Você também pode gostar