ED-Estruturas Com Alocacao Estatica

download ED-Estruturas Com Alocacao Estatica

of 14

Transcript of ED-Estruturas Com Alocacao Estatica

  • 8/3/2019 ED-Estruturas Com Alocacao Estatica

    1/14

    ESTRUTURA DE DADOS

    Contedo Introduo s Estruturas de Dados

    Reviso de Vetores e Matrizes

    Estruturas com Alocao Esttica de Memriao Listas Lineares Contguas

    o Pilhas

    o Filas

    Estruturas com Alocao Dinmica de Memria

    o Ponteiros

    o Lista Linear Encadeada

    o Lista com Descritor

    o Lista Duplamente Encadeada

    o Pilhas e Filas Recursividade

    rvores

    IntroduoAs estruturas de dados e algoritmos so temas fundamentais dentro da

    cincia da computao, sendo utilizados nas mais diversas reas e com os mais

    diferentes propsitos. Os algoritmos basicamente manipulam dados, quando

    estes dados esto organizados (dispostos) de forma coerente caracterizam uma

    estrutura de dados.

    Desta forma, devemos entender que so a organizao e os mtodos que

    manipulam determinada estrutura que lhe conferem singularidade. A escolha de

    uma estrutura de dados apropriada pode tornar um problema complicado em uma

    soluo trivial.

    BibliografiaTanenbaum, Aaron M. Estrutura de Dados Usando C. Makron Books.1995.

    Pereira, Slvio L. Estruturas de dados fundamentais: conceitos eaplicaes. Editora rica. 1996.

    Estrutura de Dados 1

    Prof. Cludio L. V. Oliveira

  • 8/3/2019 ED-Estruturas Com Alocacao Estatica

    2/14

    Alocao Esttica de Memria: Vetores e MatrizesOs vetores podem ser entendidos como uma lista de elementos de um

    mesmo tipo de dados e que exploram a contigidade da memria. Desta forma,

    qualquer elemento dessa lista pode ser acessado instantaneamente atravs de

    um ndice. Quando os vetores possuem mais de uma dimenso os mesmos se

    tornam matrizes.

    Considerando o exemplo int v[5] = {8, 4, 3, 7, 1}, possvel observar que

    qualquer item do vetor pode ser imediatamente acessado atravs de qualquer

    uma das representaes abaixo:

    Neste primeiro exemplo temos que o primeiro elemento do vetor encontra-

    se referenciado pelo ndice zero (0) e todos os demais elementos apresentam-se

    nas posies subseqentes. Dentro deste conceito, para determinar o valor do

    terceiro elemento do vetor, utilizaremos a notao v[2] o que nos retornar o

    valor 3.

    As prximas abordagens utilizam-se do conceito de contigidade para

    determinar qualquer posio dentro do vetor a partir de uma determinadaposio relativa:

    Considerando a ndice de inicial do vetor como i, qualquer elemento pode

    ser acessado atravs da frmula i + n, onde n possui o nmero de posies que o

    elemento est distante de i. Por exemplo, i + 1 far com que o elemento de valor

    4 seja acessado.

    Estrutura de Dados 2

    Prof. Cludio L. V. Oliveira

    v:

    0 1 2 3 4

    4 3 7 18

    v:

    i i+1 i+2 i+3 i+4

    4 3 7 18

    v:

    n-4 n-3 n-2 n-1 n

    4 3 7 18

  • 8/3/2019 ED-Estruturas Com Alocacao Estatica

    3/14

    Por outro lado, como mostrado na figura acima, possvel tambm fazer o

    caminho inverso. Neste caso a partir de uma posio final possvel determinar

    as demais posies.

    Disciplina de AcessoAs caractersticas de acesso a vetores e matrizes determinam que qualquer

    elemento possa ser consultado, alterado ou removido a qualquer momento sem

    preocupaes ou dependncias com os demais elementos que compem esse

    vetor ou matriz. Sendo necessrio apenas certificar-se que o ndice utilizado

    vlido, ou seja, maior ou igual a zero e menor que o tamanho do vetor ou matriz.

    Exemplo

    // Cara ou Coroa: A partir de 20 lanamentos de uma moeda// determine o nmero de caras e coroas ocorridos.

    #include #include

    #define LANCAMENTOS 20

    char lancamento[] = {'C', 'C', 'O', 'C', 'O', 'O', 'O', 'C','C', 'C', 'O', 'C', 'C', 'O', 'O', 'C','O', 'C', 'C', 'O' };

    int main (int argc, char *argv[]){ int numeroCara = 0;int numeroCoroa = 0;for (int i = 0; i < LANCAMENTOS; i++){ if (lancamento[i] == 'C')

    numeroCara++;else

    numeroCoroa++;}printf ("Ocorreu %d caras e %d coroas\n", numeroCara,numeroCoroa);

    system("PAUSE");}

    Estrutura de Dados 3

    Prof. Cludio L. V. Oliveira

  • 8/3/2019 ED-Estruturas Com Alocacao Estatica

    4/14

    Exerccios

    1. Dada uma seqncia de 10 nmeros inteiros, imprimi-la na ordem inversa da

    leitura.

    2. Deseja-se determinar o nmero de acertos de um aluno em uma prova em

    forma de testes. A prova consta de 25 questes, cada uma com alternativas

    identificadas por A, B, C, D e E. Para determinar os acertos, esta prova dever ser

    comparada ao seguinte gabarito: B, C, A, D, B, B, E, C, A, B, D, A, A, A, A, B, D, C,

    E, E, A, C, E, D, B.

    3. Um dado de jogo foi lanado 20 vezes. A partir dos resultados dos

    lanamentos, determinar o nmero de ocorrncias de cada face.

    4. Dados dois vetores A e B, ambos com 5 elementos, determinar o produto

    desses vetores.

    5. Dada um vetor de 10 nmeros inteiros, determinar o nmero de vezes que cada

    um deles ocorre no mesmo. Por exemplo o vetor = [7, 3, 9, 5, 9, 7, 2, 7, 7, 2],

    produziria a seguinte sada: 7 ocorre 4 vezes, 3 ocorre 1 vez, 9 ocorre 2 vezes, 5

    ocorre 1 vez e 2 ocorre 2 vezes.

    6. Em uma classe h 10 alunos, cada um dos quais realizou 3 provas com pesos

    distintos. Sendo que a primeira prova possui peso 3, a segunda possui peso 4 e a

    terceira peso 3. Aps o lanamento das notas das trs provas de cada aluno,calcular a mdia ponderada das provas para cada aluno.

    7. Dada uma seqncia de 5 nmeros inteiros, determinar a mdia.

    8. Dada uma matriz real A[4x3], verificar se existem elementos repetidos em A.

    9. Implemente o tradicional jogo da velha a partir de uma matriz 3 por 3. Sendo

    que a matriz deve representar os seguintes valores possveis: O, X e nulo (vazio).

    10. Uma matriz D[8x8] pode representar a posio atual de um jogo de damas,

    sendo que: nulo indica uma casa vazia; B indica uma casa ocupada por uma pea

    branca; e P indica uma casa ocupada por uma pea preta. Supondo que as peas

    pretas esto se movendo no sentido crescente das linhas da matriz, determinar

    as posies das peas pretas que: a) podem tomar peas brancas; b) podem

    mover-se sem tomar peas; c) no podem se mover.

    Estrutura de Dados 4

    Prof. Cludio L. V. Oliveira

  • 8/3/2019 ED-Estruturas Com Alocacao Estatica

    5/14

    Listas LinearesConsiste em um tipo de estrutura que permite representar um conjunto de

    dados de maneira a preservar a relao de ordem linear entre eles. Podem ser:

    contguas (alocao esttica) ou encadeadas (alocao dinmica). considerada

    uma das estruturas de dados mais simples. Exemplos de lista linear so os dias

    da semana: [segunda, tera, quarta, quinta, sexta, sbado, domingo] ou os

    andares de um edifcio: [subsolo, trreo, sobreloja, primeiro, segundo, ,

    ensimo]. Deste modo, uma lista linear pode ser entendida como uma seqncia

    de n elementos [a1, a2, ..., ai, ..., an], onde:

    O primeiro elemento da lista a1;

    O segundo elemento da lista a2;

    O i-simo elemento da lista ai;

    O ltimo elemento da lista an.

    Em uma lista linear contgua os elementos podem ser inseridos, removidos

    ou substitudos em qualquer posio.

    Exemplos de Operaesa) acessar o n-simo n da lista, para alter-lo ou simplesmente consult-lo;

    b) inserir um novo n na n-sima posio da lista;

    c) remover o n-simo n da lista;

    d) determinar o nmero de ns de uma lista

    e) localizar o n que contm um determinado valor;

    f) concatenar duas listas.

    Listas Lineares ContguasA representao por contigidade explora a seqencialidade da memria do

    computador, de tal forma que os ns de uma determinada lista sejam

    armazenados em endereos contguos.

    Implementao#include #include

    Estrutura de Dados 5

    Prof. Cludio L. V. Oliveira

    n n + 1 n + 2 n + 3 ... n + t

  • 8/3/2019 ED-Estruturas Com Alocacao Estatica

    6/14

    #define TAMANHO_LINHA 80#define TAMANHO 100

    int lista[TAMANHO];int fim = 0;

    char obter_caracter();int obter_numero(char *mensagem);char menu();int obter_posicao();

    void consultar_lista();void inserir_item();void alterar_item();void remover_item();void contar_nos();

    void procurar_no();

    int main(int argc, char* argv[]){ char opcao;while ((opcao = menu()) != '0'){ if (opcao == '1')

    consultar_lista();else if (opcao == '2')inserir_item();

    else if (opcao == '3')

    alterar_item();else if (opcao == '4')remover_item();

    else if (opcao == '5')contar_nos();

    else if (opcao == '6')procurar_no();

    }return 0;

    }

    void consultar_lista(){ printf ("\n\n Lista: ");for (int i = 0; i < fim; i++)printf ("%d, ", lista[i]);

    printf ("\n\n");}

    Estrutura de Dados 6

    Prof. Cludio L. V. Oliveira

  • 8/3/2019 ED-Estruturas Com Alocacao Estatica

    7/14

    void inserir_item(){ int posicao = obter_numero("Digite a posicao: ");int valor = obter_numero("Digite o valor: ");if ((posicao < 0) || (posicao > fim))printf ("A posicao digitada fora do intervalo!\n\n");

    else{ for (int i = (fim - 1); i >= posicao; i--)

    lista[i + 1] = lista[i];fim++;lista[posicao] = valor;

    }}

    void alterar_item(){ int posicao = obter_numero("Digite a posicao: ");int valor = obter_numero("Digite o valor: ");

    if ((posicao < 0) || (posicao >= fim))printf ("A posicao digitada fora do intervalo!\n\n");elselista[posicao] = valor;

    }

    void remover_item(){ int posicao = obter_numero("Digite a posicao: ");if ((posicao < 0) || (posicao >= fim))printf ("A posicao digitada fora do intervalo!\n\n");

    else{ for (int i = posicao; i < (fim - 1); i++)

    lista[i] = lista[i + 1];fim--;

    }}

    void contar_nos(){ printf ("A lista possui no momento %d nos.\n\n", fim);

    }

    Estrutura de Dados 7

    Prof. Cludio L. V. Oliveira

  • 8/3/2019 ED-Estruturas Com Alocacao Estatica

    8/14

    void procurar_no(){ int i;int valor = obter_numero("Digite o valor: ");bool achou = false;for (i = 0; i < fim; i++){ if (lista[i] == valor){ achou = true;

    break;}

    }if (achou)printf ("O no foi localizado na posicao %d.\n\n", i);

    elseprintf ("Nenhum no com o valor %d foi localizado.\n\n",

    valor);}

    char obter_caracter(){ char c[TAMANHO_LINHA];gets (c);return (c[0]);

    }

    int obter_numero(char *mensagem){ char n[TAMANHO_LINHA];if (mensagem)

    printf("%s", mensagem);gets (n);return (atoi(n));

    }

    char menu(){ printf("Digite a opcao desejada:\n\n");printf("1. Consultar a lista\n");printf("2. Inserir um elemento a lista\n");

    printf("3. Alterar um elemento da lista\n");printf("4. Remover um elemento da lista\n");printf("5. Determinar o numero de nos\n");printf("6. Localizar o no que possui determinado valor\n");printf("0. Encerrar");printf("=>");return (obter_caracter());

    }

    Estrutura de Dados 8

    Prof. Cludio L. V. Oliveira

  • 8/3/2019 ED-Estruturas Com Alocacao Estatica

    9/14

    Exerccios

    1) Desenvolver uma funo que verifique se uma lista linear contgua encontra-se

    vazia.

    2) Desenvolver uma funo que verifique se uma lista linear contgua encontra-se

    cheia.

    3) Elaborar uma funo que insira uma lista linear contgua ao final de outra lista

    linear contgua, ou seja, realize a concatenao das duas listas.

    4) Implementar uma agenda telefnica, utilizando uma lista linear contgua, com

    as seguintes operaes: a) consultar a agenda; b) inserir um elemento na agenda

    (em qualquer posio vlida); c) alterar um elemento da agenda; d) apagar um

    elemento da agenda; e) determinar o nmero de ns utilizados; f) localizar o no

    que possui determinado nome.

    Estrutura de Dados 9

    Prof. Cludio L. V. Oliveira

  • 8/3/2019 ED-Estruturas Com Alocacao Estatica

    10/14

    2

    7

    10

    12

    5

    Topo

    PilhasA pilha uma estrutura de dados com disciplina de acesso do tipo LIFO

    (Last In First Out), ou seja, o ltimo elemento que entra na pilha ser o primeiro a

    sair.

    Basicamente uma pilha deve oferecer as operaes de empilhar, ou seja,

    insero de um elemento no topo da pilha, desempilhar, isto , remover o

    elemento que est no topo e consultar, que consiste em obter o valor que est

    armazenado. Desta forma, possvel observar que todas as operaes em uma

    pilha ocorrem sempre a partir do topo.

    // Implementacao de uma pilha com alocao esttica

    #include #define TAM 100

    struct pilha{ int valor;};

    struct pilha p[TAM];int topo = 0;

    void empilhar(){ int v;if (topo < TAM)

    { printf ("\nDigite um numero: ");scanf ("%d", &v);p[topo].valor= v;topo++;

    }elseprintf("\nA pilha esta cheia!\n\n");

    }

    void desempilhar(){ if (topo > 0)topo--;

    elseprintf("\nA pilha esta vazia!\n\n");

    }

    void consultar(){ if (topo == 0)

    printf("\nA pilha esta vazia!\n\n");elseprintf("\nElemento do topo: %d\n\n", p[topo - 1].valor);

    Estrutura de Dados 10

    Prof. Cludio L. V. Oliveira

  • 8/3/2019 ED-Estruturas Com Alocacao Estatica

    11/14

    }

    int main (int argc, char *argv[]){ char opcao;do{ printf("IMPLEMENTACAO DE UMA PILHA COM ALOCACAO

    ESTATICA\n");

    printf("1.Empilhar\t2.Desempilhar\t3.Consultar\t0.Fim.Opcao? ");

    fflush(stdin);opcao = getchar();

    switch (opcao){ case '1': empilhar(); break;

    case '2': desempilhar(); break;case '3': consultar(); break;

    }} while (opcao != '0');return 0;

    }

    Estrutura de Dados 11

    Prof. Cludio L. V. Oliveira

  • 8/3/2019 ED-Estruturas Com Alocacao Estatica

    12/14

    12 8 9 2

    incio fim

    FilasUma estrutura de fila apresenta um tipo de acesso conhecido como FIFO

    (First In First Out), ou seja, o primeiro elemento a entre ser o primeiro a sair.

    Neste caso, torna-se necessrio, realizar o controle do incio e do final da fila,

    pois, inseres apenas so possveis ao seu final. Por outro lado, a consultas e

    retiradas podem ocorrer apenas no incio da fila.

    // Implementao de uma fila com alocao esttica

    #include #define TAM 100

    struct fila{ int valor;};

    struct fila f[TAM];int inicio = 0;int fim = -1;

    void inserir(){ int v;if (fim < (TAM - 1)){ printf ("\nDigite um numero: "); scanf ("%d", &v);fim++;

    f[fim].valor= v;}elseprintf("\nA fila esta cheia!\n\n");

    }

    void retirar(){ if (inicio > fim)

    printf("\nA fila esta vazia!\n\n");elseinicio++;

    }

    void consultar(){ if (inicio > fim)

    printf("\nA fila esta vazia!\n\n");elseprintf("\nElemento do inicio da fila: %d\n\n",

    f[inicio].valor);

    }

    Estrutura de Dados 12

    Prof. Cludio L. V. Oliveira

  • 8/3/2019 ED-Estruturas Com Alocacao Estatica

    13/14

    int main (int argc, char *argv[]){ char opcao;do{ printf("IMPLEMENTACAO DE UMA FILA COM ALOCACAO ESTATICA\n");printf("1. Inserir\t2. Retirar\t3. Consultar\t0. Fim. Opcao

    ? ");fflush(stdin);

    opcao = getchar();

    switch (opcao){ case '1': inserir(); break;case '2': retirar(); break;case '3': consultar(); break;

    }} while (opcao != '0');return 0;

    }

    Exerccios

    1. Considerando a seguinte estrutura de pilha:

    struct pilha{ int valor;

    };struct pilha p[100];int topo = 0;

    a) Escrever uma funo que remova todos os ns da pilha;

    b) Implementar um algoritmo que verifique se a pilha est vazia ou no;

    c) Desenvolver uma funo que empilhe um elemento apenas se ele for mltiplo

    do elemento que est no topo.

    d) Escrever um algoritmo que imprima todos os ns da pilha.

    2. Considerando a seguinte estrutura de fila:

    struct fila{ char nome[20];};struct fila f[100];int inicio = 0;int fim = -1;

    a) Escrever uma funo que remova todos os ns da fila;

    Estrutura de Dados 13

    Prof. Cludio L. V. Oliveira

  • 8/3/2019 ED-Estruturas Com Alocacao Estatica

    14/14

    b) Implementar um algoritmo que verifique se a fila est vazia ou no;

    c) Desenvolver um algoritmo que faa o re-aproveitamento das posies no

    utilizadas na fila, ou seja, as posies menores que o valor indicado pela varivel

    incio.

    d) Escrever uma funo que imprima todos os ns da fila.

    3. Escrever os algoritmos necessrios para inverter um determinado vetor V

    utilizando para isso, uma determinada pilha P com alocao esttica.

    4. Criar um algoritmo que permita realizar a insero de um elemento em uma fila

    com alocao esttica, desde que essa fila esteja vazia ou o elemento que ser

    inserido seja mltiplo do valor que se encontra no incio dessa fila.

    Estrutura de Dados 14

    Prof. Cludio L. V. Oliveira