C 删除并在2D动态阵列中删除和紧凑的行

C++ Delete and Compact even rows in 2D dynamic array

本文关键字:删除 阵列 2D 动态      更新时间:2023-10-16

我需要一些帮助

此程序必须执行:

•删除所有偶数行

•紧凑了剩余的行2D阵列的顶部

https://gyazo.com/64954d5a5ace39e7bb4264f2e2a9ecdf

代码:

int main(int argc, char ** argv){
   int ** array2d;
   int size = 10;
   array2d = new int *[size];
   cout << "***** Before Compaction ******" << endl;
   for (int i = 0; i < size; i++) {
      array2d[i] = new int[size];
      cout << "ROW " <<i << ":";
      for (int j = 0; j < size; j++) {
         array2d[i][j] = i;
         cout << " "<< array2d[i][j];
      }
      cout << endl;
   }
   //NEED HELP WITH THIS PART DOWN HERE

   for (int i = 0; i < size; i++) {
      if (i % 2 == 0) { // delete the even rows
         delete[] array2d[i];
         array2d[i] = NULL;
      }
      // for each row in the first half, redirect the pointer
      // to the next odd row
      if(i<size/2){
         array2d[i] = array2d[2 * i + 1];
         array2d[2 * i + 1] = NULL;
      }
      cout << endl;
   }
   return 0;
}
  if (i % 2 == 0) { // delete the even rows
     delete[] array2d[i];
     array2d[i] = NULL;
  }

i == 0对应于第一行。我认为您可能想将其更改为:

  if ((i+1) % 2 == 0) { // delete the even rows
     delete[] array2d[i];
     array2d[i] = NULL;
  }

然后,

     array2d[i] = array2d[2 * i + 1];
     array2d[2 * i + 1] = NULL;

需要:

     array2d[i] = array2d[2 * i];
     array2d[2 * i] = NULL;

update

您拥有的问题以及我建议的问题是您正在泄漏内存。当您使用时:

     array2d[i] = array2d[2 * i];

丢失了为array2d[i]分配的内存。您无法处理该内存。您可能需要交换指针值以允许您分配所有内存。

     int* temp = array2d[i];
     array2d[i] = array2d[2 * i];
     array2d[2 * i] = temp;