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

Как удалить число из массива c

  • автор:

Удаление элементов из массива

Чтобы удалить элемент из массива , необходимо сдвинуть элементы на один «шаг» влево и уменьшить значение на 1. Если , то в этом случае достаточно выполнить .

Пример 1. Из массива Х удалить минимальный элемент.

double Xmin, x[NMAX];

//ВВод n и массива x

Xmin=x[0]; imin=0; // Определение положения

for (i=1; i<n; i++) // (индекса) минимального

if (x[i]<Xmin) // элемента

for (i=imin; i<n-1; i++) // Удаление элемента

x[i]=x[i+1]; // с индексом imin

n—; // Уменьшение размера массива

//Печать массива x

Если imin = n-1, то второй цикл for не работает (не выполняется условие входа в цикл), но размер массива n уменьшается на 1.

Пример 2. Из массива Х удалить все нулевые элементы.

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

//ВВод n и массива x

for (j=i; j<n-1; j++) // Удаление элемента

x[j]=x[j+1]; // с индексом i

n—; // Уменьшение размера массива

//Печать массива x

По поводу программы вариант 1 можно сделать два замечания.

1. При i = n-1, когда анализируется последний элемент массива, параметр j принимает значение n-1, т.е. начальное значение параметра цикла не соответствует условию входа в цикл j<n-1. Оператор for в этом случае не выполняется, т.е. оператор цикла эквивалентен пустому оператору. Следовательно, при происходит лишь уменьшение значения n, что соответствует алгоритму решения задачи.

2. Предположим, что в массиве X имеются подряд идущие нулевые элементы и . При i = k будет удален элемент , а на его место перемещается элемент , также равный нулю. Поскольку при новом повторении цикла for параметр цикла принимает очередное значение k+1, то новый нулевой элемент не будет анализироваться повторно и, как следствие, не будет удален из массива. Поэтому при наличии в массиве подряд идущих нулевых элементов программа варианта 1 работает неправильно.

Для корректного решения поставленной задачи нужно, чтобы программа после удаления нулевого элемента повторно анализировала этот же элемент и переходила к рассмотрению элемента лишь при  0. Для этого нужно в программе вместо цикла for использовать цикл while:

Вариант 2 (фрагмент).

//Ввод n и массива x

for (j=i; j<n-1; j++) // Удаление элемента

x[j]=x[j+1]; // с индексом i

n—; // Уменьшение размера массива

//Печать массива x

Тот же эффект можно достичь с помощью оператора for, если просмотр массива выполнять справа налево.

Вариант 3 (фрагмент).

//ВВод n и массива x

for (j=i; j<n-1; j++) // Удаление элемента

x[j]=x[j+1]; // с индексом i

n—; // Уменьшение размера массива

//Печать массива x

Обнаружение нулевого элемента во внешнем цикле и, как следствие, его удаление из массива приводит к перемещению уже обработанных элементов в «хвосте» массива и не влияет ни на количество повторений внешнего цикла, ни на анализ оставшихся элементов.

Рассмотрим еще один вариант программы, предназначенной для удаления нулевых элементов из массива. В этом случае все ненулевые элементы переносятся в начало массива. Для этого в переменную j перед началом цикла заносится -1. Если был найден ненулевой элемент массива, значение увеличивается на 1, и найденный элемент массива переписывается на место j-го элемента, если j!=i. Таким образом, в j находится номер последнего ненулевого элемента, перенесенного в начало массива. После цикла устанавливается новая длина массива n=j+1.

Вариант 4 (фрагмент).

//ВВод n и массива x

//Печать массива x

В 4-м варианте перемещается лишь один элемент массива (и то не в каждом цикле), в то время как в предыдущих вариантах при удалении каждого элемента, кроме последнего, передвигается вся правая часть массива, причем чем ближе удаляемый элемент к началу массива, тем больше элементов перемещается справа налево. Этот способ является наиболее эффективным.

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

gbg

Третий пункт решается просто — вам нужно передвинуть элементы в массиве: присвоить a[i]=a[i+1] в цикле.
Я думаю, вам запрещено использовать STL, так что пишите циклы.

Формат данного сайта запрещает совмещать кучу вопросов в один, так что постарайтесь разделить темы.

  • Facebook
  • Вконтакте
  • Twitter

Olej

В массивы C/C++ нельзя ничего добавлять и из них нельзя ничего удалять, массивы C/C++ статические.
Можно только создавать новые массивы, «похожие» на своих предшественников, где будет элементов больше или меньше . и каждый раз — копирование всех нужных элементов.

Добавлю:
— по п.п.4-5 — наслаждайтесь (случайные числа я генерить не стал — так нагляднее):

— а чтобы вою было меньше . исполняем:

— кстати, тот же трюк (без всяких malloc()) можете проделать и в современном C 😉

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

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

Без использования STL

Алгоритм удаления элемента сводится к сдвигу на одну позицию влево всех элементов, расположенных правее удаляемого. Подробно алгоритм рассмтрен в теме «Алгоритм: удаление элемента массива«. Тут приведем лишь иллюстрацию:

Для начала найдем позицию удаляемого числа — функция возвращает позицию или -1 если такого числа нет:

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

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

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

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

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

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

How to delete an element from an array in C#

How can I delete an element by «name»? , lets say number 4?

Even ArrayList didn’t help to delete?

12 Answers 12

If you want to remove all instances of 4 without needing to know the index:

LINQ: (.NET Framework 3.5)

Non-LINQ: (.NET Framework 2.0)

If you want to remove just the first instance:

LINQ: (.NET Framework 3.5)

Non-LINQ: (.NET Framework 2.0)

Edit: Just in case you hadn’t already figured it out, as Malfist pointed out, you need to be targetting the .NET Framework 3.5 in order for the LINQ code examples to work. If you’re targetting 2.0 you need to reference the Non-LINQ examples.

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

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

Luxury Car Rental in Miami | Reserve a Premium Vehicle with RealCar