1 / 28

Computação 2

Linguagem C “Árvores com Alocação Dinâmica”. Computação 2. Slides: Prof. João Fabro UTFPR - Curitiba. O que são “Árvores” em Programação?. Árvores são estruturas de dados com alocação dinâmica, parecidas com Listas Encadeadas !

Download Presentation

Computação 2

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Linguagem C“Árvores com Alocação Dinâmica”. Computação 2 Slides: Prof. João Fabro UTFPR - Curitiba

  2. O que são “Árvores” em Programação? • Árvores são estruturas de dados com alocação dinâmica, parecidas com Listas Encadeadas! • A diferença é que cada Elemento (ou nodo ou nó) possui, além dos dados a serem armaze-nados, dois outros ponteiros: • Um para o ramo da direita • Outro para o ramo da esquerda

  3. Árvores com Alocação Dinâmica struct Elemento { char nome [100]; struct Elemento* esq; struct Elemento* dir; }; struct Elemento*Arvore; //Ponteiro para o “topo” da Árvore

  4. Exemplo de Árvore Árvore: Nome: Joao Esq: Dir: Nome: Carlos Esq: Dir: Nome: Paulo Esq: Dir: Nome:Luiz Esq: Dir: Nome: Adriano Esq: Dir: Nome: Guilherme Esq: Dir: Nome: Ribamar Esq: Dir: NULL NULL NULL NULL NULL NULL NULL NULL

  5. Árvores com Alocação Dinâmica struct Elemento { char nome [100]; struct Elemento* esq; struct Elemento* dir; }; struct Elemento*Raiz; //Ponteiro para o “topo” da Árvore

  6. Árvores com Alocação Dinâmica void insere_nome_ordenado (struct Elemento **nodo, char *nominho) { struct Elemento *novo_no; novo_no = (struct Elemento *) malloc(sizeof(struct Elemento) ); strcpy(novo_no->nome, nominho); if(*nodo == NULL) // A árvore está vazia!!! { novo_no->esq = NULL; novo_no->dir = NULL; *nodo = novo_no; } else // A arvore não está vazia!!! { if (strcmp(*nodo->nome, nominho)>0) insere_ordenado(&(nodo->dir), nominho); else insere_ordenado(&(nodo->esq), nominho); } }

  7. Árvores com Alocação Dinâmica Raiz: NULL

  8. Árvores com Alocação Dinâmica Raiz: NULL Insere_ordenado(&Raiz, “Joao”);

  9. Árvores com Alocação Dinâmica nodo: NULL Nome: Joao Esq: Dir: novo_no: NULL NULL

  10. Árvores com Alocação Dinâmica Raiz: Nome: Joao Esq: Dir: NULL NULL

  11. Árvores com Alocação Dinâmica Raiz: Nome: Joao Esq: Dir: NULL NULL Insere_ordenado(&Raiz, “Carlos”);

  12. Árvores com Alocação Dinâmica nodo: Nome: Joao Esq: Dir: novo_no: Nome: Carlos Esq: Dir: NULL NULL

  13. Árvores com Alocação Dinâmica Raiz: Nome: Joao Esq: Dir: Nome: Carlos Esq: Dir: NULL NULL NULL

  14. Árvores com Alocação Dinâmica Raiz: Nome: Joao Esq: Dir: Nome: Carlos Esq: Dir: NULL NULL NULL Insere_ordenado(&Raiz, “Adriano”);

  15. Árvores com Alocação Dinâmica Raiz: Nome: Joao Esq: Dir: Nome: Carlos Esq: Dir: NULL Nome: Adriano Esq: Dir: NULL NULL NULL

  16. Árvores com Alocação Dinâmica Raiz: Nome: Joao Esq: Dir: Nome: Carlos Esq: Dir: NULL Nome: Adriano Esq: Dir: NULL NULL NULL Insere_ordenado(&Raiz, “Paulo”);

  17. Árvores com Alocação Dinâmica Raiz: Nome: Joao Esq: Dir: Nome: Carlos Esq: Dir: Nome: Paulo Esq: Dir: Nome: Adriano Esq: Dir: NULL NULL NULL NULL NULL

  18. Árvores com Alocação Dinâmica Raiz: Nome: Joao Esq: Dir: Nome: Carlos Esq: Dir: Nome: Paulo Esq: Dir: Nome: Adriano Esq: Dir: NULL NULL NULL NULL NULL Insere_ordenado(&Raiz, “Luiz”);

  19. Árvores com Alocação Dinâmica Raiz: Nome: Joao Esq: Dir: Nome: Carlos Esq: Dir: Nome: Paulo Esq: Dir: Nome:Luiz Esq: Dir: Nome: Adriano Esq: Dir: NULL NULL NULL NULL NULL NULL

  20. Árvores com Alocação Dinâmica Raiz: Nome: Joao Esq: Dir: Nome: Carlos Esq: Dir: Nome: Paulo Esq: Dir: Nome:Luiz Esq: Dir: Nome: Adriano Esq: Dir: NULL NULL NULL NULL NULL NULL Insere_ordenado(&Raiz, “Guilherme”);

  21. Árvores com Alocação Dinâmica Raiz: Nome: Joao Esq: Dir: Nome: Carlos Esq: Dir: Nome: Paulo Esq: Dir: Nome:Luiz Esq: Dir: Nome: Adriano Esq: Dir: Nome: Guilherme Esq: Dir: NULL NULL NULL NULL NULL NULL NULL

  22. Árvores com Alocação Dinâmica Raiz: Nome: Joao Esq: Dir: Nome: Carlos Esq: Dir: Nome: Paulo Esq: Dir: Nome:Luiz Esq: Dir: Nome: Adriano Esq: Dir: Nome: Guilherme Esq: Dir: NULL NULL NULL NULL NULL NULL NULL Insere_ordenado(&Raiz, “Ribamar”);

  23. Árvores com Alocação Dinâmica Raiz: Nome: Joao Esq: Dir: Nome: Carlos Esq: Dir: Nome: Paulo Esq: Dir: Nome:Luiz Esq: Dir: Nome: Adriano Esq: Dir: Nome: Guilherme Esq: Dir: Nome: Ribamar Esq: Dir: NULL NULL NULL NULL NULL NULL NULL NULL

  24. Árvores Binários: Listagem Ordenada! • Agora como fazer para listar todos os nomes, em ordem alfabética?

  25. Árvores Binários: Listagem Ordenada! • Agora como fazer para listar todos os nomes, em ordem alfabética? void listar_ordenado (struct Elemento* raiz) { if(raiz!=NULL) { listar_ordenado(raiz->esq); printf(“%s\n”, raiz->nome); listar_ordenado(raiz->dir); } }

  26. int main() { char escolha; Raiz = NULL; //Inicia a Árvore Vazia! for ( ; ; ) { escolha = menu (); switch ( escolha ) { case ‘i' : case ‘I' : { insere(); } break; case ‘l' : case ‘L' : { listar_ordenado(Raiz); } break; case ‘r' : case ‘R' : { remove(Raiz); } break; case ‘t' : case ‘T' : { exit ( 0 ); } break; default : { printf ( "Opcao invalida. \n" ); } } printf ( "\n \n \n" ); } system ( "Pause" ); return 0; } #include <stdio.h> #include <stdlib.h> #include <string.h> struct Elemento { char nome [100]; struct Elemento* esq; struct Elemento* dir; }; struct Elemento* Raiz;//Ponteiro para a “Raiz” // da Árvore char menu (); void insere (); void insere_ordenado (struct Elemento **nodo, char *nominho); void listar_ordenado (struct Elemento* raiz); void remove (struct Elemento *nodo);

  27. void insere () { system ( "cls" ); printf ( "\n \n \n" ); char nome_local[100]; printf ( "Digite o Nome a inserir na Arvore: \n" ); fflush ( stdin ); gets (nome_local ); insere_ordenado(&Raiz, nome_local); } void remove (struct Elemento *nodo) { if(nodo!= NULL) { remove(nodo->esq); remove(nodo->dir); free(nodo); } }

  28. char menu () { printf ("\n \n \n"); char opcao; printf ( "(I)nserir novo nome na Arvore. \n" ); printf ( "(L)istar ordenados . \n" ); printf ( "(R)emover Todos os Nomes da Arvore.\n" ); printf ( "(T)erminar. \n" ); fflush ( stdin ); scanf ( "%c", &opcao ); return opcao; } void listar_ordenado (struct Elemento* raiz) { if(raiz!=NULL) { listar_ordenado(raiz->esq); printf("%s\n", raiz->nome); listar_ordenado(raiz->dir); } } void insere_ordenado (struct Elemento **nodo, char *nominho) { struct Elemento *novo_no; novo_no = (struct Elemento *) malloc(sizeof(struct Elemento) ); strcpy(novo_no->nome, nominho); if(*nodo == NULL) // A árvore está vazia!!! { novo_no->esq = NULL; novo_no->dir = NULL; *nodo = novo_no; } else // A arvore não está vazia!!! { if (strcmp((*nodo)->nome, nominho)<0) insere_ordenado(&(*nodo)->dir, nominho); else insere_ordenado(&(*nodo)->esq, nominho); } }

More Related