2013-11-02 4 views
0

Я пытаюсь написать 2 функции в C, один из которых добавит элемент в конец моего массива, который я передам как аргумент, а другая функция, которая удалит элемент из массив передан как аргумент.Добавить/удалить элемент из массива

Я не очень хорошо знаком с C, а не хорошо в арифметике указателей.

Я пытался что-то вроде этого, но это, кажется, не работает должным образом:

void remove_element(type *elements, type element, int size){ 
    int i; 
    int index = 0; 
    for(i=0; i<size; i+=1){ 
     if(equals(elements[i], element)) index = i; 
    } 

    for(i=index; i<size-1; i+=1){ 
     elements[i] = elements[i+1]; 
    } 
} 


void add_element(type *elements, type element, int size){ 
    elements = realloc(elements, size*sizeof(element)); 
    elements[size-1] = element; 
} 

То есть, как я хочу, чтобы вызвать функции:

add_element(elements, new_element, size); 
remove_element(elements, element_to_remove, size); 
+0

Не могли бы вы рассказать о том, как это работает? Вы также можете показать некоторый код, показывающий, как вы используете эти функции, пожалуйста, прочитайте, например. http://sscce.org/ –

+0

Ваш код не похож на то, что он действительно помещает что-либо в массив. –

+0

Опишите * «похоже, что он не работает должным образом» *. Какой вклад вы дали своей программе? Какие результаты вы ожидали? какие результаты вы действительно получили? Я вижу только две функции в вашем коде. Нет 'main', нет ввода, нет выходных данных. – abelenky

ответ

1

Тезисы две линии могут привести к неопределенное поведение:

cvorovi = realloc(elements, size*sizeof(element)); 
elements[size-1] = cv; 

Функцияне гарантирует возврата указателя на ту же область, которую вы хотите перераспределить, что означает, что elements не может указывать на выделенную область после вызова. Вы должны использовать возвращаемый указатель.

Это, скорее всего, вызовет проблемы с кодом , вызывающим эту функцию, так как этот код ничего не знает об изменении указателей. Либо передайте elements по ссылке (то есть указатель на указатель), либо верните новый указатель.

Кроме того, посмотрев ваши изменения, вы do не должны пропускать размер большего размера, чем если вы звоните в add_element? В противном случае он будет перераспределять один и тот же размер снова и снова и перезаписывать последний вставленный элемент для каждого вызова. Возможно, вам захочется подумать над тем, чтобы структура отслеживала их, а также специальный набор функций, которые принимают эту структуру в качестве аргумента и обрабатывают все вещи (например, отслеживание размера) внутри.

+0

На самом деле эта строка выглядит так: elements = realloc (элементы, размер * sizeof (element)); Оригинальная линия была опечаткой. – Whizzil

+0

@Whizzil Но последняя часть ответа остается в силе. Как код вызова узнает о возможных изменениях? –

+0

Я был бы признателен за решение, фактический код того, как он будет работать, что я хочу, было бы намного яснее. @edit: да, я помню это :) – Whizzil

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