【问题标题】:Linear search is not returning the right index线性搜索没有返回正确的索引
【发布时间】:2018-05-05 22:38:59
【问题描述】:

我的线性搜索总是返回-1,我不知道为什么。我试图弄清楚但没有成功。搜索功能每次都转到“else”分支,“then”永远不会执行。

#include <stdio.h>
#include <stdlib.h>
#define size 50000

int search(int n,int s,int v[s])
{
    int i;
    for(i=0;i<s;++i)
    {
        if(v[i]==n)
            return i;
        else
            return -1;
    }
}

int main(void)
{
    int valores[size];
    //start the vector and put values in it.
    for(int i=0;i<size;++i)
        valores[i]=(i+1)*2;
    //search the 50000 values
    for(int i=1;i<=size +1;++i)
    {
        int p=search(2*i,size,valores);
        if(p==-1)
            printf("Not found %d\n",i);
        else if(valores[p]!=2*i)
            printf("Found %d in wrong index: %d\n",i,p);
    }

    return 0;
}

【问题讨论】:

  • 严格编译时是否收到任何警告?例如。 gcc -Wall.
  • 是的,我收到此警告:控件到达非无效函数的末尾。
  • 关于:for(int i=1;i&lt;=size +1;++i) 在 C 中,数组索引的范围是 0...(数组中的元素数 -1)。因此该语句将跳过第一个条目并访问数组末尾的 1。超出数组末尾的访问是未定义的行为
  • 关于警告信息,只需将 return -1; 移动到最后一个右大括号 '}' 之前,而不是作为循环内的最后一条语句,在函数中:search()

标签: c linear-search


【解决方案1】:

您总是在第一个索引 0 之后离开搜索功能;
因为在 0 时它要么相同并返回 i,要么不相同并返回 -1。
如果您将n 指定为v[0],我假设它确实返回0,而不是-1。
改变这种方式:

for(i=0;i<s;++i)
{
    if(v[i]==n)
        return i;
}
return -1;

您会收到您在评论中提到的警告(“控制到达非 void 函数的末尾”),因为您的函数末尾没有 return。它当然是无法访问的,但警告可能是发现问题的提示。

【讨论】:

  • 编译后警告消失,但没有显示。
  • 什么意思?我建议的代码没有收到警告,但是运行时它没有打印任何内容?
  • 我认为这意味着一切都很完美,没有错误,没有错误的索引。否则,要确保某些输出:您有一个 if-elseif,请将其更改为 if-elseif-else。 IE。添加else printf("neither, index: %d\n", p);
猜你喜欢
  • 2018-07-18
  • 2019-03-02
  • 1970-01-01
  • 2017-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-15
  • 1970-01-01
相关资源
最近更新 更多