簡體   English   中英

動態分配數組的二進制搜索

[英]binary search on dynamically allocated array

我正在開發一個程序,該程序從重定向文件中獲取輸入並將該文件中的整數存儲到動態數組中,直到讀取到-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]);
}

您可以使用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
    }
}

您需要將temp數組初始化為不會出現在重定向文件中的內容,例如-1。 這樣,在打印結果的循環中,您可以忽略該值。

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

由於數組未完全填充,您將獲得多余的零。 希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM