递归二进制搜索

时间:2012-03-25 00:09:20

标签: c pointers multidimensional-array binary-search

在我的主文件中,我有一个字符串数组,字符名称[320] [30],然后我用冒号排序。我希望能够进行递归二进制搜索,以确定名称数组中是否存在单词以及索引是什么。索引由一组无符号整数表示,unsigned int Set [10]。如果该单词不存在,则该函数应返回-1。

#include "set.h"
#include "sortAndSearch.h"
#include <stdio.h>
#include <ctype.h>
#include <string.h>

int binarySearch(Char A[][30], char *, int, int){
//this gets passed the global array names
//and the spot we're looking for is the char pointer
//other 2 ints are low = 0, and high = 319
//then it finds mid, a point between high and low
//and then does the same thing on whichever half it needs
//until it finds the index its looking for
//this is recursive because of the low and high values provided

int mid, low, high, result;

//calculate midpoint to cut set in half
mid = (high + low)/2;

//comparison
result = strcmp(A[mid], key);

//if result < 0, A[mid] < key
if(result < 0)
        return binarySearch(A, key, mid+1, high);

//if result > 0, A[mid] > key
else if(result > 0)
        return binarySearch(A, key, low, mid-1);

//if result == 0, A[mid] == key
else if(result == 0)
        return mid;

//couldnt find it
else
        return -1;

//this should return int, either
//the index where the string being searched for is stored in the array
//or -1 to indicate that the string beinng sought is not in the array
}

在我的主要功能中,我调用了函数:

char *key;
binarySearch(names, key, 0, 319);

当我尝试编译时,我收到以下错误:

  • search.c:7:在“A”之前解析错误
  • search.c:在函数`binarySearch'中:
  • search.c:7:参数数量与原型
  • 不匹配
  • sortAndSearch.h:3:原型声明
  • search.c:22:'A'未声明(首次使用此功能)
  • search.c:22 :(每个未声明的标识符只报告一次
  • search.c:22:对于它出现的每个功能。)
  • search.c:22:`key'unclaclared(首次使用此功能)

所以我的问题是为什么我会收到这些错误,因为我没有看到任何拼写错误,以及与原型不匹配的参数数量是多少?我从给出的sortAndSearch.h文件中复制了它。

6 个答案:

答案 0 :(得分:1)

我认为错误为Char A[][30],应为char A[][30]

标准C

中没有名称Char的数据类型

答案 1 :(得分:1)

尝试在Char的定义下将char更改为binarySearch,然后查看您的代码是否已编译。

始终检查第一个编译错误。这个错误可能导致许多其他看似随机的错误,这似乎正在经历。

答案 2 :(得分:1)

我认为这是C? int binarySearch(Char A[][30], char *, int, int)不是有效的函数定义int binarySearch(char A[][30], char *s, int a, int b)。试试吧。

没有名称的表单可能会出现在头文件中。头文件有足够的信息供编译器检查每个参数的数据类型(AKA参数),但它不需要(当它读取头时)任何更多信息。此时编译器能够使用(调用)函数来检查任何代码是否正确。这被称为函数签名。

当编译器看到实际的函数定义时,它需要参数的名称(AKA参数),以便代码可以引用它们,参数是变量。所以它需要名字。

答案 3 :(得分:0)

您需要重新阅读C的基础知识。这是一种区分大小写的语言,Char不是char

答案 4 :(得分:0)

int binarySearch(Char A[][30], char *, int, int){

Char应该是char(C是区分大小写的语言)。因为这是错误的,大多数其他编译错误都是编译器混淆的结果。

您还需要为函数定义中的其他参数指定名称:

int binarySearch(Char A[][30], char *key, int low, int high){

然后,您不需要lowhigh作为单独声明的局部变量(实际上,您不能将它们声明为局部变量和参数)。

我相信函数中的逻辑还有一个错误:

if (result < 0)
        return binarySearch(A, key, mid+1, high);
else if (result > 0)
        return binarySearch(A, key, low, mid-1);
else if (result == 0)
        return mid;
else
        return -1;

所有值都大于,小于或等于零; else子句是多余的。

但是,您在终止搜索时也遇到问题。在计算low之前,您需要检查high是否大于mid,如果要搜索的范围为空,则应返回未找到的-1。< / p>

答案 5 :(得分:0)

在第5行,函数定义需要与声明匹配。检查sortAndSearch.h以获取该函数的先前声明。 它应该

int binarySearch(char A[][30], char *key, int low, int high){

在第14行,不应声明低和高,并且它应该作为参数传递给函数。它应该

int mid, result;

否则它看起来不错。