数据结构与算法·实验六

1、设矩阵A、矩阵B和矩阵C为采用压缩存储方式存储的n阶对角矩阵,矩阵元素为整数类型,要求:

(1)编写实现矩阵加法运算C=A+B的函数

(2)编写实现矩阵乘法运算C=A*B的函数

(3)以下面的数据为测试例子,编写一个主程序进行测试



#include<stdio.h>
#include<malloc.h>
#include"head.h"
void main()
{
	int i,n,m;
	int *A,*B,*C;
	printf("请输入矩阵数n:");
	scanf("%d",&n);
	m=n*(n+1)/2;
	A=(int *)malloc(m,sizeof(int));
	B=(int *)calloc(m,sizeof(int));
	C=(int *)calloc(m,sizeof(int));
	printf("输入矩阵A的压缩形式(下三角)\n");
	for(i=0;i<m;i++)
	{
		scanf("%d",&A[i]);
	}	
	printf("输入矩阵B的压缩形式(下三角)\n");
	for(i=0;i<m;i++)
	{
		scanf("%d",&B[i]);
	}
	add(A,B,C,n);
	print(A,B,C,n);
	printf("/***------------------------------------***/\n\n");
	//multiply(A,B,n);
	multiply2(A,B,n);
}


void add(int *A,int *B,int *C,int n)
{
	int i,s=n*(n+1)/2;
	for(i=0;i<s;i++)
	{	
		*(C+i)=*(A+i)+*(B+i);
	}
}

void print(int *A,int* B,int* C,int n)
{
	int i,j;
	printf("A=\n");
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
		{	
			if(i>=j)
			{
				printf("%d\t",A[i*(i-1)/2+j-1]);
			}
			else
			{
				printf("%d\t",A[j*(j-1)/2+i-1]);
			}
		}
		printf("\n\n");
	}

	printf("B=\n");
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
		{	
			if(i>=j)
			{
				printf("%d\t",B[i*(i-1)/2+j-1]);
			}
			else
			{
				printf("%d\t",B[j*(j-1)/2+i-1]);
			}
		}
		printf("\n\n");
	}

		printf("C=\n");
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
		{	
			if(i>=j)
			{
				printf("%d\t",C[i*(i-1)/2+j-1]);
			}
			else
			{
				printf("%d\t",C[j*(j-1)/2+i-1]);
			}
		}
		printf("\n\n");
	}
}

void multiply(int *A,int *B,int n)
{
	int i,j,o=0;
	int k,l,p;
	int t[80][80],s[80][80],r[80][80];
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
		{	
			if(i>=j)
			{
				t[i][j]=A[i*(i-1)/2+j-1];
			}
			else
			{
				t[i][j]=A[j*(j-1)/2+i-1];
			}
		}
	}
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
		{	
			if(i>=j)
			{
				s[i][j]=B[i*(i-1)/2+j-1];
			}
			else
			{
				s[i][j]=B[j*(j-1)/2+i-1];
			}
		}
	}
	printf("D=\n");
	for(l=1;l<=n;l++)
	{
		for(k=1;k<=n;k++)
		{
			for(p=1;p<=n;p++)
			{
				o=o+(t[l][p])*(s[p][k]);
			}
			r[l][k]=o;
			o=0;
		}
	}
	for(l=1;l<=n;l++)
	{
		for(p=1;p<=n;p++)
		{
			printf("%d\t",r[l][p]);
		}
		printf("\n\n");
	}
}

int get(int i,int j)
{
	if(i>=j)
		return i*(i-1)/2+j-1;
	else
		return j*(j-1)/2+i-1;
}

int multiply2(int *A,int *B,int n)
{
	int i,j,k,sum;
	int C[80][80];
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
		{
			sum=0;
			for(k=1;k<=n;k++)
			{
				sum+=A[get(i,k)]*B[get(k,j)];
			}
			C[i][j]=sum;
		}
	}
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
		{
			printf("%d\t",C[i][j]);
		}
		printf("\n\n");
	}
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值