有没有办法在 c 中测试 2 dimensional int array 的第一个空值?
在我当前的程序中,我在主程序之前使用了 2 个 for 循环(while 循环)来将我的二维数组的所有值设置为 -9999。然后在我的主 while 循环中,我测试第一个 -9999 值并将其设置为一个值,然后使用 break 退出它。
使用它我设法完成了我的任务,但我不是很满意,因为我认为可能有更好的解决方案。
有吗?
编辑:您要求的代码。
for循环外while循环:
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
最佳答案
正如 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
寻址,您可以忘记这些,只需使用输出迭代器来跟踪您当前的输出位置。
这是一个使用“迭代器”风格的演示(从 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
关于c - 测试数组的第一个空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8292759/