⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shujujiegousuanfa.cpp

📁 对输入矩阵用三元组表存储并对其进行加罚、乘法和转置运算的程序。
💻 CPP
字号:
#include <stdio.h>          
#include <malloc.h>
#define MAX 1000
typedef struct
{
	int row;
	int col;
	int val;
}tb;
typedef struct 
{
	int m,n,t;
	tb data[MAX];
} TB;



TB *third( int a[4][4])     
    //将数组形式的存储的矩阵转化为三元组表示
 {
	int i,j,k=0;
	TB *c;
	c=(TB *)malloc(sizeof(TB));
	c->m=4;
	c->n=4;
	c->t=0 ;
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
		{
			if(a[i][j]!=0)
			{   k++;
			c->data[k].row=i+1;
			c->data[k].col=j+1;
			c->data[k].val=a[i][j];
			c->t++;
			}
		}
		return c;
}




void print(TB *c)             //输出矩阵的三元组表
{
	int i=1;
	if(c)
	{
	printf("所对应的三元组表为:\n");
    printf("  k row col val\n");
	printf("%3d%3d%4d%4d\n",i-1,c->m,c->n,c->t);
	while(i<=c->t)
		printf("%3d%3d%4d%4d\n",i++,c->data[i].row,c->data[i].col,c->data[i].val);
    }
}

TB *zhuangzhi(TB *c)           //矩阵的转置
{
	TB *p;
	p=(TB *)malloc(sizeof(TB));
	int i,j,k=0;
	p->m=c->n;
	p->n=c->m;
	p->t=c->t;
	for(i=1;i<=c->n;i++)
		for(j=1;j<=c->t;j++)
		{if(c->data[j].col==i)
			{
				k++;
				p->data[k].row=c->data[j].col;
				p->data[k].col=c->data[j].row;
				p->data[k].val=c->data[j].val;
				
			}
		}
	return p;
}


TB *jia(TB *A,TB *B)            //矩阵的加法
{
	TB *c;
	int i=1,j=1,k=0;
	c=(TB*)malloc(sizeof(TB));
	c->m=A->m;
	c->n=A->n;
	if(A->m==B->m&&A->n==B->n)
	{  while(i<=A->t&&j<=B->t)
	   {
		if(A->data[i].row==B->data[j].row)
			if(A->data[i].col==B->data[j].col)
		 {
			 k++;
			 c->data[k].row=A->data[i].row;
			 c->data[k].col=A->data[i].col;
			 c->data[k].val=A->data[i].val+B->data[j].val;
			 i++;j++;
		 }
			else
				if(A->data[i].col<B->data[j].col)
			 {
				 k++;
				 c->data[k].row=A->data[i].row;
				 c->data[k].col=A->data[i].col;
				 c->data[k].val=A->data[i].val;
				 i++;
			 }
				else
			 {
				 k++;
				 c->data[k].row=B->data[j].row;
				 c->data[k].col=B->data[j].col;
				 c->data[k].val=B->data[j].val;
				 j++;

			 }

		else
			if(A->data[i].row<B->data[j].row)
			{
				k++;
				c->data[k].row=A->data[i].row;
				c->data[k].col=A->data[i].col;
				c->data[k].val=A->data[i].val;
				i++;
			}
			else
			{
				k++;
				c->data[k].row=B->data[j].row;
				c->data[k].col=B->data[j].col;
				c->data[k].val=B->data[j].val;
				j++;
			}		

	 }
	 c->t=k;
	 return c;
    }
    else
        {
           printf("所输入的矩阵无法进行加法运算。\n");
           return NULL;
        }
}

TB *chengfa(TB *A,TB *B)           //矩阵的乘法
{
	TB *c;
	int i,j,k=0,t,p,q,s;
	c=(TB*)malloc(sizeof(TB));
	if(A->n==B->m)
	{for(t=1;t<=A->m;t++)
		for(p=1;p<=B->n;p++)
		{s=0;
		  for(i=1;i<=A->t;i++)
              for(j=1;j<=B->t;j++)
				 if(A->data[i].row ==t&&B->data[j].col ==p)
					for(q=1;q<=A->n;q++)
						if(A->data[i].col ==q&&B->data[j].row ==q)
							s=s+A->data[i].val*B->data[j].val;
			if(s!=0)
		 {
		      k++;
		      c->data[k].row=t;
		      c->data[k].col=p;
		      c->data[k].val=s;

         }
       }

				c->m=A->m;
				c->n=B->n;
				c->t=k;
				return c;
     }
     else
        {
           printf("所输入的矩阵无法进行乘法运算。\n");
           return NULL;
        }
}

int main()
{
     int i,j; TB *c,*d,*f;		
     int a1[4][4]={{1,0,3,0},{0,1,0,0},{0,0,1,0},{0,0,1,1}};
     int b1[4][4]={{3,0,0,0},{0,4,0,0},{0,0,1,0},{0,0,0,2}};
   	 

	printf("矩阵a1:\n");
	for (i=0;i<4;i++)
	{for (j=0;j<4;j++)
	printf("%5d",a1[i][j]);
	printf("\n");
	}

     printf("矩阵b1:\n");
	for (i=0;i<=3;i++)
	{for (j=0;j<=3;j++)
	printf("%5d",b1[i][j]);
	printf("\n");}
	

	c=third(a1); 
	d=third(b1);
	
	
	f=zhuangzhi(c);	
	printf("矩阵a1的转置矩阵");
	print(f);


	printf("a1+b1");
	f=jia(c,d);	
	print(f);
	
	printf("a1*b1");
    f=chengfa(c,d);
	print(f);
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -