线性搜索以反向顺序

时间:2014-06-18 19:26:30

标签: c search reverse linear

我试图以相反的顺序实现线性搜索算法,但问题是这段代码编译得很好,没有显示任何错误。但在运行时它没有显示任何输出。为什么??如果有任何问题请帮我清除。

#include<stdio.h>
int reverse(int a[], int key)
{
    int i = sizeof(a) - 1;
    while (i >= 0)
        if (a[i] == key)
            return i;
        i--;
     return -1;
}
int main()
{
int x;
int arr[] = {3, 2, 4, 5, 1};
x = reverse(arr, 4);
printf("%d\n", x);
return 0;
}

2 个答案:

答案 0 :(得分:4)

你的缩进是误导。你的意思是:

int reverse(int a[], int key) {
    int i = sizeof(a) - 1;
    while (i >= 0) {
        if (a[i] == key) {
            return i;
        }
        i--;
    }
    return -1;
}

你写的内容相当于:

int reverse(int a[], int key) {
    int i = sizeof(a) - 1;
    while (i >= 0) {
        if (a[i] == key) {
            return i;
        }
    }

    i--;
    return -1;
}

永远不会更新i会导致无限循环

这就是为什么我一直告诉别人总是用if包裹循环和else / { }块。

顺便说一下,sizeof不会给你你所期望的。实际上,它的返回值是表示变量所需的字节数。不是数组的元素数量。另请注意,reversea 指针收到arr,而非参考或副本。事实上,这个:

int reverse(int a[], int key) {

相当于:

int reverse(int *a, int key) {

因此,在reverse内,sizeof (a)相当于sizeof (int*)。这称为数组(或指针)衰减

修复并稍微清理代码会导致:

#include <stdio.h>

#define ARR_SIZE 5

int reverse(int a[], int aSize, int key) {
    int i;
    for(i = aSize - 1; i >= 0; --i) {
        if (a[i] == key) return i;
    }

    return -1;
}

int main() {
    int arr[ARR_SIZE] = {3, 2, 4, 5, 1};
    int x = reverse(arr, ARR_SIZE, 4);
    printf("%d\n", x);
    return 0;
}

按预期工作。

答案 1 :(得分:0)

你的反向功能应该是

int reverse(int a[], int length, int key){
    int i = length-1;
    while (i >= 0){
        if (a[i] == key)
            return i;
        i--;
    }
    return -1;
}

您还应该阅读有关sizeof的正确用法。