线性搜索代码显示我的项目不存在。请帮助我进行更正

Posted

技术标签:

【中文标题】线性搜索代码显示我的项目不存在。请帮助我进行更正【英文标题】:Linear Search Code Shows that my item is not present.Please help me make corrections 【发布时间】:2017-01-30 13:43:18 【问题描述】:

这是线性搜索的函数,我只取一个变量 x 来搜索项目变量

int lsrch(int x)
    int i;
    int arr[6] = 2,4,5,76,2,1;
    for(i=0;i<5;i++)
    
        if(x==arr[i])
        
            return i;
        
        else
            return -1;
    
    

    int main()
    
        int a,b;
        a=lsrch(76);

76 存在,所以它应该显示它的索引位置,但它显示 -1 表示两者都不存在,对于第二个测试用例来说都是真的

        b=lsrch(99);
        printf("%d",a);
        printf("%d",b);
    

【问题讨论】:

使用调试器并单步执行代码,问题应该很快就会很明显。 您是否忽略了编译器错误?我得到“a.c:13:5: warning: control may reach end of non-void function [-Wreturn-type]”,这表明返回语句放错位置的问题。 不要彻底编辑问题。我已将其退回到原来的问题。如此戏剧性地改变问题会使所有答案都无效 - 尤其是将语言从 C 更改为 Python!。如果您还有其他问题,请提出新问题。 对不起,我弄错了,非常感谢!! 【参考方案1】:

问题是你过早地跳出循环。

int lsrch(int x)
   
    int i;
    int arr[6] = 2,4,5,76,2,1;
    for(i=0;i<5;i++)
    
        if(x==arr[i])
        
            return i;
        
        else
            return -1;      // Incorrect
    

正如所写,一旦您的代码发现与x 不匹配的数字,它将返回-1。它永远不会继续检查arr 中的其余数字。

如果你用gcc -Wall -Werror编译,编译器会指出你犯了一个错误:

linsearch.c: In function ‘lsrch’:
linsearch.c:17:1: warning: control reaches end of non-void function [-Wreturn-type]
 
 ^

这意味着在循环结束的情况下您不会返回任何内容 - 导致未定义的行为。


解决方案是将return -1 推迟到之后循环耗尽arr 中的所有值。

此外,您的循环在 i == 5 时终止,但您尚未检查 arr 中的最后一个数字。让我们使用宏来避免对这个值进行硬编码。

#define ARRAY_LEN(x)    (sizeof(x) / sizeof(x[0]))

int lsrch(int x)
   
    int i;
    int arr[] = 2,4,5,76,2,1;
    for(i=0; i<ARRAY_LEN(arr); i++)
    
        if(x==arr[i])
        
            return i;
        
    

    return -1;    // Nothing left to check

【讨论】:

@BLUEPIXY 谢谢。用ARRAY_LEN 修复。【参考方案2】:

代码中的逻辑错误 - 您的代码的以下部分不正确 -

  if(x==arr[i])
   
       return i
    
    else 
         return -1

如果条件评估为 false 并返回 -1,则在第一次通过时。

正确的代码 -

int lsrch(int x)
   
    int i;
    int arr[6] = 2,4,5,76,2,1;
    for(i=0;i<=5;i++)
   
      if(x==arr[i])
      
        return i;
      

   
       return -1;
   

  int main()
  
      int a,b;
      a=lsrch(76);
  return 0;
  

【讨论】:

不只是发布“固定”代码,也许您可​​以告诉 OP 您更改了什么?是什么让这项工作奏效? @Some 程序员老兄。我编辑了我的答案。感谢您的反馈【参考方案3】:
int lsrh(int x)
    int i,a[6]=2,4,5,76,2,1;
    for(i=0;i<6;i++)
        if(a[i]==x)
             return i;
        
    return -1;

使用它会起作用

【讨论】:

以上是关于线性搜索代码显示我的项目不存在。请帮助我进行更正的主要内容,如果未能解决你的问题,请参考以下文章

简单的线性搜索测试(python)

突出显示搜索词

更改返回视图以在 laravel 搜索功能上返回路线

更正 cURL 的代码

更正 CMakeList.txt 文件以进行 Google 测试?

为啥我的线性搜索总是返回 false,即使该项目在数组中?