JhSi
JhSi

Reputation: 145

Appending a dynamic array and doubling its size upon completion

Create a dynamic array of int with a initial space of 4. Write a function ‘append’ that appends a given value to this array. At any stage, if this function finds the array full it automatically doubles the size of array to accommodate this new value. Also write a function to display all the elements of this array. Write a main to test all these functions.

I made an attempt to solve the above question as given below. However, I am unable to get the correct code. Please help me

#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;
}

I need to solve this without using "Classes". How shall I do it?

Upvotes: 0

Views: 1233

Answers (2)

JhSi
JhSi

Reputation: 145

After taking cue from Double size of dynamic array I have solved it.

 #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);


 }

Upvotes: 0

neutrino_logic
neutrino_logic

Reputation: 1299

Your function needs to do the following: 1) Be able to check if the current append call will result in an out-of-bounds write attempt. So you need something like (and give variables explanatory names like this) this as the first line in your function:

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

To double the size of the array, you have to make a new array with twice the size, copy all the items over from the old array, DELETE the old array, null the old array's pointer, and somehow update the array_size variable (return to main is one option, a static int counter in the function itself is another). You may have to return a pointer to the new array to main, as well. Or maybe you can just re-address the old pointer to the new array AFTER using that pointer to delete the old array. This is all about avoiding memory leaks. So, try to come up with a method declaration like:

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

This particular approach means main is getting sent back the array size as an int after each append. So you need something in main like:

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

The tricky part will be when you make the new array:

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;

That's the general gist of it. This is not a complete answer, but should give you enough to work with. Basically, most of your code has to be rewritten, and the above is not a complete solution. Good luck.

Upvotes: 3

Related Questions