您的位置:首页 > 编程语言 > C语言/C++

二维数组动态分配(c语言)之HWOJ矩阵乘法

2014-07-30 16:43 706 查看
参考链接:C语言中二维数组的动态申请与释放

/article/7111550.html

有时根据题意需得根据输入的二维数来动态的创建二维数组,那么此时就不能想以前一样直接定义多少行多少列了。因为不知道行列多少,假如设定太大浪费空间,申请太小完成不了程序的数据存储。因此需要合理的开辟二维空间。

以下的两种方法都可以建立动态的二维空间数组。

方法一:

int i,j;

int r,c;

int **a; //创建二维指针来指向数组

scanf("%d%d",&r,&c);

a = (int **) malloc(sizeof(int *) * r);//注意申请的指针格式

for (j=0;j<r;j++){

a[j] = (int *) malloc(sizeof(int) * c);

……

……

}

释放为:

for (j=0;j<r;j++)

free(a[j]);//先释放一维指针

free(a);//最后释放我二维指针

方法二:

建立链表来存放二维数组。

typedef struct arr

{

int *array;

}arr;

main()

{

arr *array1;

int rowx,rowy;

int i,j,k=0;

scanf("%d %d",&rowx,&rowy);

array1=(arr *)malloc(sizeof(arr)*rowx);//创建链表数组

for(i=0;i<rowx;i++)

//再在每一个链表中创建一维数组,这样整体就构成二维数组

array1[i].array=(int *)malloc(sizeof(int)*rowy);

……

……

释放同上:

for (j=0;j<rowx;j++)

free(array1[j].array);

free(array);


http://blog.163.com/kevinlee_2010/
矩阵乘法例程如下:HUAWEI OJ:矩阵乘法

#include<stdio.h>
#include <malloc.h>
/********************************************************/
int main(int argc, char *argv[])
{
int **str1;//创建二维指针来指向数组
int **str2;
int i, j, k,temp;
int x, y, z;

scanf("%d", &x);//str1行数
scanf("%d", &y);//str1列数和str2的行数
scanf("%d", &z);//str2列数

//(1)二维数组动态内存申请
str1 = (int **)malloc(sizeof(int*) * x);//行数
for (i=0; i<x; i++){
str1[i] = (int *)malloc(sizeof(int) * y);//列数
}

str2 = (int **)malloc(sizeof(int*) * y);
for (i=0; i<y; i++){
str2[i] = (int *)malloc(sizeof(int) * z);
}

//(2)二维数组数据输入
for (i=0; i<x; i++){
for (j=0; j<y; j++){
scanf("%d", &str1[i][j]);
}
}

for (i=0; i<y; i++){
for (j=0; j<z; j++){
scanf("%d", &str2[i][j]);
}
}

for (i=0; i<x; i++){
for (k=0; k<z; k++){
temp = 0;
for (j=0; j<y; j++){
temp += str1[i][j] * str2[j][k];
}

if (k == z-1){//行末不输出空格
printf("%d", temp);
}
else{
printf("%d ", temp);
}
}
printf("\n");
}
/*
//二维数组数据输出
for (i=0; i<x; i++){
for (j=0; j<y; j++){
printf("%d ", str1[i][j]);
}
printf("\n");
}

for (i=0; i<y; i++){
for (j=0; j<z; j++){
printf("%d ", str2[i][j]);
}
printf("\n");
}
*/

//(3)二维数组内存释放
for (i=0; i<x; i++){//行数
free(str1[i]);//先释放一维指针
}
free(str1);//最后释放我二维指针

for (i=0; i<y; i++){
free(str2[i]);
}
free(str2);

return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: