Как удалить элемент массива в си
***
Такая к вам просьба. Мне нужны функции для добавления/удаления
элементов массивов в Си (не C++). Я так понимаю что допустим для
добавления элемента надо сделать его копию. А это как то криво.
Уверен что у многих уже есть такие функции. Если вам не жалко
киньте мне пожалуста их на адрес antonov21@inbox.ru.
Так же нужны любые другие функции для работы с элементами массивов.
Реализующие динамическое распределение памяти для элементов и т.п.
Ну вы понимаете. Спасибо большое. Считаю этот форум очень толковым.
В Поиске найти ничего по этому поводу не смог. Поэтому спрашиваю. Еще
раз всем спасибо.
***
Спрашивал на других форумах — никто не помог.
Может здесь помогут — очень надеюсь.
Я имею ввиду функции для работы с элементами массивов (вставить элемент, добавить, удалить).
А также любые другие функции которые будут полезны при работе с массивами.
Включая динамическое распределение памяти для элементов и т.п.
Re: Добавление/удаление элементов массива в Си
От: | Алексей Владимирович Миронов |
Дата: | 05.02.03 01:44 |
Оценка: |
Здравствуйте, Alexey_Antonov, Вы писали:
AA>Я так понимаю что допустим для добавления элемента надо сделать его копию. А это как то криво.
Согласен. С точки зрения производительности лучше заранее заказать память «с запасом», и не перераспределять ее при каждом добавлении элемента. Если «запаса» не хватило, то при очередном добавлении стОит сделать «запас» побольше.
На «чистом C» набор функций общего назначения для работы с массивами списками, деревьями, очередями и прочим есть, например, в GTK+ (смотреть в сторону Glib).
P.S. Может, лучше все-таки на C++ с использованием STL? Просто, достаточно эффективно, широко применяется, много знающих людей, в т.ч. на этом форуме.
Re[2]: Добавление/удаление элементов массива в Си
От: | VCoder | http://wxbar.sf.net |
Дата: | 05.02.03 07:11 | |
Оценка: |
АВМ>P.S. Может, лучше все-таки на C++ с использованием STL? Просто, достаточно эффективно, широко применяется, много знающих людей, в т.ч. на этом форуме.
Я тоже советую обратить внимание на C++ с использованием STL.
С уважением,
Дмитрий.
Re[2]: Добавление/удаление элементов массива в Си
От: | _wqwa |
Дата: | 05.02.03 13:02 |
Оценка: |
Здравствуйте, Алексей Владимирович Миронов, Вы писали:
АВМ>На «чистом C» набор функций общего назначения для работы с массивами списками, деревьями, очередями и прочим есть, например, в GTK+ (смотреть в сторону Glib).
Вот как раз все остальное, кроме массивов в Glib есть. А их-то и нету.
Если связный список или хеш не устроит, то придется изгалиться ручками.
Так что остается применить советы Саттера (если не ошибаюсь) и выделять память с запасом, напр. 30%. При переполнении массива — выделить еще на треть больше и т.д.
Re: Добавление/удаление элементов массива в Си
От: | VVV |
Дата: | 05.02.03 13:57 |
Оценка: |
Здравствуйте, Alexey_Antonov, Вы писали:
..
AA>Я имею ввиду функции для работы с элементами массивов (вставить элемент, добавить, удалить).
AA>А также любые другие функции которые будут полезны при работе с массивами.
AA>Включая динамическое распределение памяти для элементов и т.п.
Конечно, такой библиотеки у меня нет, но с помощью функции realloc это очень просто реализуется.
Не компилил, не проверял, просто идея:
typedef struct ARRAY< int num_; int size_ int top_; char arr_[1]; >ARRAY; #define SIZEARRAYMEM(n, s) ((n)*(s)+sizeof(ARRAY)) char *CreateArray(int numElem, int sizeElem) < ARRAY *pa=(ARRAY*)malloc(SIZEARRAYMEM(numElem, sizeElem)); pa->num_=numElem; pa->size_=sizeElem; pa->top_=0; return pa->arr_; > void DestroyArray(void *pa) < pa=((char*)pa)-offsetof(ARRAY, arr_); free(pa); > void AddElem(void **parr, void *pe) < ARRAY *pa=(ARRAY*)(((*(char**)parr))-offsetof(ARRAY, arr_)); if(pa->top_ == pa->num_) < int num=pa->num_*2; pa=(ARRAY*)realloc(pa, SIZEARRAYMEM(num, pa->size_)); pa->num_=num; > memcpy(pa->arr_+pa->top_*pa->size_, pe, pa->size_); pa->top_++; *parr=pa; > int GetCount(void *parr) < ARRAY *pa=(ARRAY*)(((char*)parr)-offsetof(ARRAY, arr_)); return pa->top_; >
Re[3]: Добавление/удаление элементов массива в Си
От: | Алексей Владимирович Миронов | |
Дата: | 05.02.03 15:08 | |
Оценка: | 3 (1) |
Здравствуйте, _wqwa, Вы писали:
W>Вот как раз все остальное, кроме массивов в Glib есть. А их-то и нету.
Как же так? На странице документации Glib 2.0 перечислены следующие типы данных, поддерживаемые Glib:
Memory Chunks — efficient way to allocate groups of equal-sized chunks of memory.
Doubly-Linked Lists — linked lists containing integer values or pointers to data, with the ability to iterate over the list in both directions.
Singly-Linked Lists — linked lists containing integer values or pointers to data, limited to iterating over the list in one direction.
Double-ended Queues — double-ended queue data structure.
Trash Stacks — maintain a stack of unused allocated memory chunks.
Hash Tables — associations between keys and values so that given a key the value can be found quickly.
Strings — text buffers which grow automatically as text is added.
String Chunks — efficient storage of groups of strings.
Arrays — arrays of arbitrary elements which grow automatically as elements are added.
Pointer Arrays — arrays of pointers to any type of data, which grow automatically as new elements are added.
Byte Arrays — arrays of bytes, which grow automatically as elements are added.
Balanced Binary Trees — a sorted collection of key/value pairs optimized for searching and traversing in order.
N-ary Trees — trees of data with any number of branches.
Quarks — a 2-way association between a string and a unique integer identifier.
Keyed Data Lists — lists of data elements which are accessible by a string or GQuark identifier.
Datasets — associate groups of data elements with particular memory locations.
Relations and Tuples — tables of data which can be indexed on any number of fields.
Caches — caches allow sharing of complex data structures to save resources.
Memory Allocators — allocates chunks of memory for GList, GSList and GNode.
Я не говорю, что эти массивы подойдут на все случаи жизни. Но автор оригинального сообщения и не говорил, какие именно массивы ему нужны. А зря.
Re[4]: Добавление/удаление элементов массива в Си
От: | _wqwa |
Дата: | 05.02.03 16:02 |
Оценка: |
Здравствуйте, Алексей Владимирович Миронов, Вы писали:
АВМ>Как же так?
Ой. Их(chunks) -то я и проглядел. Сорри.
Функция, удаляющая элемент одномерного массива
Написать фрагмент программы, удаляющий i -й элемент из массива целых чисел размера N , i
Результат работы программы показан ниже.
CppStudio.com
Укажите количество элементов массива: 15 83 86 77 15 93 35 86 92 49 21 62 27 90 59 63 Укажите номер элемента массива, который необходимо удалить: 3 83 86 15 93 35 86 92 49 21 62 27 90 59 63
#include using namespace std; #include bool iDel(int *array, int &lenAr, int nom); int main() < int length_array; cout > length_array; int *arrayPtr = new int [length_array]; // одномерный динамический массив // заполняем одномерный массив случайными числами for (int counter = 0; counter < length_array; counter++) < arrayPtr[counter] = rand() % 100; // генерируем случайные числа cout cout > n; iDel(arrayPtr, length_array, n); for (int counter = 0; counter < length_array; counter++) < cout cout bool iDel(int *array, int &lenAr, int nom) < if ( nom >lenAr || nom < 1) < cout for(int ix = nom - 1; ix < lenAr - 1; ix++) < array[ix] = array[ix + 1]; >lenAr--; return true; >
Удаление элемента массива по индексу
Динамически память не выделяете, 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 элементов.
Удаление элементов массива
Помогите пожалуйста, похо разбраюсь в массивах, недавно начала только изучать программирование.
Задача:удалить все элементы меньше 3 и расположенные после первого отрицательного
Добавлено через 8 минут
Массив вещественный, Массив содержит не более 20 элементов, Вспомогательные массивы не использовать
Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Удаление элементов массива
Помогите, пожалуйста, понять как реализовать на Си удаление повторяющихся элементов одномерного.
Удаление элементов массива
Добрый вечер! Написала код,который удаляет все элементы массива меньше 3, подскажите пожалуйста.
Удаление элементов массива
Здравствуйте. Дан двумерный массив (N=4, M=5). Удалить из строк все отрицательные элементы.
Удаление элементов массива
Допустим нам дан массив А . Как в данном массиве удалить , ну например 1 и 3 элементы , что бы на.
94 / 41 / 23
Регистрация: 18.09.2016
Сообщений: 379
dashaDK, если правильно понял. Если неправильно, другой поймёт правильно.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
///Задача:удалить все элементы меньше 3 и расположенные после первого отрицательного #include int main() { int N = 10; int k = N; float mass[N]; for( int i = 0; i N; i++ ) scanf( "%f", &mass[i] ); /*--------до--------*/ for( int i = 0; i N; i++ ) printf( "%.3f ", mass[i] ); for( int i = 0; i N; i++ ) { if( mass[i] 3.0 && mass[i] > 0.0 ) { for( int j = i; j N - 1; j++ ) mass[j] = mass[j+1]; mass[k-1] = 0.0; k--; i = -1; } else if( mass[i] 0.0) for( int s = N - 1; s >= i; s-- ) mass[s] = 0.0; } putchar( '\n' ); /*------после-------*/ for( int i = 0; i N; i++ ) printf( "%.3f ", mass[i] ); return 0; }
Регистрация: 04.12.2017
Сообщений: 11
Пробую вводить код, который вы отправили, программа выдает следующие ошибки (см. вложения)
Видимо, нужно задать константное значение, и по-моему , тут не выделена память под массив ? Или я не права?
94 / 41 / 23
Регистрация: 18.09.2016
Сообщений: 379
dashaDK, ну сделайте перменную N константой
Регистрация: 04.12.2017
Сообщений: 11
Мы же не знаем конкретное число элементов массива , как мы можем задавать данную переменную?
Регистрация: 01.12.2017
Сообщений: 5
Вы же сами написали что не больше 20
Регистрация: 04.12.2017
Сообщений: 11
Я не совсем понимаю,как в этом случае задать константное значение. Вот есть код, тут он удаляет элементы меньше 3, расположенные до последнего минимального. как можно его переделать,чтобы удалял после первого отрицательного?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
#include #include #include #define DIM_A 20 double first(double *array, int *len_array); int input(double *array, int len_array); //длина массива, тоже что и К void output(double *array, int new_array); // ничего не возвращает int main() { int new_array = 0; double array[DIM_A], s = 0; setlocale(LC_NUMERIC, "eng"); setlocale(LC_ALL, "rus"); new_array = input(array, DIM_A); first(array, &new_array); output(array, new_array); return 0; } int input(double *array, int len_array) { int i, k; printf("Введите размер массива k:\n"); scanf_s("%d", &k); if (len_array k) { printf("Error"); return 0; } for (i = 0; ik; i++) { printf("array[%d]=", i); scanf_s("%lf", &array[i]); } return k; } double first(double *array, int *len_array) { int i = 0, j, t = 0, s; double a = array[0]; for (i = 0; i (*len_array); i++) { if (array[i] >= a) { a = array[i]; t = i; } } for (i = (*len_array - 1); i >= 0; i--) if ((array[i]3) && (i t)) { for (j = i; j(*len_array - 1); j++) array[j] = array[j + 1]; t--; (*len_array)--; } return 0; }