Добавление динамического массива и удвоение его размера после завершения - PullRequest
0 голосов
/ 07 октября 2019

Создайте динамический массив int с начальным пробелом 4. Напишите функцию 'append', которая добавляет данное значение к этому массиву. На любом этапе, если эта функция находит массив заполненным, она автоматически удваивает размер массива для размещения этого нового значения. Также напишите функцию для отображения всех элементов этого массива. Напишите основную для проверки всех этих функций.

Я предпринял попытку решить вышеуказанный вопрос, как указано ниже. Однако я не могу получить правильный код. Пожалуйста, помогите мне

#include<iostream>
using namespace std;

void append(int*& array, int val, int n, int r)
{
int i,p;
int *array1;
for (i=r;i<n;i++)
array[i] = val;
if(i==n)
{
 p = 2*n;
 array1 = new int [p];
}
for(int j =0; j<r/2; j++)
 array1[j]= array[j];
 append(array1, val, p, p/2);
}



int main()
 {
  int q,p=0,val, n = 4;
 int n1 = p/2;
 int *array = new int[n];
  while(1)
{
cout<<"Enter 0 to end and 1 to continue";
cin>>q;
 while(q!=0)
 {
cin>>val;
append(array,val,n,n1);

  }

  }


 return 0;
}

Мне нужно решить эту проблему без использования «Классы». Как мне это сделать?

Ответы [ 2 ]

3 голосов
/ 07 октября 2019

Ваша функция должна выполнять следующие действия: 1) Уметь проверять, приведет ли текущий вызов присоединения к попытке записи за пределы. Таким образом, вам нужно что-то вроде (и дать переменные объяснительные имена, подобные этому) в первой строке вашей функции:

if (array_size < item_count) {
    //double size of array
}

Чтобы удвоить размер массива, вы должны создать новый массив с удвоеннойsize, скопируйте все элементы из старого массива, УДАЛИТЕ старый массив, обнулите указатель старого массива и каким-то образом обновите переменную array_size (возврат в main - это одна опция, статический счетчик int в самой функции - другая). Возможно, вам также придется вернуть указатель на новый массив в main. Или, может быть, вы можете просто переадресовать старый указатель на новый массив ПОСЛЕ использования этого указателя для удаления старого массива. Это все о том, как избежать утечек памяти. Итак, попробуйте придумать объявление метода, например:

int append(int* arrPtr, int value, int array_size, int item_count)

Этот конкретный подход означает, что main возвращает каждый раз размер массива в виде int после каждого добавления. Таким образом, вам нужно что-то в основном, например:

array_size = append(array, val, array_size, item_count);

Сложная часть будет при создании нового массива:

array_size = 2 * array_size;
int* temp = new int[array_size]
//copy everything over from old array to new using arrPtr and temp
for (int i = 0; i < array_size / 2; i++) {
    temp[i] = arrPtr[i]
}
//delete the contents of the old array:
delete[] arrPtr;
//pointer gymnastics to redirect arrPtr to the new array:
arrPtr = temp;
temp = nullptr;
//okay, now you are back out of the conditional and can use item_count to insert the 
//value into the array (doubled or not)
arrPtr[item_count] = value;
//don't forget to return array_size, and remember main must track item_count as well.
return array_size;

Это общая суть. Это не полный ответ, но должно дать вам достаточно для работы. По сути, большая часть вашего кода должна быть переписана, и вышеизложенное не является полным решением. Удачи.

0 голосов
/ 07 октября 2019

После получения сигнала от Двойной размер динамического массива Я решил это.

 #include<iostream>
  using namespace std;


  void add_element(int* &array, int &size)
  {int count = 0;

while(1)
{

int number;
cout << "What number do you want to add? " << endl;
cin >> number;
if (count == size)
{
    int newSize = size * 2;
    int *newArr = new int[newSize];
    for (int i = 0; i < count; ++i)
    {
        newArr[i] = array[i];
    }
    delete[] array;
    array = newArr;
    size = newSize;
}
  array[count] = number;
  ++count;
   int k;
  cout<<"Do u want to end, then press 0";
cin>>k;
if(k==0) break;
   }
 for(int g = 0; g<count; g++)
  cout<<array[g]<<'\t';
}

 int main()
  {
 int i,j,k,size;
   cin>>size;
  int* array = new int [size];

add_element(array, size);


 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...