Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- typedef long TipoChave;
- typedef struct Regist {
- TipoChave Chave;
- } Registro;
- struct No {
- Registro Reg;
- struct No *pEsq, *pDir;
- };
- //-----------------------Funções
- void Pesquisa(Registro *x, struct No *p);
- void Inicializa(struct No *Dicionario);
- void Insere(Registro x, struct No **p)
- void Antecessor(struct No *q, struct No **r);
- void Retira(Registro x, struct No **p);
- //-----------------------Main
- int main()
- {
- struct No *arvore, *resgate;
- Inicializa(arvore);
- int confere;
- Registro dado;
- Leia: printf("Digite: ");
- scanf("%li", &dado.Chave);
- Insere(dado,arvore);
- printf("Feito!\n");
- printf("Inserir outro número? ");
- scanf("%d", confere);
- if (confere == 1)
- goto Leia;
- Pesquise: printf("Digite: ");
- scanf("%li", &resgate->Reg.Chave);
- Pesquisa(resgate,arvore);
- printf("Feito!\n");
- printf("Pesquisar por outro? ");
- scanf("%d", confere);
- if (confere == 1)
- goto Pesquise;
- Remova: printf("Digite: ");
- scanf("%li", &resgate->Reg.Chave);
- Retira(resgate->Reg,arvore);
- printf("Feito!\n");
- printf("Remover outro? ");
- scanf("%d", confere);
- if (confere == 1)
- goto Remova;
- return 0;
- }
- //-----------------------Métodos
- void Pesquisa(Registro *x, struct No *p)
- {
- if (p == NULL)
- {
- printf("Erro : Registro nao esta presente na arvore\n");
- return;
- }
- if (x->Chave < p->Reg.Chave)
- {
- Pesquisa(x, p->pEsq);
- return;
- }
- if (x->Chave > p->Reg.Chave)
- Pesquisa(x, p->pDir);
- else
- *x = p->Reg;
- }
- void Inicializa(struct No *Dicionario)
- {
- Dicionario = NULL;
- }
- void Insere(Registro x, struct No **p)
- {
- if ((*p) == NULL)
- {
- (*p) = (struct No*)malloc(sizeof(struct No));
- (*p)->Reg = x;
- (*p)->pEsq = NULL;
- (*p)->pDir = NULL;
- return;
- }
- if (x.Chave < (*p)->Reg.Chave)
- {
- Insere(x, &(*p)->pEsq);
- return;
- }
- if (x.Chave > (*p)->Reg.Chave)
- Insere(x, &(*p)->pDir);
- else
- printf("Erro : Registro ja existe na arvore\n");
- }
- void Retira(Registro x, struct No **p)
- {
- if ((*p) == NULL)
- {
- printf("Erro : Registro nao esta na arvore\n");
- return;
- }
- if (x.Chave < (*p)->Reg.Chave)
- {
- Retira(x, &(*p)->pEsq);
- return;
- }
- if (x.Chave > (*p)->Reg.Chave)
- {
- Retira(x, &(*p)->pDir);
- return;
- }
- if ((*p)->pDir == NULL)
- {
- struct No *Aux;
- Aux = (*p);
- (*p) = (*p)->pEsq;
- free(Aux);
- return;
- }
- if ((*p)->pEsq != NULL)
- {
- Antecessor((*p), (*p)->pEsq);
- return;
- }
- // ((*p)->pEsq == NULL)
- struct No *Aux;
- Aux = (*p);
- (*p) = (*p)->pDir;
- free(Aux);
- }
- void Antecessor(struct No *q, struct No **r)
- {
- struct No *aux;
- if (r->pDir != NULL)
- {
- Antecessor(q, &(*r)->pDir);
- return;
- }
- q->Reg = (*r)->Reg;
- aux = (*r);
- (*r) = (*r)->pEsq;
- free(aux);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement