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

📄 稀疏矩阵.cpp

📁 稀疏矩阵
💻 CPP
字号:
 #include <stdio.h>
 #include"stdlib.h"
#include"conio.h"
 #define MaxSize 10 
 typedef int Datatype; 
 typedef struct
 {	int i,j;
	Datatype e;
 }Triple;

 typedef struct
 {	Triple data[MaxSize];
	int mu,nu,tu;
 }TSMatrix;
 
 //--------------------输出稀疏矩阵----------------//
 void ShowTSMatrix(TSMatrix *a)
 {	
	int p,C;
	int tu=0;
	for(p=0;p<a->mu;p++)
	{ 
		for(C=0;C<a->nu;C++)
		{
		  if(a->data[tu].i==p&&a->data[tu].j==C)
		  {
			 printf("%d   ",a->data[tu].e);
			 tu++;
			}
			else printf("0   ");
		}//for
	 printf("\n");
	}
 }


//-------------------矩阵加算法----------------/
 void  AddTSMatrix( TSMatrix *A, TSMatrix *B, TSMatrix *C)
 {
	int p,q,k,l;
	C->mu=A->mu;
	C->nu=A->nu;
	C->tu=0;	
	C->data[C->tu].e=0;	//三元组元素初值
	k=0; l=0;

	for(p=0;p<C->mu;p++)
  for(q=0;q<C->nu;q++)
	if(A->data[k].i==p&&A->data[k].j==q)
	{	
		//如果该元素在A表中有
			C->data[C->tu].e=0;//初始化三元组值
		C->data[C->tu].i=p;
		C->data[C->tu].j=q;
		C->data[C->tu].e+=A->data[k].e;
	    if(B->data[l].i==p&&B->data[l].j==q)
		{	//同时在B中也有 		
		 C->data[C->tu].e+=B->data[l].e;
		 l++;	//指向B表下一元素
		}
		k++;C->tu++;//指向A表下一元素,C表长增1
	}
	else if(B->data[l].i==p&&B->data[l].j==q)
	{	
		//若A中无,而B中有该元素  
		C->data[C->tu].e=0;//初始化三元组值
		C->data[C->tu].i=p;
		C->data[C->tu].j=q;
		C->data[C->tu].e+=B->data[l].e;	
		l++;C->tu++;//指向B表下一元素,C表长增1

	}
 }

//-------------------矩阵乘法运算的算法-------------//
  void muulityTSMatrix(TSMatrix *A,TSMatrix *B,TSMatrix *Q)
  {int ka,kb,row,col;
 ka=kb=1;  Q->tu=0;
 Q->mu=A->mu;
	Q->nu=A->nu;
	Q->tu=0;	
	Q->data[Q->tu].e=0;	//三元组元素初值
	if(A->tu*B->tu!=0){
	for(row=0;row<A->mu;row++) {
		for(col=0;col<B->nu;col++)	
 if(A->data[ka].j==B->data[kb].i){
 Q->data[Q->tu].i=A->data[ka].i;
 Q->data[Q->tu].j=B->data[kb].j;
 Q->data[Q->tu].e+=A->data[ka].e*B->data[kb].e; 
 ka++;
 kb++;}
 Q->tu++;} 	  
	}   
	  }			   
