computação 2
DESCRIPTION
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 ! - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: Computação 2](https://reader035.vdocuments.site/reader035/viewer/2022062720/56813495550346895d9b8353/html5/thumbnails/1.jpg)
Computação 2
Slides: Prof. João Fabro
UTFPR - Curitiba
Linguagem C“Árvores com Alocação Dinâmica”.
![Page 2: Computação 2](https://reader035.vdocuments.site/reader035/viewer/2022062720/56813495550346895d9b8353/html5/thumbnails/2.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062720/56813495550346895d9b8353/html5/thumbnails/3.jpg)
Á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](https://reader035.vdocuments.site/reader035/viewer/2022062720/56813495550346895d9b8353/html5/thumbnails/4.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062720/56813495550346895d9b8353/html5/thumbnails/5.jpg)
Á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](https://reader035.vdocuments.site/reader035/viewer/2022062720/56813495550346895d9b8353/html5/thumbnails/6.jpg)
Á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](https://reader035.vdocuments.site/reader035/viewer/2022062720/56813495550346895d9b8353/html5/thumbnails/7.jpg)
Árvores com Alocação Dinâmica
NULL
Raiz:
![Page 8: Computação 2](https://reader035.vdocuments.site/reader035/viewer/2022062720/56813495550346895d9b8353/html5/thumbnails/8.jpg)
Árvores com Alocação Dinâmica
NULL
Raiz:
Insere_ordenado(&Raiz, “Joao”);
![Page 9: Computação 2](https://reader035.vdocuments.site/reader035/viewer/2022062720/56813495550346895d9b8353/html5/thumbnails/9.jpg)
Árvores com Alocação Dinâmica
Nome: JoaoEsq: Dir:
NULL NULL
nodo:NULL
novo_no:
![Page 10: Computação 2](https://reader035.vdocuments.site/reader035/viewer/2022062720/56813495550346895d9b8353/html5/thumbnails/10.jpg)
Árvores com Alocação Dinâmica
Nome: JoaoEsq: Dir:
NULL NULL
Raiz:
![Page 11: Computação 2](https://reader035.vdocuments.site/reader035/viewer/2022062720/56813495550346895d9b8353/html5/thumbnails/11.jpg)
Árvores com Alocação Dinâmica
Nome: JoaoEsq: Dir:
NULL NULL
Raiz:
Insere_ordenado(&Raiz, “Carlos”);
![Page 12: Computação 2](https://reader035.vdocuments.site/reader035/viewer/2022062720/56813495550346895d9b8353/html5/thumbnails/12.jpg)
Árvores com Alocação Dinâmica
Nome: JoaoEsq: Dir:
Nome: CarlosEsq: Dir:
NULL NULL
nodo:
novo_no:
![Page 13: Computação 2](https://reader035.vdocuments.site/reader035/viewer/2022062720/56813495550346895d9b8353/html5/thumbnails/13.jpg)
Árvores com Alocação Dinâmica
Nome: JoaoEsq: Dir:
Nome: CarlosEsq: Dir: NULL
NULL NULL
Raiz:
![Page 14: Computação 2](https://reader035.vdocuments.site/reader035/viewer/2022062720/56813495550346895d9b8353/html5/thumbnails/14.jpg)
Á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](https://reader035.vdocuments.site/reader035/viewer/2022062720/56813495550346895d9b8353/html5/thumbnails/15.jpg)
Á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](https://reader035.vdocuments.site/reader035/viewer/2022062720/56813495550346895d9b8353/html5/thumbnails/16.jpg)
Á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](https://reader035.vdocuments.site/reader035/viewer/2022062720/56813495550346895d9b8353/html5/thumbnails/17.jpg)
Á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](https://reader035.vdocuments.site/reader035/viewer/2022062720/56813495550346895d9b8353/html5/thumbnails/18.jpg)
Á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](https://reader035.vdocuments.site/reader035/viewer/2022062720/56813495550346895d9b8353/html5/thumbnails/19.jpg)
Á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](https://reader035.vdocuments.site/reader035/viewer/2022062720/56813495550346895d9b8353/html5/thumbnails/20.jpg)
Á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](https://reader035.vdocuments.site/reader035/viewer/2022062720/56813495550346895d9b8353/html5/thumbnails/21.jpg)
Á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](https://reader035.vdocuments.site/reader035/viewer/2022062720/56813495550346895d9b8353/html5/thumbnails/22.jpg)
Á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](https://reader035.vdocuments.site/reader035/viewer/2022062720/56813495550346895d9b8353/html5/thumbnails/23.jpg)
Á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](https://reader035.vdocuments.site/reader035/viewer/2022062720/56813495550346895d9b8353/html5/thumbnails/24.jpg)
Árvores Binários: Listagem Ordenada!
• Agora como fazer para listar todos os nomes, em ordem alfabética?
![Page 25: Computação 2](https://reader035.vdocuments.site/reader035/viewer/2022062720/56813495550346895d9b8353/html5/thumbnails/25.jpg)
Á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](https://reader035.vdocuments.site/reader035/viewer/2022062720/56813495550346895d9b8353/html5/thumbnails/26.jpg)
#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](https://reader035.vdocuments.site/reader035/viewer/2022062720/56813495550346895d9b8353/html5/thumbnails/27.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062720/56813495550346895d9b8353/html5/thumbnails/28.jpg)
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); }}