【问题标题】:binary search on dynamically allocated array动态分配数组的二分查找
【发布时间】:2015-01-29 19:07:31
【问题描述】:

我正在开发一个程序,该程序从重定向文件中获取输入并将该文件中的整数存储到一个动态数组中,直到 -999 被读取,如果我们尝试将更多的值放入其中,它应该会增长它当前的大小。

我将这些值粘贴到执行二进制搜索的函数中,该函数返回找到的位置和查找所需的比较量。

但是,当我运行它时,我会从所有空格中获取数组中的所有值,包括零。因此我的位置变量和比较变量被抛弃了。它不是函数,因为它与硬编码数组完美配合。

所以我的问题是,有没有办法摆脱数组的那部分? 谢谢

int var;
int counter = 0;

int *orgarr;
int size = 10;
orgarr = (int *) malloc (size * sizeof(int) );


int *tempo;
tempo = (int *) malloc (size * 2 * sizeof(int));
int i;
for ( i = 0 ; i < size ; i++)
    tempo[i] = orgarr[i];
    free (orgarr);
orgarr = tempo;
size = size * 2;

while (var != -999) {
    scanf("%i", &var);
    if (var != -999){
    orgarr[counter] = var;
    }
    counter++;
}

for (i = 0; i < size; i++) {
    printf("%i", orgarr[i]);
}

【问题讨论】:

  • 搜索调用是......在哪里?我的水晶球告诉我你的搜索参数限制是[0..size);他们应该是[0..counter)在读取输入时 使用动态调整大小来构建数组,并且仅根据实际read 条目的数量执行搜索。这样你就解决了两个问题,你的“数组大于条目数”问题,以及当数组对于条目数来说太时,未定义行为的即将到来的厄运。
  • var 未初始化为while (var != -999) 之前的任何值。
  • @WhozCraig 你是对的,我确实有从 0 到大小的参数。您将如何构建它以根据输入来调整大小?
  • @chux 我的印象是我不需要在任何地方初始化它,因为它会随着数字的读取而不断变化。
  • @Rbutler93 如果没有预先设置var,第一次执行while (var != -999)的结果应该是什么? var 可以有任何值:-999、其他整数或引发异常并停止程序的特殊陷阱值。确实,var 随后会因scanf("%i", &amp;var) 而发生变化,但那是在while 测试之后

标签: c arrays dynamic binary-search


【解决方案1】:

您可以使用 realloc 来更改数组的大小。
如果指针设置为 NULL,则 realloc 在第一次分配内存时的行为与 malloc 相同。
考虑使用“%d”。如果有任何带有前导零的值,例如 08,“%i”将尝试将它们读取为八进制值。在 08 的情况下,它将失败,并且 011 将被读取为 9。但如果您实际上有一些八进制值,您可能希望继续使用“%i”。
这将在每个输入上重新分配,您可以使用 counter 变量一次重新分配 10 个或根据需要将分配加倍。
您也可以从分配 10,000 开始,然后在读取所有输入后重新分配到正确的大小。

int var = 0;
int size = 0;
int *tempo = NULL;
int *orgarr = NULL;
while ( ( scanf ( "%d", &var)) == 1) {//invalid input or EOF will end loop
    if ( var != -999) {
        size++;
        tempo = realloc ( orgarr, size * sizeof ( int));
        if ( tempo) {
            orgarr = tempo;
            orgarr[size - 1] = var;
        }
        else {
            //realloc failed
            // return or break but somehow handle the problem
        }
    }
    else {
        break;//read -999
    }
}

【讨论】:

    【解决方案2】:

    您需要将临时数组初始化为不会出现在重定向文件中的内容,例如 -1。这样,在您打印出结果的循环中,您可以忽略该值。

    for (i = 0; i < size; i++) {
        if(orgarr[i] != -1){
           printf("%i", orgarr[i]);
        }
    }
    

    您正在打印出多余的零,因为数组没有被完全填满。希望这可以帮助!

    【讨论】:

      猜你喜欢
      • 2021-01-15
      • 1970-01-01
      • 2013-11-24
      • 1970-01-01
      • 1970-01-01
      • 2021-02-03
      • 2015-02-10
      相关资源
      最近更新 更多