结构体定义
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define ROWS 4
#define COLUMNS 5
//定义二维数组
typedef struct TwoDArray{
int rows;//行
int columns;//列
int** elements;
}TwoDArray,*TwoDArrayPtr;
typedef struct TwoDStaticArray{
int rows;
int columns;
int elements[ROWS][COLUMNS];
}TwoDStaticArray,*TwoDStaticArrayPtr;
TwoDArrayPtr initTwoDArray(int paraRows,int paraColumns)
{
int i;
TwoDArrayPtr resultPtr = (TwoDArrayPtr)malloc(sizeof(TwoDArray));
resultPtr->rows = paraRows;
resultPtr->columns = paraColumns;
resultPtr->elements = (int**)malloc(paraRows*sizeof(int*));
for(i=0;i<paraRows;i++)
{
resultPtr->elements[i] = (int*)malloc(paraColumns*sizeof(int));
}
return resultPtr;
}//初始化二维数组
初始化
对于c语言来说,二维数组就是一个一维数组,只不过这个一维数组的每个元素又分别是一个一维数组。同理推广到三维数组甚至更高维。其次,c语言的的二维数组是以行序为主序的,即相当于二维数组的每一行单独是一个大的元素,第一行为第一个元素,第二行为第二个元素。
如下图:
TwoDArrayPtr initTwoDArray(int paraRows,int paraColumns)
{
int i;
TwoDArrayPtr resultPtr = (TwoDArrayPtr)malloc(sizeof(TwoDArray));
resultPtr->rows = paraRows;
resultPtr->columns = paraColumns;
resultPtr->elements = (int**)malloc(paraRows*sizeof(int*));
for(i=0;i<paraRows;i++)
{
resultPtr->elements[i] = (int*)malloc(paraColumns*sizeof(int));
}
return resultPtr;
}//初始化二维数组
生成随机数
void randomizeTwoDArray(TwoDArrayPtr paraPtr,int paraLowerBound,int paraUpperBound)
{
int i,j;
for(i=0;i<paraPtr->rows ;i++)
{
for(j=0;j<paraPtr->columns ;j++)
{
paraPtr->elements[i][j] = rand() % (paraUpperBound - paraLowerBound) + paraLowerBound;
}
}
} //随机分配元素
矩阵相乘
矩阵相乘的要求是:tempPtr1的列要与tempPtr2的行相等。
三重循环中先循环完k后再循环j最后循环i,每循环完一层j都要重置sum
TwoDArrayPtr matrixMultiply(TwoDArrayPtr paraPtr1,TwoDArrayPtr paraPtr2 )
{
int i,j,k,sum;
if(paraPtr1->columns != paraPtr2->rows )
{
printf("can not multiplied.");
return NULL;
}
TwoDArrayPtr resultPtr = initTwoDArray(paraPtr1->rows ,paraPtr2->columns );
for(i=0;i<paraPtr1->rows ;i++)
{
for(j=0;j<paraPtr2->columns ;j++)
{
sum = 0;
for(k=0;k<paraPtr1->columns ;k++)
{
sum += paraPtr1->elements[i][k] * paraPtr2->elements[k][j];
}
resultPtr->elements[i][j] = sum;
printf("sum = %d ",sum);
}
}
return resultPtr;
}//相乘
测试代码
void twoDArrayTest(){
TwoDArrayPtr tempPtr1, tempPtr2, tempPtr3;
tempPtr1 = initTwoDArray(3, 2);
randomizeTwoDArray(tempPtr1, 1, 5);
printf("The first matrix:\r\n");
printTwoDArray(tempPtr1);
tempPtr2 = initTwoDArray(2, 4);
randomizeTwoDArray(tempPtr2, 4, 9);
printf("The second matrix:\r\n");
printTwoDArray(tempPtr2);
tempPtr3 = matrixMultiply(tempPtr1, tempPtr2);
printf("The result:\r\n");
printTwoDArray(tempPtr3);
}//测试程序
运行结果
The first matrix:
2, 4,
3, 1,
2, 1,
The second matrix:
7, 7, 6, 8,
4, 4, 5, 6,
sum = 30 sum = 30 sum = 32 sum = 40 sum = 25 sum = 25 sum = 23 sum = 30 sum = 18 sum = 18 sum = 17 sum = 22 The result:
30, 30, 32, 40,
25, 25, 23, 30,
18, 18, 17, 22,
(0,0); 10622456;(0,1); 10622460;(0,2); 10622464;(0,3); 10622468;(0,4); 10622472;(1,0); 10622476;(1,1); 10622480;(1,2); 10622484;(1,3); 10622488;(1,4); 10622492;(2,0); 10622496;(2,1); 10622500;(2,2); 10622504;(2,3); 10622508;(2,4); 10622512;(3,0); 10622516;(3,1); 10622520;(3,2); 10622524;(3,3); 10622528;(3,4); 10622532;