Gente estou com um pequeno problema. estyou tentando construir um programa em que armazena os itens em uma árvore binaria ate agora fiz três funções mas estou com uns problemas.
1- A função strcmp sempre retornar 1;
2 - no modo debug, acompanhamos os valores das variaveis raiz->item e i e teremos algo do tipo
Pergunta
Josefran
Gente estou com um pequeno problema. estyou tentando construir um programa em que armazena os itens em uma árvore binaria ate agora fiz três funções mas estou com uns problemas.
1- A função strcmp sempre retornar 1;
2 - no modo debug, acompanhamos os valores das variaveis raiz->item e i e teremos algo do tipo
raiz->item = "10º\ráº\ráº\ráº\ráº\ráº\ráº\ráº\ráº\ráº\ráº\ráº\ráº\ráº\ráº\ráº\ráº\ráº\ráº\ráº"
i = "10"
dai sempre strcmp retorna 1.
e ai o que tem de errado como faço?
Código
#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct tree arv; struct tree{ char item[80]; arv *dir; arv *esq; } *raiz=NULL; int busca(char i[80]); int adiciona(char i[80]); int remove(char i[80]); void imp(); void imppre(); void imppos(); void imps(); void *mallocX (unsigned int nbytes); void menu1(); void menu2(); void *mallocX (unsigned int nbytes) /* Função que aloca memoria, testa o retorno e retorna um ponteiro tipo void */ { void *ptr; ptr = malloc (nbytes); if (ptr == NULL) {/* Verifica valor retornado */ printf ("Socorro! malloc devolveu NULL!\n"); exit (EXIT_FAILURE); } return ptr; } int adiciona(char i[80]){//Função para adicionar os elementos na árvore arv *p; if(!raiz){//Verifica se a árvore esta vazia raiz = (arv *)mallocX(sizeof(arv)); strcpy(raiz->item, i); raiz->dir = NULL; raiz->esq = NULL; return 1; } p = raiz; while(p){//percorre a arvore em busca do seu local if(strcmp(p->item, i) > 0){ p = p->esq; } else{ p = p->dir; } } p = (arv *)mallocX(sizeof(arv));//adiciona o item na arvore strcpy(p->item, i); p->dir = NULL; p->esq = NULL; return 1; } int remove(char i[80]){//remove o item da arvore arv *p1=NULL, *p2=NULL, *p3=NULL, *p4=NULL, *p5=NULL; int j, k=0; p1 = raiz; p2 = raiz; p3 = p1->dir; p4 = p1->esq; printf("Atencao o procedimento de remover o no da arvore adotara por padra o anexamento da sub-arvore maior na menos\n"); if(!raiz){//Verifica se árvore esta vazia printf("A arvore esta vazia"); return 1; } else{ if(!strcmp(raiz->item, i)){//Verifica se o item esta na raiz da árvore p2 = p2->esq; raiz = p2; while(p2){ p2=p2->dir; } p2->dir = p3; free(p1); return 1; } while((j = strcmp(p2->item, i))&&(p2)){//Procura o item na arvore if(j<0){ p1 = p2; p2 = p2->dir; if(p2){ p3 = p2->dir; p4 = p2->esq; k = 0; } } else{ p1 = p2; p2 = p2->esq; if(p2){ p3 = p2->dir; p4 = p2->esq; k = 1; } } } if(!p2){ printf("O item não esta na arvore\n"); return 1; } if(k){ p1->dir = p4; p1 = p4; while(p1){ p1 = p1->dir; } p1 = p3; free(p2); return 1; } p1->esq = p4; p1 = p4; while(p1){ p1 = p1->dir; } p1 = p3; free(p2); return 1; } } int busca(char i[80]){ arv *p; int k; p = raiz; while((p)&&(k = strcmp(p->item, i))){ if(k<0){ p = p->dir; } else{ p = p->esq; } } if(!p) return 0; return 1; } void menu1(){ int k, j=0; char i[80], l[80]; do{ system("cls"); printf("\nDigite a opcao correspondente;\n\t1 - Inserir item na arvore;\n\t2 - Remover item da arvore;\n\t3 - Buscar item na árvore\n\t4 - Imprimir itens da árvore;\n\tSair\n"); scanf("%d", &k); switch(k){ case 1: system("cls"); printf("\nDigite o nome do item\n"); scanf("%s", &l); strcpy(i, l); j = adiciona(i); if(j){ printf("\n\nItem adicionado com sucesso!\n"); system("pause"); } break; case 2: system("cls"); printf("\nDigite o nome do item\n"); scanf("%s", &l); strcpy(i, l); j = remove(i); if(j){ printf("\n\nItem removido com sucesso!\n"); system("pause"); } break; case 3: system("cls"); printf("\nDigite o nome do item\n"); scanf("%s", &l); strcpy(i, l); j = busca(i); if(j){ printf("\n\nItem esta na arvore\n"); system("pause"); } else{ printf("\n\nO item não esta na arvore\n"); system("pause"); } break; }}while(k != 4); } int main(){ menu1(); }Editado por JosefranLink para o comentário
Compartilhar em outros sites
2 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.