【问题标题】:2D struct array: swap row and col?二维结构数组:交换行和列?
【发布时间】:2020-03-30 23:19:57
【问题描述】:

我想交换 2D 结构数组的整个列和行。

使用此代码,我可以交换行:

#define N 9 
typedef struct { 
    char number;
    bool editable; 
} FIELD;

int main(){
FIELD **f = (FIELD **) malloc(N * sizeof(FIELD *));
for (i=0; i<N; i++) {
    f[i] = (FIELD *) malloc(N * sizeof(FIELD)); 
}

//example: swap row 0 and row 8
FIELD *tmp;
tmp = f[0];
f[0] = f[8];
f[8] = tmp;
}

但是我怎样才能交换一整列呢?

【问题讨论】:

  • 请使用 C 或 C++ 标签,具体取决于您编码的语言。不要同时使用这两种语言,因为它们是不同的语言,并且可能有不同的解决方案。
  • 您必须交换列中的每个单独的值才能实现目标
  • 贴出的代码无法编译!除其他外,它缺少所需的 #include 语句。
  • OT:关于:FIELD **f = (FIELD **) malloc(N * sizeof(FIELD *)); 和类似的语句: 1) 在 C 中,返回的类型是 void*,可以分配给任何指针。强制转换只会使代码混乱。 2) 始终检查 (!=NULL) 返回值以确保操作成功。如果不成功,调用perror()将你的错误信息和系统认为发生错误的文字原因输出到stderr。 3) 退出程序前,每次内存分配调用free(),避免内存泄漏
  • 由于free() 正确处理包含NULL 的参数,因此使用calloc() 进行初始分配要好得多,因此在释放分配时不需要跟踪成功分配的数量跨度>

标签: c arrays algorithm pointers


【解决方案1】:

要交换整个列,您应该遍历所有行:

//example: swap column 0 and column 8
FIELD tmp;
for (i=0; i<N; i++) {
    tmp = f[i][0];
    f[i][0] = f[i][8]
    f[i][8] = tmp;
}

【讨论】:

    【解决方案2】:

    您必须按元素交换列。数组的布局允许您通过交换指针来交换行,但列元素分别位于单独的行上。

    void swap_cols (FIELD **f, int cola, int colb) {
        for (int i=0; i < N; ++i) {
            FIELD tmp = f[i][cola];
            f[i][cola] = f[i][colb];
            f[i][colb] = tmp;
        }
    }
    

    【讨论】:

      【解决方案3】:

      列没有指针交换。你必须通过算法来完成。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-29
        • 2023-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-24
        • 2021-03-29
        相关资源
        最近更新 更多