Ir para conteúdo
Fórum Script Brasil
  • 0

Problema com strcmp( ou sera strcpy)


Josefran

Pergunta

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 Josefran
Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Se a função strcmp está retornando valor diferente de 0 as strings são diferentes.

Use printf para debbugar.

Antes da comparação imprima as duas strings e veja se são iguais.

Mesmo aparentemente iguais na visualização uma string pode conter por exemplo uma quebra de linha por isso importante também ver o tamanho da string.

Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...