动态分配数组的二进制搜索

时间:2015-01-29 04:01:29

标签: c arrays dynamic binary-search

我正在开发一个从重定向文件中获取输入的程序,并将该文件中的整数存储到动态数组中,直到读取-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]);
}

2 个答案:

答案 0 :(得分: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
    }
}

答案 1 :(得分:0)

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

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

您正在打印多余的零,因为阵列未完全填满。希望这可以帮助!

相关问题