【问题标题】:Snake order sorting a 2D array with pointers (Solved)使用指针对二维数组进行蛇形排序(已解决)
【发布时间】:2022-01-16 03:59:12
【问题描述】:

我不擅长 C 指针,我不确定我应该如何对整个数组进行排序,下面的代码仅按行对数组进行排序,并带有警告“赋值从指针目标类型中丢弃 'const' 限定符 [ -Wdiscarded-qualifiers]"。此代码确实适用于 Windows,但不确定是否适用于其他操作系统。我应该使用 2D const int 指针数组及其大小 m 作为输入来创建一个名为 snake 的函数。我不允许移动或交换要扫描的数组中的内容,也不允许编辑整个 main 函数。例如,整个程序的输入是

3
9 8 7
5 4 6
3 2 1

正确的输出应该是

1 2 3
6 5 4
7 8 9

相反,我得到了这个

7 8 9
4 5 6
1 2 3

这是我的代码。 snake() 中有一个注释部分,因为如果我取消注释,断言函数将失败。我试图在排序后反转偶数行(但索引从 0 开始,所以你也可以说奇数行)。

#include <stdio.h>
#include <assert.h>

void snake(const int *ptr_array[100][100], int m){
    int* p =NULL;
    int temp;
    for(int y=0;y<m;y++){
        for(int k=0;k<m-1;k++){
          for(int g=0;g<m-k-1;g++){
            if(*ptr_array[y][g]>*ptr_array[y][g+1]){
              p=(ptr_array[y][g]);
              (ptr_array[y][g])=(ptr_array[y][g+1]);
              (ptr_array[y][g+1]) = p;
          }
      }
  } 
}
// for(int h=1;h<m;h+=2){
//     for(int g=0;g<m/2;g++){
//         p = (ptr_array[h][m-g]);
//         (ptr_array[h][m-g]) = (ptr_array[h][g]);
//         (ptr_array[h][g]) = p;
//     }
// }
}

int main()
{
  int array[100][100], check[100][100];
  const int *ptr_array[100][100];
  int i, j, m;

  scanf("%d", &m);
  for (i = 0; i < m; i++){
    for (j = 0; j < m; j++) {
      ptr_array[i][j] = &(array[i][j]);
      scanf("%d", &(array[i][j]));
      check[i][j] = array[i][j];
  }
}

snake(ptr_array, m);

for (i = 0; i < m; i++) {
    for (j = 0; j < m; j++) {
      assert(check[i][j] == array[i][j]);
      assert((ptr_array[i][j] >= &array[0][0]) && (ptr_array[i][j] <= &array[99][99]));
      printf("%d ", *(ptr_array[i][j]));
  }
  printf("\n");
}

return 0;
}

【问题讨论】:

    标签: arrays c sorting pointers multidimensional-array


    【解决方案1】:
    #include <stdio.h>
    
    void snake(const int *ptr_array[100][100], int m){
        int* p =NULL;
        int* w=NULL;
        int temp,l;
        for(int y=0;y<m;y++){
            for(int k=0;k<m;k++){
                p = ptr_array[y][k];
                l = k+1;
                for(int g=y;g<m;g++){
                    while(l<m){
                        if(*p>*ptr_array[g][l]){
                            p=(ptr_array[g][l]);
                            (ptr_array[g][l])=(ptr_array[y][k]);
                            (ptr_array[y][k]) = p;
                        }
                        l++;
                    }
                    l=0;
                }
            } 
        }
        for(int h=1;h<m;h+=2){
            for(int g=0;g<=(m-1)/2;g++){
                w = (ptr_array[h][m-1-g]);
                (ptr_array[h][m-1-g]) = (ptr_array[h][g]);
                (ptr_array[h][g]) = w;
            }
        }
    }
    

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 2017-12-29
    • 2013-08-17
    • 2015-09-17
    • 2015-09-16
    相关资源
    最近更新 更多