gpt4 book ai didi

c - C 中的可变大小矩阵

转载 作者:太空狗 更新时间:2023-10-29 15:30:08 25 4
gpt4 key购买 nike

如何在 C 中实现可变大小矩阵(int)?为了澄清起见,我必须能够根据实际情况添加行和列(在 if 子句内)。

谢谢,维。

最佳答案

您可以编写一个可重用的组件,将接口(interface)与实现分开。您应该做出的主要决定是实现稀疏或密集分配方案。

假设一个密集的模式,对象可能是

在矩阵.h中

#include <stdio.h>

typedef struct matrix {
int nrows, ncols, *data;
} matrix;

matrix* allocate(matrix *mat, int nrows, int ncols);
int *cell(const matrix *mat, int row, int col);
matrix *addrow(matrix *mat);
matrix *addcol(matrix *mat);
matrix *print(FILE *f, matrix *mat);

在矩阵.c中

#include "matrix.h"
#include <assert.h>
#include <stdlib.h>
#include <string.h>

matrix* allocate(matrix *mat, int nrows, int ncols)
{
assert(nrows > 0 && ncols > 0);
mat->nrows = nrows;
mat->ncols = ncols;
mat->data = malloc(sizeof(int) * nrows * ncols);
return mat;
}

int *cell(const matrix *mat, int row, int col)
{
assert(row >= 0 && row < mat->nrows);
assert(col >= 0 && col < mat->ncols);
return mat->data + row * mat->ncols + col;
}

matrix *addrow(matrix *mat)
{
mat->nrows++;
mat->data = realloc(mat->data, sizeof(int) * mat->nrows * mat->ncols);
return mat;
}

/* adding a column it's an expensive operation */
matrix *addcol(matrix *mat)
{
mat->ncols++;
mat->data = realloc(mat->data, sizeof(int) * mat->nrows * mat->ncols);

/* shift rows' elements, to make room for last column */
for (int r = mat->nrows - 1; r > 0; --r)
{
int *dest = mat->data + r * mat->ncols,
*orig = mat->data + r * (mat->ncols - 1);
memmove(dest, orig, sizeof(int) * (mat->ncols - 1));
}
return mat;
}

matrix *print(FILE *f, matrix *mat)
{
for (int r = 0; r < mat->nrows; ++r)
{
for (int c = 0; c < mat->ncols; ++c)
fprintf(f, "%4d ", *cell(mat, r, c));
fprintf(f, "\n");
}
return mat;
}

int main_matrix(int argc, char **argv)
{
matrix m;
allocate(&m, 3, 5);

for (int r = 0; r < m.nrows; ++r)
for (int c = 0; c < m.ncols; ++c)
*cell(&m, r, c) = 35;
print(stdout, &m);
fprintf(stdout, "\n");

addrow(&m);
for (int c = 0; c < m.ncols; ++c)
*cell(&m, m.nrows - 1, c) = 45;
print(stdout, &m);
fprintf(stdout, "\n");

addcol(&m);
for (int r = 0; r < m.nrows; ++r)
*cell(&m, r, m.ncols - 1) = 46;
print(stdout, &m);
fprintf(stdout, "\n");

// remember to free memory
free(m.data);

return argc;
}

测试输出:

  35   35   35   35   35 
35 35 35 35 35
35 35 35 35 35

35 35 35 35 35
35 35 35 35 35
35 35 35 35 35
45 45 45 45 45

35 35 35 35 35 46
35 35 35 35 35 46
35 35 35 35 35 46
45 45 45 45 45 46

关于c - C 中的可变大小矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9853411/

25 4 0
文章推荐: html - 围绕超链接的 CSS Circle
文章推荐: c - 使用 signed char 表示网络地址的原因?
文章推荐: html - 如何强制所有
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com