0 / 0 / 0
Регистрация: 11.01.2019
Сообщений: 37
1

Добавление элемента перед первым в динамическом массиве

22.04.2020, 20:10. Показов 910. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток. В университете дали задание написать программу, которая позволяет увеличить размер динамического массива на 1 и вставить новые элементы перед первым. Функция принимает одно значение типа int, которое и надо вставить перед первым элементом. Также увеличивается значение переменной size, которая хранит размер массива(количество элементов).
Алгоритм такой:
1. Увеличиваем размер на 1.
2. Выделяем память под новый массив.
3.Копируем все элементы, начиная со второго(индекс 1)
4. Присваиваем первому(индекс 0) элементу значение х.
Ниже приведен код:
C++
1
2
3
4
5
6
7
8
void ad(int x)
    {
        size = size + 1;
        int* mas1 = (int*)realloc(mas, sizeof(int) * size);        
        for (int i=0;i<size-1;i++)mas1[i+1] = mas[i];
        mas1[0] = x;
        mas = mas1;
    }
После 10 выполнений я получаю массив, содержащий значения "9888888888".

Помогите разобраться с этой ошибкой
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.04.2020, 20:10
Ответы с готовыми решениями:

Git добавление коммита перед первым имеющимся в репозитарии
Для существующего уже некоторое время проекта в какой-то момент был создан git репозитарий. Был...

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

Нахождение минимального элемента в динамическом массиве
Составить программу для нахождения минимального элемента в массиве из 10 целых чисел. Нужно...

Определение номера элемента в динамическом массиве
Дан массив А. Определить номер элемента, который равен 15. Var A:array of extended; Begin...

6
9 / 5 / 4
Регистрация: 22.04.2016
Сообщений: 63
22.04.2020, 20:22 2
Лучший ответ Сообщение было отмечено 1u5t1se как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void ad(int x)
{
    int* mas1 = (int*)realloc(mas, sizeof(int) * (size + 1));
    if (!mas1) 
    {
        return;
    }
    size = size + 1;
    for (int i = size-1; i > 0; i--)
    {
        mas1[i] = mas1[i - 1];
    }
    mas1[0] = x;
    mas = mas1;
}
https://en.cppreference.com/w/c/memory/realloc
Return value
On success, returns the pointer to the beginning of newly allocated memory. To avoid a memory leak, the returned pointer must be deallocated with free() or realloc(). The original pointer ptr is invalidated and any access to it is undefined behavior (even if reallocation was in-place).
1
0 / 0 / 0
Регистрация: 11.01.2019
Сообщений: 37
22.04.2020, 20:26  [ТС] 3
Большое спасибо, теперь я понял, в чем ошибся. Копировал элементы не в том порядке и неправильно запустил цикл.
0
Параллельный Кот
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
22.04.2020, 20:31 4
Цитата Сообщение от 1u5t1se Посмотреть сообщение
Помогите разобраться с этой ошибкой
realloc не выделяет память, а изменяет размер уже выделенного блока. После этого писать mas1[i+1] = mas[i]; некорректно. Если блок был перемещен, то mas указывает на нераспределенную память. Если блок остался на месте, то mas и mas1 указывают на одну и ту же память и такая запись затирает значения. Еще вопрос: как была выделена память, malloc или new?

В задании конкретно сказано:
Цитата Сообщение от 1u5t1se Посмотреть сообщение
2. Выделяем память под новый массив.
Сделайте именно так.
0
9 / 5 / 4
Регистрация: 22.04.2016
Сообщений: 63
22.04.2020, 20:37 5
Цитата Сообщение от valen10 Посмотреть сообщение
Сообщение от 1u5t1se
2. Выделяем память под новый массив.
Сделайте именно так.
__________________
Точно
0
Параллельный Кот
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
22.04.2020, 20:42 6
realloc здесь плох еще тем, что в случае переноса блока в памяти копирование будет выполняться дважды: первый раз при переносе, второй раз при сдвиге элементов в цикле.
0
0 / 0 / 0
Регистрация: 11.01.2019
Сообщений: 37
22.04.2020, 20:51  [ТС] 7
Память выделялась через calloc. И это не задание, это просто описание моих действий, на всякий случай.

А по заданию надо использовать именно realloc, так что все нормально, этот вариант мне пока подходит.
0
22.04.2020, 20:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.04.2020, 20:51
Помогаю со студенческими работами здесь

Поиск максимального/минимального элемента в динамическом массиве
Необходимо из главного массива glmas,сформированного из элементов стринггрида выбрать минимальные...

Поиск мах элемента в динамическом многомерном массиве
Кто-нибуть может подсказать реализацию идеи алгоритма поиска максимального элемента в многомерном...

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

Нахождение последнего элемента и перестановка его перед первым (списки)
Добрый всем вечер. У меня возник вопрос. Я написала программу, которая вводит список и выводит. Но...

Поиск максимального и минимального элемента в одномерном динамическом массиве
Помогите пожалуйста, никак не могу понять где тут ошибка и что вообще нужно делать(код на C++)...

Линейный однонаправленный список: удаление элемента перед первым положительным элементом
Есть функции для ввода и вывода списка, освобождения памяти. Проблема с функцией для удаления...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru