【问题标题】:segmentation error searching through binary tree通过二叉树搜索分段错误
【发布时间】:2013-11-08 18:48:52
【问题描述】:

我在二叉树中搜索匹配项时收到分段错误。如果找到匹配项,它不会给我一个分段错误,但如果它没有找到任何东西,它就没有正确完成。有人能指出我正确的方向吗?我做错了什么。

void search() {
    char temp,temp1[15];
    struct node *s=root;
    int i=0;

    do{
        printf("Enter Name To Be Searched\n");
        scanf("%s",temp1);
        getchar();
        i=0;
        s=root;
        while(s!=NULL && i==0){
            if(strcmp(s->data,temp1)< 0)
                s=s->right;
            if(strcmp(s->data,temp1)>0)
                s=s->left;
            if(strcmp(s->data,temp1)==0)
                i=1;
        }
        if(i==0)
            printf("Element Not Found\n");
        else
            printf("Element Found\n");
        printf("Enter More Elements[Y/N]:\n");
        temp=getchar();
        printf("%c", temp);
    }while(temp=='y');
}

【问题讨论】:

  • “如果找到匹配项,它不会给我一个分段错误”这消除了您的错误的几个可能原因。在来这里之前,您是否在调试器中运行过它?

标签: c pointers memory segmentation-fault binary-search-tree


【解决方案1】:

你改变 s 然后在下一个 if 语句中再次比较它。还想一想,如果某个东西不大于零也不小于零,那么它一定是相等的。

while (s!=NULL) {
    const int cmp = strcmp(s->data,temp1);
    if (cmp < 0) 
        s = s->right;
    else if (cmp > 0)
        s = s->left;
    else {
        i = 1;
        break;
    }
}

试试看。

【讨论】:

  • 也许扩展这个主题并停止不必要地调用相同的函数。在那个循环中应该只有一个strcmp(),并且它的结果应该保留以便在其中进行评估。 (和 +1)
  • @fonZ 不,我的意思是使用相同的参数 within 对同一个 proc 的两次调用不需要循环。调用一次,将结果保存在临时文件中,然后在临时文件中运行 if-else-if-else 逻辑;不要再打电话给strcmp()。顺便说一句,如果优化器有头脑的话,无论如何它都可能会这样做,但无论如何代码都应该这样做。
【解决方案2】:

如果没有子节点,您的子节点指针可能不为空

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    相关资源
    最近更新 更多