140 likes | 410 Views
TADS – Tipos Abstratos de Dados. Exemplos: Lineares: Listas Pilhas Filas Não lineares: Árvores Grafos. Listas Lineares.
E N D
TADS – Tipos Abstratos de Dados • Exemplos: • Lineares: • Listas • Pilhas • Filas • Não lineares: • Árvores • Grafos
Listas Lineares É uma sequência de elementos dispostos numa ordem estritamente linear, um após o outro, com operações de alto nível, tais como: acesso, inserção, exclusão de elementos etc. Listas sequenciais: implementadas através de vetores. Listas encadeadas: implementadas através de alocação dinâmica de memória.
Operações Primitivas • Iniciar uma lista. • Acessar o k-esimo nó. • Inserir um nó após o k-esimo nó. • Remover o k-esino nó. • Determinar o número de nós. • Localizar um determinado nó a partir de uma informação dele. • etc.
Estrutura de dados para a lista: • #define MAX 100 • struct Lista { • int qtde; • char elemento[MAX]; • };
Inicialização da lista: • #define MAX 100 • struct Lista { • int qtde; • char elemento[MAX]; • }; • void iniciaLista(struct Lista* lista) { • lista->qtde = 0; • }
Acesso ao k-esimo elemento: • #define MAX 100 • struct Lista { • int qtde; • char elemento[MAX]; • }; • // acessa o k-esimo elemento. Considera primeira posição = zero • char acessa(struct Lista* lista, int k) { • char dado; • // se o índice k está fora da faixa permitida • if(k<0 || k>(lista->qtde-1)) • printf("ERRO: indice fora dos limites"); • else • dado = lista->elemento[k]; • return dado; • }
Inserção no final da lista: • #define MAX 100 • struct Lista { • int qtde; • char elemento[MAX]; • }; • void insereFinal(struct Lista* lista, char novoDado) { • int i; • // se o índice k está fora da faixa permitida • if(lista->qtde > MAX-1) • printf("ERRO: indice fora dos limites"); • else { • lista->elemento[lista->qtde] = novoDado; • lista->qtde++; • } • }
Inserção numa posição específica: • #define MAX 100 • struct Lista { • int qtde; • char elemento[MAX]; • }; • void inserePosicao(struct Lista* lista, int k, char novoDado) { • int i; • // se o índice k está fora da faixa permitida • if(k<0 || k>(lista->qtde-1) || (lista->qtde > MAX-1)) • printf("ERRO: indice fora dos limites"); • else { • for(i = lista->qtde; i > k; i--) • lista->elemento[i] = lista->elemento[i-1]; • lista->elemento[k] = novoDado; • lista->qtde++; • } • }
Exclusão de um elemento: • #define MAX 100 • struct Lista { • int qtde; • char elemento[MAX]; • }; • void exclui(struct Lista* lista, int k) { • int i; • // se o índice k está fora da faixa permitida • if(k<0 || k>(lista->qtde-1)) • printf("ERRO: indice fora dos limites"); • else { • for(i = k; i < lista->qtde; i++) • lista->elemento[i] = lista->elemento[i+1]; • lista->qtde--; • } • }
Conversão para String: • #define MAX 100 • struct Lista { • int qtde; • char elemento[MAX]; • }; • char* extraiString(struct Lista* lista) { • int i; • char* p; • p = (char*)malloc(lista->qtde+1); • for(i = 0; i < lista->qtde; i++) { • p[i] = lista->elemento[i]; • } • p[i] = '\0'; • return p; • }
Teste: • #define MAX 100 • #include <stdio.h> • #include <stdlib.h> • #define MAX 100 • struct Lista { • int qtde; • char elemento[MAX]; • }; • // protótipos... • int main(int argc, char *argv[]) { • char aux; • struct Lista palavra; • iniciaLista(&palavra); • insereFinal(&palavra, 'a'); • insereFinal(&palavra, 'r'); • insereFinal(&palavra, 'o'); • printf("%s \n", extraiString(&palavra)); • aux = acessa(&palavra, 1); • inserePosicao(&palavra, 2, 'm'); • exclui(&palavra, 1); • insereFinal(&palavra, 'r'); • printf("%s \n", extraiString(&palavra)); • ... • }