A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Slides: Prof. João Fabro UTFPR - Curitiba

Apresentações semelhantes


Apresentação em tema: "Slides: Prof. João Fabro UTFPR - Curitiba"— Transcrição da apresentação:

1 Slides: Prof. João Fabro UTFPR - Curitiba
Computação 2 Linguagem C “Árvores com Alocação Dinâmica”. 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: Adriano Esq: Dir: Nome: Guilherme Esq: Dir: Nome:Luiz 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: Adriano Esq: Dir: Nome:Luiz 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: Adriano Esq: Dir: Nome:Luiz 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: Adriano Esq: Dir: Nome: Guilherme Esq: Dir: Nome:Luiz 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: Adriano Esq: Dir: Nome: Guilherme Esq: Dir: Nome:Luiz 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: Adriano Esq: Dir: Nome: Guilherme Esq: Dir: Nome:Luiz 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 #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); 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;

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);


Carregar ppt "Slides: Prof. João Fabro UTFPR - Curitiba"

Apresentações semelhantes


Anúncios Google