如何编写函数来搜索二维数组中的元素?

时间:2011-01-04 14:02:00

标签: c

如何编写函数来搜索二维数组中的元素:if exists返回1,否则返回no?

#include <stdio.h>


int search(int a[3][3],int x);

int main ()
{
    int Array[3][3]; // array of size 3*3
    int i,j;         //counters i,j
    int result,number;    


    for(i=0;i<3;i++)
    {
        printf("\n");
        for(j=0;j<3;j++)
        {     
            printf(" Array[%d][%d]= ",i,j);
            scanf("%d", &Array[i][j]);              //Fill The 3*3 array
        }
    }

    printf("Enter The number you want:>");
    scanf("%d",&number);

    result=search(Array,number);

    if(search(Array,number))
        printf("Number exists\n");
    else
       printf("Number does not exists\n");

    return 0;
}


int search(int a[3][3],int x){
    int i,j;
    for(i=0;i<3;i++){

        for(j=0;j<3;j++){

           if (x==a[i][j])
               return 1;
           return 0;
        }
    }
}

这是对的吗?

6 个答案:

答案 0 :(得分:3)

不,不是。您需要将return 0;移出两个for循环,并将其作为search中的最后一个语句。

答案 1 :(得分:1)

没有。 return 0;语句应放在最后一个右括号之前的行上。

答案 2 :(得分:1)

您的程序没有运行,因为当且仅当搜索元素在数组[0] [0]中时,搜索算法返回1,否则它返回零并且您认为该元素不存在。您需要做的就是在遍历完整的多维数组后返回0。

您可以查看以上答案。他们给出了很好的解决方案。

答案 3 :(得分:0)

不,因为你的return 0;在for循环中。

答案 4 :(得分:0)

我认为你想要的是:

#include <stdio.h>

int search(int a[3][3],int x);

int main () 
{ 
    int Array[3][3]; // array of size 3*3 
    int i,j; //counters i,j 
    int result,number;

    for(i=0;i<3;i++)
    {     printf("\n");
        for(j=0;j<3;j++)
        {     
            printf(" Array[%d][%d]= ",i,j);
            scanf("%d", &Array[i][j]);              //Fill The 3*3 array
        }
    }

    printf("Enter The number you want:>");
    scanf("%d",&number);

    result=search(Array,number);

    if(result)
        printf("Number exists\n");
    else
        printf("Number does not exists\n");

    return 0;
}

int search(int a[3][3],int x)
{
    int i,j; 
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            if (x==a[i][j])
                return 1;
        }
    }
    return 0;
}

答案 5 :(得分:0)

Jon为您提供了所需的答案,但有一些细节需要注意。

C对数组的处理使得search函数不会收到int的3x3数组;相反,它接收一个指针int的3元素数组。根据C语言标准,起草n1256

6.3.2.1左值,数组和函数指示符
...
3除非它是sizeof运算符或一元&运算符的操作数,或者是用于初始化数组的字符串文字,否则将转换类型为''数组'类型的表达式到类型为''指向类型'的指针的表达式,它指向数组对象的初始元素,而不是左值。如果数组对象具有寄存器存储类,则行为未定义。

因此,当您调用result = search(Array, number);时,表达式Array的类型将从int的{​​3}元素的3元素数组中隐式转换(int [3][3] )指向intint (*)[3])的3元素数组的指针。在函数参数声明的上下文中,T a[]T a[n]T *a同义。您可以将函数原型更改为

int search(int (*a)[3], int x)

它的行为完全相同。

这样做的一个结果是search不仅可以在3x3阵列上运行,而且可以在任何Nx3阵列上运行。你已经编写了函数来假设a总是3x3;如果您希望能够处理不同行数的数组,则需要传入一个单独的参数来指定数组中的行数:

int search(int (*a)[3], size_t rows, int x)
{
  size_t i, j;
  for (i = 0; i < rows; i++)
    for (j = 0; j < 3; j++)
      if (a[i][j] == x)
        return 1;
  return 0;
}

int main(void)
{
  int fiveRowArray[5][3] = {{ 1, 2, 3}, { 4, 5, 6}, { 7, 8, 9},
                            {10,11,12}, {13,14,15}};
  int twoRowArray[2][3]  = {{ 1, 2, 3}, { 4, 5, 6}};
  int number;

  printf("Gimme a number: ");
  fflush(stdout);
  scanf("%d", &number);

  if (search(array, sizeof fiveRowArray / sizeof *fiveRowArray, number))
    printf("Number exists in fiveRowArray\n");
  else 
    printf("Number does not exist in fiveRowArray\n");

  if (search(array, sizeof twoRowArray / sizeof *twoRowArray , number))
    printf("Number exists in twoRowArray \n");
  else 
    printf("Number does not exist in twoRowArray \n");

  return 0;
}

sizeof arr / sizeof *arr表达式通过获取总数组大小(以字节为单位(sizeof arr)并将其除以单个数组元素中的字节数({{1}来计算数组中元素的数量}或sizeof *arr)。请注意,这仅适用于数组类型的表达式;它不适用于被视为数组的指针(例如sizeof arr[0]函数中的表达式a)。

如果要处理不同数量的行列,则必须采用不同的方法:

search

在这种情况下,我们显式地将指针传递给每个数组中的第一个元素,因此int search(int *a, size_t rows, size_t cols, int x) { size_t i, j; for (i = 0; i < rows; i++) for (j = 0; j < cols; j++) if (a[i * cols + j] == x) return 1; return 0; } int main(void) { int fiveByThree[5][3] = {...}; int twoByFour[2][4] = {...}; ... if (search(&fiveByThree[0][0], sizeof fiveByThree / sizeof *fiveByThree, sizeof fiveByThree[0] / sizeof *fiveByThree[0], number)) ... if (search(&twoByFour[0][0], sizeof twoByFour / sizeof *twoByFour, sizeof twoByFour[0] / sizeof *twoByFour[0], number)) ... } 接收一个指向int的简单指针,而不是接收指向search数组的指针。 },我们将其视为一维数组,并手动计算偏移量为int。此代码假定2D数组中的所有元素都是连续的。

修改

请注意,在C99中,您可以拥有所谓的可变长度数组(VLA),其中数组维度可以由运行时变量而不是常量表达式指定;这允许我们将原型编写为

i * cols + j

并没有弄乱指针。