Перейти к содержимому

Как удалить элемент массива в си

  • автор:

Удаление элемента массива по индексу

Динамически память не выделяете, STL не используете и режущий глаз вызов system(«PAUSE»); .

Судя по всему, много элементов удалять не придётся, а потому просто смещаете все элементы, кроме удаляемого, на 1 влево и уменьшаете длину массива на 1.

k - нужный индекс for (long i = k; i < n; ++i) < a[i] = a[i + 1]; >--n; 

p.s. В C/C++ индексация массивов идёт с нуля. На будущее 😉

Отслеживать
ответ дан 28 ноя 2012 в 20:55
Алексей Лобанов Алексей Лобанов
1,202 9 9 серебряных знаков 22 22 бронзовых знака

Уточните, в массиве n или n+1 (как у автора вопроса) элементов? n+1 как-то глаз режет, а если n, то за границу вылазите.

28 ноя 2012 в 21:30

@avp n элементов, но мы «думаем», что индексация идёт с 1, как у ТС. И да, я согласен, это действительо глаз режет. p.s. Ну или, если быть кэпом, 3000 элементов.

Информатика. 10 класс (Повышенный уровень)

Среди задач преобразования элементов массива можно выделить задачи следующих типов:

1. Изменение элементов массива в зависимости от условий.
2. Обмен местами элементов в массиве.
3. Удаление элемента из массива.
4. Вставка элемента в массив.

Некоторые из задач преобразования массивов встречаются очень часто. Поэтому в класс vector были добавлены функции, позволяющие преобразовывать массивы.

Многие из функций для преобразования векторов аналогичны функциям преобразования строк как по синтаксису, так и выполняемому действию. Список функций можно посмотреть в Приложении к главе 1.

Удалить из массива элемент (С++)

Алгоритм удаления элемента сводится к сдвигу на одну позицию влево всех элементов, расположенных правее удаляемого. Подробно алгоритм рассмтрен в теме “Алгоритм: удаление элемента массива“. Тут приведем лишь иллюстрацию: Для начала найдем позицию удаляемого числа — функция возвращает позицию или -1 если такого числа нет:

int first_negative_pos(int* numbers, int size) < for (int i = 0; i < size; ++i) < if (numbers[i] < 0) return i; >return -1; >

Алгоритм удаления с помощью сдвига можно описать на Си так:

void remove_nth(int* numbers, int& size, int pos) < if (size --size; >

В функции main получим позицию первого отрицательного элемента и если это положительное число — вызовем remove_nth :

int negativePos = first_negative_pos(numbers, size); if (negativePos < 0) < printf("no negative elements\n"); >else

С использованием STL

В стандартной библиотеке C++ есть вектора, имеющие метод erase , на вход которого подается итератор удаляемого элемента. Кроме того, в стандартной библиотеке есть алгоритм для поиска элемента по условию. В итоге с использованием векторов задачу можно решить так:

#include #include #include using namespace std; void print(const vector& vec) < for (auto value : vec) < cout cout int main() < vectorvec(); print(vec); auto negative_it = find_if(vec.begin(), vec.end(), [](int value) < return value < 0; >); vec.erase(negative_it); print(vec); >

Алгоритмы С++ можно применять и к массивам в стиле Си, однако выглядит это весьма куцо. Для поиска можно применить тот же find_if , при этом вместо итераторов можно передать адреса начала и конца массива. Удаление реализует алгоритм std::remove (работать будет также как наша функция сдвига). Этот алгоритм не удаляет элемент физически, а лишь сдвигает его в конец, поэтому несмотря на применение алгоритмов, мы должны сами позаботиться об изменении размера массива (в Си иначе и быть не может):

void remove_first_negative(int* arr, int& size) < auto negative_it = find_if(arr, arr+size, [](int value) < return value < 0; >); std::remove(negative_it, arr+size, *negative_it); --size; > int main() < int n = 8; int arr[n] = ; print_array(arr, n); remove_first_negative(arr, n); print_array(arr, n); >

В любом случае, если знать как устроены алгоритмы STL – то можно сократить объем кода и меньше работать. Несмотря на то, что алгоритмы работают с Си-контейнерами – лучше так не делать (порог вхождения у полученного кода будет весьма высоким). Узнать много полезного про STL можно в статье “Практика: алгоритмы и стандартная библиотека C++“.

Массивы

Задача. Заменить отрицательные элементы на противоположные по знаку. Для этого опишем процедуру. Ей будем передавать параметры — количество элементов в массиве и массив, который будет также и результатом выполнения процедуры, так как некоторые его элементы могут быть заменены.

Procedure Zamena (Var m : MyArray; n:integer);
Var
i : integer;
Begin
for i := 1 to n do
if m[i] < 0
then
m[i] := -m[i];
End;

Нахождение номеров элементов с заданным свойством

Задача. Найти и вывести на экран номера четных элементов. Для решения задачи необходимо просмотреть весь массив, и если просматриваемый элемент является четным, то выводить его номер.

Procedure PoiskChet(m : MyArray; n:integer);
Var
i : integer;
Begin
for i := 1 to n do
if m[i] mod 2 =0
then
Write(i:5);
End;

Нахождение количества элементов с заданным свойством

Задача. Найти количество положительных и отрицательных элементов в данном массиве. Опишем процедуру, которой будем отправлять параметры — массив, количество элементов в массиве и два счетчика, один для элементов, больших нуля, а второй — для отрицательных элементов.

Procedure OtrPol(m : MyArray; n:integer; Var k1, k2 : Integer);
Var
i : integer;
Begin
k1 :=0;
k2 :=0;
for i := 1 to n do
if m[i] > 0
then
Inc(k1)
else
if m[i] < 0
then
Inc(k2);
End;

Есть ли в данном массиве элементы с данным свойством?

Для решения таких задач удобнее использовать циклы с условиями и составлять функции, результат которых имеет логический тип. Задача. Есть ли отрицательный элемент в массиве? Начинаем с первого элемента (i=1). Пока не просмотрен последний элемент (i<=n) и не найден отрицательный (m[i]>=0), будем переходить к следующему (Inc(i)). Таким образом, мы закончим просмотр массива в одном из двух случаев: первый – просмотрели все элементы и не нашли отрицательный, тогда i>n, второй – нашли нужный, при этом i

Function Control (m : MyArray; n:integer) : Boolean;
Var
i : integer;
Begin
i := 1;
while (i<=n) and (m[i]>0) do
Inc(i);
Control := (i<=n);
End;

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *