Computação 2 Slides: Prof. João Fabro UTFPR - Curitiba Linguagem C Árvores com Alocação...

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

Transcript of Computação 2 Slides: Prof. João Fabro UTFPR - Curitiba Linguagem C Árvores com Alocação...

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

Computação 2

Slides: Prof. João Fabro

UTFPR - Curitiba

Linguagem C“Árvores com Alocação Dinâmica”.

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

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

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

Á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

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

Exemplo de Árvore

Nome: JoaoEsq: Dir:

Nome: CarlosEsq: Dir:

Nome: PauloEsq: Dir:

Nome: AdrianoEsq: Dir:

Nome: GuilhermeEsq: Dir:

Nome:Luiz Esq: Dir:

Nome: RibamarEsq: Dir:

NULL NULL NULL NULLNULL NULLNULL NULL

Árvore:

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

Á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

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

Árvores com Alocação Dinâmicavoid 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);

}

}

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

Árvores com Alocação Dinâmica

NULL

Raiz:

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

Árvores com Alocação Dinâmica

NULL

Raiz:

Insere_ordenado(&Raiz, “Joao”);

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

Árvores com Alocação Dinâmica

Nome: JoaoEsq: Dir:

NULL NULL

nodo:NULL

novo_no:

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

Árvores com Alocação Dinâmica

Nome: JoaoEsq: Dir:

NULL NULL

Raiz:

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

Árvores com Alocação Dinâmica

Nome: JoaoEsq: Dir:

NULL NULL

Raiz:

Insere_ordenado(&Raiz, “Carlos”);

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

Árvores com Alocação Dinâmica

Nome: JoaoEsq: Dir:

Nome: CarlosEsq: Dir:

NULL NULL

nodo:

novo_no:

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

Árvores com Alocação Dinâmica

Nome: JoaoEsq: Dir:

Nome: CarlosEsq: Dir: NULL

NULL NULL

Raiz:

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

Árvores com Alocação Dinâmica

Nome: JoaoEsq: Dir:

Nome: CarlosEsq: Dir: NULL

NULL NULL

Raiz:

Insere_ordenado(&Raiz, “Adriano”);

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

Árvores com Alocação Dinâmica

Nome: JoaoEsq: Dir:

Nome: CarlosEsq: Dir:

Nome: AdrianoEsq: Dir:

NULL NULL

Raiz:

NULL

NULL

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

Árvores com Alocação Dinâmica

Nome: JoaoEsq: Dir:

Nome: CarlosEsq: Dir:

Nome: AdrianoEsq: Dir:

NULL NULL

Raiz:

NULL

NULL

Insere_ordenado(&Raiz, “Paulo”);

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

Árvores com Alocação Dinâmica

Nome: JoaoEsq: Dir:

Nome: CarlosEsq: Dir:

Nome: PauloEsq: Dir:

Nome: AdrianoEsq: Dir:

NULL NULLNULL

NULL NULL

Raiz:

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

Árvores com Alocação Dinâmica

Nome: JoaoEsq: Dir:

Nome: CarlosEsq: Dir:

Nome: PauloEsq: Dir:

Nome: AdrianoEsq: Dir:

NULL NULLNULL

NULL NULL

Raiz:

Insere_ordenado(&Raiz, “Luiz”);

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

Árvores com Alocação Dinâmica

Nome: JoaoEsq: Dir:

Nome: CarlosEsq: Dir:

Nome: PauloEsq: Dir:

Nome: AdrianoEsq: Dir:

Nome:Luiz Esq: Dir:

NULL NULL

NULLNULL

NULL NULL

Raiz:

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

Árvores com Alocação Dinâmica

Nome: JoaoEsq: Dir:

Nome: CarlosEsq: Dir:

Nome: PauloEsq: Dir:

Nome: AdrianoEsq: Dir:

Nome:Luiz Esq: Dir:

NULL NULL

NULLNULL

NULL NULL

Raiz:

Insere_ordenado(&Raiz, “Guilherme”);

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

Árvores com Alocação Dinâmica

Nome: JoaoEsq: Dir:

Nome: CarlosEsq: Dir:

Nome: PauloEsq: Dir:

Nome: AdrianoEsq: Dir:

Nome: GuilhermeEsq: Dir:

Nome:Luiz Esq: Dir:

NULL NULL

NULL

NULL NULLNULL NULL

Raiz:

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

Árvores com Alocação Dinâmica

Nome: JoaoEsq: Dir:

Nome: CarlosEsq: Dir:

Nome: PauloEsq: Dir:

Nome: AdrianoEsq: Dir:

Nome: GuilhermeEsq: Dir:

Nome:Luiz Esq: Dir:

NULL NULL

NULL

NULL NULLNULL NULL

Raiz:

Insere_ordenado(&Raiz, “Ribamar”);

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

Árvores com Alocação Dinâmica

Nome: JoaoEsq: Dir:

Nome: CarlosEsq: Dir:

Nome: PauloEsq: Dir:

Nome: AdrianoEsq: Dir:

Nome: GuilhermeEsq: Dir:

Nome:Luiz Esq: Dir:

Nome: RibamarEsq: Dir:

NULL NULL NULL NULLNULL NULLNULL NULL

Raiz:

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

Árvores Binários: Listagem Ordenada!

• Agora como fazer para listar todos os nomes, em ordem alfabética?

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

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

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

#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; }

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

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

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

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