数据结构关于稀疏矩阵相加问题


近些日子也是在写数据结构的一些东西,老师出了一道题,原题是,用三元组方法储存两个稀疏矩阵,并将这两个矩阵相加。

今天下午也就那出来想了想,写了写



#include<stdio.h>
#define MAX 100 
struct Triple{
	int i,j;
	int e;
}; 
struct TSMatrix{
	Triple date[MAX+1];//非零三元组表,date[0]不用 
	int mu,nu,tu;//矩阵的行数,列数和非零圆个数 
};


/*创建稀疏矩阵*/
int CreatSMatrix(TSMatrix &M)
{
	int i;
	Triple T;
	int flag=0;
	printf("please input the TSMatrix's line low and amount\n");
	scanf("%d %d %d",&M.mu,&M.nu,&M.tu);
	if(M.tu>MAX)//如果非零圆太多,退出 
	return 0;
	M.date[0].i=0;
	for(i=0;i<M.tu;i++)
	{
		do
		{
			printf("请按行输入第%d个非零元素在的行,列,元素值\n");
			scanf("%d %d %d ",&T.i,&T.j,&T.e);
			if(T.i<1||T.i>M.mu||T.j<1||T.j>M.nu)
			flag=1;
		}while(flag);//输入值范围不对重新输入 
		M.date[i]=T; 
	}
	return 0;
 } 
 /*比较函数*/
int  comp(int a,int b)
{
	if(a<b)
	return -1;
	if(a==b)
	return 1;
 } 

/*稀疏矩阵加法运算函数*/
 int AddSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q)//M+N=Q 
 {
 	int m=1,n=1,q=0;//m,n,q 是矩阵元素个数 
 	if(M.mu!=N.mu||M.nu!=N.nu)//如果行列不相等
	 return 0;
	 Q.mu=M.mu;
	 Q.nu=M.nu; //设置Q的行数和列数
	 while(m<=M.tu&&n<=N.tu)//当两个矩阵的元素都没有处理完的时候 
	{ switch (comp(M.date[m].i,N.date[n].i))//比较两行当前元素的行值关系 
	 {
	 	case -1:Q.date[++q]=M.date[m++];//矩阵M的行值小,将M的值赋给Q 
	 		break;
	 	case 0:switch(comp(M.date[m].j,N.date[n].j))//,行值相等。继续比较当前元素的列值关系 
	 	{
	 		case -1:Q.date[++q]=M.date[m++]; //矩阵M的列值较小,将M赋给Q 
	 			break;
	 		case 0:Q.date[++q]=M.date[m++];//MN矩阵当前非零元的行列军相等,将其想加赋给Q 
	 				Q.date[q].e+=N.date[n++].e;//想加M+N 
	 			if(Q.date[q].e==0)//两元素之和为0,不存入稀疏矩阵 
	 			{
	 				q--;
				 }
			case 1:Q.date[++q]=N.date[n++];//矩阵N的列值小,将N的值赋给矩阵Q 
	 		
	 		
		 }
		 break;
		 	case 1:Q.date[++q]=N.date[n++];//矩阵N的行值小,将N的行值赋给矩阵Q 
			
	}//以下循环最多执行一个,,, 
	while(m<=N.tu)//矩阵N的元素已经全部处理完毕,开始处理N的元素 
	Q.date[++q]=M.date[m++];
	while(n<=N.tu)//矩阵M的元素已经全部处理完毕,开始处理M的元素 
	Q.date[++q]=N.date[n++];
	if(q>MAX)//非零元太多 
		return -1;
		else
		Q.tu=q; //矩阵Q的非零元个数 
		return 0;
	 } 
  	}
  	
  	
  	/*输出函数*/
  	void ShowSMatrix(TSMatrix M)
  	{
  		int i,j,k=1;//非零元的计数器k 
		  Triple *p=M.date+1;// 创建一个指向M第一个元素的指针 
		  for(i=1;i<M.mu;i++)
		  	for(j=1;j<M.nu;j++)//循环 
			  {
			  	if(k<M.tu&&p->i==i&&p->j==j)//如果p指向的非零元为当前循环所在处理的非零元 
			  		{
			  			printf("%5d",(p++)->e);//输出 
			  			k++;//计数器+1 
					  }
					  else 
					  printf("%5d",0);//p指向的元素不是当前循环在处理的元素,输出0 
					  printf("\n");
			   } 
  		
	  }
  	
  	int main()
	  {
	  	
	  	TSMatrix A,B,C;
		  printf("创建A矩阵\n");
		  CreatSMatrix(A);
		  printf("创建B矩阵\n");
		  CreatSMatrix(B);
		  AddSMatrix(A,B,C);
		  ShowSMatrix(C);
		  return 0;
		   
	   } 



有不对的地方还请大家指教

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值