2015-09-01 5 views
-1

Я должен прочитать несколько значений от пользователя и сохранить их в массиве. Затем мне нужно создать массив, который достаточно велик, чтобы хранить все эти значения. Используя некоторые функции, я написал I sort/lsearch/bsearch через массив для заданных значений.Динамическое смещение пула памяти

У меня уже есть моя программа, написанная и все, но для реализации статического массива. Я немного запутался в том, где реально использовать динамический массив.

Имеет смысл использовать его, когда пользователь начинает вводить значения, так как я не могу предположить, сколько значений он вводит, поэтому массив должен быть достаточно большим, чтобы удерживать его. Также имеет смысл (Сортировка) использовать его, когда я создаю достаточно большой массив, который может удерживать все значение (действует как копия первого массива).

Я не прошу ни о каком коде, все сделано, но на статическом подходе. Я просто пытаюсь представить себе, где мне нужно использовать darrays здесь. Мои мысли:

  1. Когда пользователь вводит первое значение
  2. Когда я скопировать arr1 в новый arr2, который должен быть достаточно большим, чтобы вместить все значения arr1 в.

Я прав или неправильно?

+1

Показать, что у вас есть. Не совсем понятно, чего вы хотите достичь. – Olaf

+0

вам нужно calloc и realloc – pm100

+0

Поскольку вам нужно учитывать ввод размера, который вы не можете надежно предсказать (привязка) во время компиляции, вам нужно использовать динамическую структуру данных для хранения начального ввода. При чтении ввода вам понадобится расширить его. Если вам нужно сделать копию входных данных, вам понадобится вторая динамическая структура данных для ее хранения, но вам может и не понадобиться изменять ее размер. Динамически распределенные массивы представляют собой один из разновидностей потенциально подходящей структуры данных; есть и другие. –

ответ

1

Начните с использования malloc или calloc, чтобы выделить массив некоторых известных начальных размеров и отслеживать текущую емкость в переменной.

Поскольку вы читаете значения в, если ваш массив недостаточно велик, тогда пользователь realloc удваивает размер массива.

0

Думаю, вы задаете неправильный вопрос.

Вопрос:
Является ли динамический массив (непрерывный блок памяти) надлежащей структурой данных для хранения и обработки данных в вашем приложении?

Существует только одно особенно полезное приложение для массивов, которое является ассоциативным массивом, что означает, что сам индекс массива имеет смысл и может использоваться для получения правильного содержимого, которое вы ищете, с усилием O (1) ,

В примере список треков-бегунов может быть сохранен в массиве, где индекс массива равен номеру дорожки. Это идеальная структура данных, если вы хотите визуализировать имя бегунов на дорожку. Это ужасная структура данных, если вы хотите в алфавитном порядке отсортировать имена всех участников.

Но согласно вашему описанию приложения, индекс массива не имеет для вас значения. Это признак того, что массив не лучший выбор.

0

Лучшим решением является не копирование всего массива каждый раз, когда пользователь вводит значение. Требования к malloc и free будут тяжелыми и ухудшаться при использовании больших массивов.

Вам нужно рассчитать размер вашего массива с «числом элементов в качестве входного

INT * массив = newArray (10);

INT * newArray (размер INT) { возврата таНоса (размер * SizeOf (INT)). }

Имейте в виду, что int* является массивом, так что вы можете сделать array[3] Но, если вы централизовать хранение количества используемых элементов и текущий размер, то вы можете выделять несколько элементов и расти только тогда, когда доступные элементы исчерпаны.

struct DynamicIntArray { 
    int used; 
    int size; 
    int* storage 
}; 

void add(struct DynamicArray* array, int value) { 
    if (used < size) { 
    (*array).storage[used] = value; 
    used++; 
    } else { 
    int newSize = size+10; 
    int* newStorage = (int*)malloc(newSize*sizeof(int)); 
    int* oldStorage = (*array).storage; 
    for (int i = 0; i < size; i++) { 
     newStorage[i] = oldStorage[i]; 
    } 
    (*array).storage = newStorage; 
    (*array).size = newSize; 
    free(oldStorage); 
    } 
} 

с таким примером. Вы должны иметь возможность написать функцию newDynamicIntArray(...) и функцию freeDynamicIntArray(struct DynamicIntArray* array) и любые другие методы, о которых вы заботитесь.

0

Если вы не уверены, сколько записей вставлено во время выполнения, я предлагаю вам использовать структуру связанных списков. Это сэкономит ваше использование памяти.

+0

Поиск связанного списка - это 'O (n)'. – Jason

Смежные вопросы