测试数组的第一个空值

时间:2011-11-28 07:45:29

标签: c multidimensional-array

无论如何要测试c中 2维int数组的第一个空值?

在我当前的程序中,我在主程序(while循环)之前使用2 for循环将我的2维数组的所有值设置为-9999。然后在我的主while循环中,我测试第一个-9999值并将其设置为一个值,然后使用break从中退出。

使用这个我设法做了我的任务,但我不是很满意,因为我认为可能有更好的解决方案。

有吗?

编辑:自您提出要求以来的代码。

循环外循环:

for(int x=0;x<ctr-1;x++)
{
    for(int y=0;y<maxtrips;y++)
    {
        EmployeeKilos[x][y] = -9999; // Set all the kilos to -9999 to signify emptiness.
    }
}

在我的主要while循环中:

for(int x=0;x<ctr-1;x++)                                                              // and set it to the log kilometers 
{
  if(employeenames[x].EmployeeNumber == log.Record)
  {
    for(int y=0;y<maxtrips;y++)
    {
      if(EmployeeKilos[x][y] == -9999)
      {
        EmployeeKilos[x][y] = log.Kilometers;
        break;
      }
    }
  }
}

我的所有代码:http://pastebin.com/Zb60mym8

3 个答案:

答案 0 :(得分:1)

正如Dave所说,检查空值不能比线性时间(O(n))更有效,但我的回答集中在可以防止必须首先查找它的解决方案

通常,您可以在行主模式或列主模式下迭代矩阵。

实际上,您可以使用单个索引转换为矩阵单元格,如此

for (size_t i=0; i<ROWS*COLS; ++i)
{
     int row = i / ROWS;
     int col = i % ROWS;

     // work with matrix[row][col]
}

这样你就可以存储并记住你上次找到第一个空单元格的i的值,这样你就不必从头重新开始了。

如果您实际上对row / col寻址不感兴趣,可以忘掉这些并只使用输出迭代器来跟踪当前的输出位置。

这是一个使用'iterator'风格的演示(借用c ++,但完全是C99)

typedef int data;
typedef data* output;

output add_next(data matrix[ROWS][COLS], output startpoint, data somevalue)
{
    if (output < (matrix + ROWS*COLS))
         *(output++) = somevalue;
    return output;
}

现在你可以说:

add_next(matrix, 42);
add_next(matrix, 9);

注意输出迭代器事物假定连续存储,因此不能用于所谓的jagged arrays

HTH

答案 1 :(得分:0)

您可以使用memset将数组初始化为固定值 - 它比迭代数组更有效,更清晰。

尽管如此,检查“空”值的速度要快得多。 :)

答案 2 :(得分:0)

这听起来像你应该考虑你的数据类型。因为你已经在使用结构。为什么不为最后一个未赋值的值添加另一个int,所以你只需循环它。就像是  e.g:

struct t_EmployeeKilos{
 int kilos[maxtrips];
 int nlast;
} EmployeeKilos[N];
每当你以千克为单位分配一个新元素时,

并设置nlast。这样就是O(1)。

for(int x=0;x<ctr-1;x++)                                                              // 
{
  if(employeenames[x].EmployeeNumber == log.Record)
  {
        EmployeeKilos[x].kilos[EmployeeKilos[x].nlast] = log.Kilometers;
        EmployeeKilos[x].nlast++;
  }
}