数据结构二维数组及矩阵相乘

一.源代码

二级指针在初始化时应注意,空间应分两次分配,先分配指向指针的指针空间,再分配一级指针的空间。

#include <stdio.h>
#include <malloc.h> 
#include <stdlib.h>

#define ROWS 4
#define COLUMNS 5

typedef struct DArray{
	int row;
	int column;
	int **element;
}TwoDArray, *TwoDArrayPtr;

typedef struct DstaticArray{
	int row;
	int column;
	int element[ROWS][COLUMNS];
}DstaticArray, *DstaticPtr;

void initDArray(TwoDArrayPtr *paraPtr,int paraRows,int paraColumns){
	*paraPtr=(TwoDArrayPtr)malloc(sizeof(TwoDArray));
	(*paraPtr)->row=paraRows;
	(*paraPtr)->column=paraColumns;
	
	(*paraPtr)->element=(int**)malloc(paraRows*sizeof(int*));
	int i;
	for(i=0;i<paraRows;i++){
		(*paraPtr)->element[i]=(int*)malloc(paraColumns*sizeof(int)); 
	}
}

void initDstaticArray(DstaticPtr paraPtr,int paraRow,int paraColumn){
	paraPtr=(DstaticPtr)malloc(sizeof(DstaticArray));
	paraPtr->row=paraRow;
	paraPtr->column=paraColumn; 
	
	int i,j;
	for(i=0;i<ROWS;i++){
		for(j=0;j<COLUMNS;j++){
			paraPtr->element[i][j]=i*10+j;
			printf("‘%d,%d’,%d",i,j,&paraPtr->element[i][j]);
		}
	}

}

void randArray(TwoDArrayPtr paraPtr,int lower,int upper){
	int i,j;
	for(i=0;i<paraPtr->row;i++){
		for(j=0;j<paraPtr->column;j++){
			paraPtr->element[i][j]=rand()%(upper-lower)+lower;
		} 
	}
}

void printArray(TwoDArrayPtr paraPtr){
	int i,j;
	for(i=0;i<paraPtr->row;i++){
		for(j=0;j<paraPtr->column;j++){
			printf("%d ",paraPtr->element[i][j]);
		} 
		printf("\r\n");
	}
}

TwoDArrayPtr matrixMultiply(TwoDArrayPtr paraPtr1, TwoDArrayPtr paraPtr2){
	int i,j,k,sum;
	TwoDArrayPtr paraPtr3;
	initDArray(&paraPtr3,paraPtr1->row,paraPtr2->column);
	
	if(paraPtr1->column!=paraPtr2->row){
		printf("两个矩阵不能相乘!");
		return NULL; 
	}
	
	for(i=0;i<paraPtr1->row;i++){
		for(j=0;j<paraPtr2->column;j++){
			int sum=0;
			for(k=0;k<paraPtr1->column;k++){
				sum+=paraPtr1->element[i][k]*paraPtr2->element[k][j]; 
			}
			paraPtr3->element[i][j]=sum; 
		}
	}
	return paraPtr3;
}

void twoDArrayTest(){
	TwoDArrayPtr tempPtr1, tempPtr2, tempPtr3;
	initDArray(&tempPtr1,3, 2);
	randArray(tempPtr1, 1, 5);
	printf("The first matrix:\r\n");
	printArray(tempPtr1);

	initDArray(&tempPtr2,2, 3);
	randArray(tempPtr2, 4, 9);
	printf("The second matrix:\r\n");
	printArray(tempPtr2);

	tempPtr3 = matrixMultiply(tempPtr1, tempPtr2);
	printf("The result:\r\n");
	printArray(tempPtr3);
}


int main(){
	twoDArrayTest();
	DstaticPtr tempPtr;
	initDstaticArray(tempPtr,2,4);

	return 1;
}

测试结果

The first matrix:
2 4
3 1
2 1
The second matrix:
7 7 6
8 4 4
The result:
46 30 28
29 25 22
22 18 16

二.总结

这里二维数组给了两种初始化方式,一种是用指针动态分配空间,一种是用数组静态分配。

指针在未初始化时不能作为函数参数传入函数,应该传指针的地址给函数。

矩阵的相乘算法较简单,不再赘述。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值