数据结构--3.1二维数组与矩阵乘法

结构体定义

#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;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值