//------------------矩阵的减法运算----------------//
  void Dec_TSMatrix(TSMatrix *A,TSMatrix *B,TSMatrix *D)
  {		int p,q,k,l;
	D->mu=A->mu;
	D->nu=A->nu;
	D->tu=0;	
	D->data[D->tu].e=0;	//三元组元素初值
	k=0; l=0;

	for(p=0;p<D->mu;p++)	
  for(q=0;q<D->nu;q++)	
	if(A->data[k].i==p&&A->data[k].j==q)
	{	
		//如果该元素在A表中有
		D->data[D->tu].e=0;//初始化三元组值
		D->data[D->tu].i=p;
		D->data[D->tu].j=q;
		D->data[D->tu].e+=A->data[k].e;
	    	if(B->data[l].i==p&&B->data[l].j==q)
		{	//同时在B中也有 		
		 D->data[D->tu].e-=B->data[l].e;
		 l++;	//指向B表下一元素
		}
		k++;D->tu++;//指向A表下一元素,C表长增1
	}
	else if(B->data[l].i==p&&B->data[l].j==q)
	{	
		//若A中无,而B中有该元素  
		D->data[D->tu].e=0;//初始化三元组值
		D->data[D->tu].i=p;
		D->data[D->tu].j=q;
		D->data[D->tu].e-=B->data[l].e;	
		l++;D->tu++;//指向B表下一元素,C表长增1
	} }
 
  //--------------矩阵转置的算法---------------//
 void Transpose(TSMatrix *A,TSMatrix *T)
 {T->mu=A->mu;T->nu=A->nu;T->tu=A->tu;
 int col=0,t=0,p=0,q=0;
 if(T->tu){	   int q=0;
		   for(int col=0;col<A->nu;++col)
 				for(int	p=0;p<A->tu;++p)
					if(A->data[p].j==col)
					{T->data[q].i=A->data[p].j;
					T->data[q].j=A->data[p].i;
					T->data[q].e=A->data[p].e;
					++q;}
	  }	 }	

void main()
{
	int choice,t;
	TSMatrix A,B,C,Q,T,D;
 inp:	if(A.tu*B.tu==0)
	{		printf("A、B为能零矩阵!\n");
		getche();system("cls");goto ip;}
ip:	printf("---------------------------稀疏矩阵计算器-----------------------------\n");
		printf("=========================================================================\n");
		printf("  初始化-1     加法-2     乘法-3     转置-4     减法-5     退出-0\n");
		printf("=========================================================================\n");
	  printf("测试数据为:A:(1,3,4),(2,2,4),(2,4,3),(3,3,9),A.tu=4,A.nu=5,A.mu=5.\n");
	printf("           B:(2,3,4),(2,4,5),B.mu=5,B.nu=5,B.tu=2.\n");
	  printf("操作(0-5):");
 scanf("%d",&choice);
 printf("\n\n");
	  switch(choice)
	  {case 1:
	  { printf("输入A矩阵的行数、列数,非零元数目:");
	 scanf("%d%d%d",&A.mu,&A.nu,&A.tu);
	 printf("输入非零元的坐标、值(i,j,e):");
 for(t=0;t<A.tu;t++)
 {scanf("%d%d%d",&A.data[t].i,&A.data[t].j,&A.data[t].e);}
   printf("输入B矩阵的行数、列数,非零元数目:");
	 scanf("%d%d%d",&B.mu,&B.nu,&B.tu);
	 printf("输入非零元的坐标、值(i,j,e):");
 for(t=0;t<B.tu;t++)
 {scanf("%d%d%d",&B.data[t].i,&B.data[t].j,&B.data[t].e);}
  printf("矩阵A为:\n\n");
	ShowTSMatrix(&A);
    printf("矩阵B为:\n\n");	
	ShowTSMatrix(&B);
	  }
	  getche();system("cls");
	  goto inp;
	   case 2:AddTSMatrix(&A,&B,&C);
	printf("矩阵A+B的矩阵为:\n\n");
	ShowTSMatrix(&C);
	getche();system("cls");
	goto inp;
	  case 3:
   	 muulityTSMatrix(&A,&B,&Q);
	 printf("矩阵A*B的矩阵为:\n\n");
	 ShowTSMatrix(&Q);
	 getche();system("cls");goto inp;
	  case 4:
	 printf("矩阵A的转置矩阵为:\n\n");
	 Transpose(&A,&T);
	 ShowTSMatrix(&T);
	 getche();system("cls");
	 goto inp;
	  case 5:
		  printf("矩阵A-B的矩阵为:\n\n");
		  Dec_TSMatrix(&A,&B,&D);
		  ShowTSMatrix(&D);
		  getche();system("cls");
		  goto inp;
	  case 0:printf("谢谢使用!再见!\n\n");
		  exit(0);
	  default:printf("错误命令!\n\n");
		   getche();system("cls");
		  goto inp;}   
}

⌨️ 快捷键说明

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