数组(稀疏矩阵)

typedef struct
{
	int i,j;
	int value;
}Triple;
typedef struct
{
	Triple data[MAXSIZE];
	int rpos[MAXRC]; 
	int row,col,num;
}XiShuArray;
int triarray(XiShuArray  &M)
//     创建一个稀疏矩阵;  
//     输入行数、列数,支持乱序输入三元组,并计数;  
{  
       int num=0,p,q,min,temp;  //     中间变量;  
       int row;  
       printf("请输入稀疏矩阵的总行数和总列数(空格隔开):\n");  
       scanf("%d%d",&M.row,&M.col); //     输入行数、列数;  
       if(M.row>MAXRC)
              return ERROR;
	   printf("请输入三元组顺序表的内容:\n");
       printf("i j value\n");
       scanf("%d%d%d",&M.data[num+1].i,&M.data[num+1].j,&M.data[num+1].value);  
       while(M.data[num+1].i) //     乱序输入三元组;  
       {
              if(++num>MAXSIZE)  
                     return ERROR;  
              scanf("%d%d%d",&M.data[num+1].i,&M.data[num+1].j,&M.data[num+1].value);  
       }  
       M.num=num; //     num的值即为此矩阵的非零元个数;  
       
	   for(p=1;p<=M.num-1;++p)   // 按行为主序依次重新排列非零元  
       {  
              min=p;           //     使较小的行数、列数的元的序号min为当前值p;  
              for(q=p+1;q<=M.num;++q)           //     开始依次比较;  
              {  
                     if(M.data[min].i>M.data[q].i||(M.data[min].i==M.data[q].i&&M.data[min].j>M.data[q].j))  
                            min=q;           //     在乱序的三元表中,始终保证min是较小的行列数的序号;  
              }  
              temp=M.data[min].i;                         //     交换行值;            
               M.data[min].i=M.data[p].i;  
              M.data[p].i=temp;  
              temp=M.data[min].j;                         //     交换列值;  
              M.data[min].j=M.data[p].j;  
              M.data[p].j=temp;  
              temp=M.data[min].value;                        //     交换元素值;  
              M.data[min].value=M.data[p].value;  
              M.data[p].value=temp;  
       }  
       for(row=1,num=0;row<=M.row;++row)            // 记录M.rpos[row];  
       {  
              M.rpos[row]=num+1;  
              while(M.data[num+1].i==row)  
                     ++num;    
       }  
       return OK;  
} 
void printtriarray(XiShuArray &M)
{
	printf("    i    j    k\n");
	for(int k=1;k<=M.num;k++)
	{
		printf("%5d",M.data[k].i);
		printf("%5d",M.data[k].j);
		printf("%5d",M.data[k].value);
		printf("\n");
	}
}
void printxishuarray(XiShuArray &M)
{
	int i,j,t=1,e=0;
	for(i=1;i<=M.row;i++)
	{
		for(j=1;j<=M.col;j++)
		{
			if(M.data[t].i==i&&M.data[t].j==j)
			{
				printf("%3d",M.data[t].value);
				t++;
			}
			else
				printf("%3d",e);
		}
		printf("\n");
	}
}
//实现矩阵的转置;
int zhuanzhi(XiShuArray M,XiShuArray &T)
{
	int col,p,q,t;
	int num[MAXSIZE],cpot[MAXSIZE];
	T.row=M.col;
	T.col=M.row;
	T.num=M.num;
	if(T.num)
	{
		//计算num[col]的值
		for(col=1;col<=M.col;++col)
			num[col]=0;
		for(t=1;t<=M.num;++t)
		++num[M.data[t].j];
		//计算cpot[col]的值
		cpot[1]=1;
		for(col=2;col<=M.col;++col)
			cpot[col]=cpot[col-1]+num[col-1];
		//扫描三元组顺序表M,生成三元组顺序表T
		for(p=1;p<=M.num;++p)
		{
			col=M.data[p].j;
			q=cpot[col];
			T.data[q].i=M.data[p].j;
			T.data[q].j=M.data[p].i;
			T.data[q].value=M.data[p].value;
			++cpot[col];
		}
	}
	return OK;
}


int MulTriple(XiShuArray M,XiShuArray N,XiShuArray & Q)
//输入两个稀疏矩阵M和N,并初始化Q,然后计算M*N的值赋给Q   
{  
       int arow,brow,ccol;  
       int ctemp[MAXSIZE+1]; //以N的列值为序号的临时数组 
       int tp,p,tq,q;  //中间变量   
       if(M.col!=N.row)
	   {
		   printf("您输入的矩阵不能相乘!\n");
              return ERROR; 
	   }
       Q.row=M.row;   //初始化Q  
       Q.col=N.col;
       Q.num=0;
       if(M.num*N.num!=0)  //Q是非零矩阵 
       {  
              for(arow=1;arow<=M.row;++arow) //逐行扫描
              {
                     for(ccol=1;ccol<=N.col;ccol++)
                            ctemp[ccol]=0;  // 初始化累加器 
                     Q.rpos[arow]=Q.num+1;  //????????????????????
                     if(arow<M.row)
                            tp=M.rpos[arow+1];  //tp是M下一行的序号 
                     else  
                            tp=M.num+1;  //MEICUO
                     for(p=M.rpos[arow];p<tp;++p) //从M的当前行找到元素
                     {  
                            brow=M.data[p].j;  //对应元在N中的行号
                            if(brow<N.row)
                                   tq=N.rpos[brow+1];  //tq是N下一行的行号 
                            else  
                                   tq=N.num+1;//youcuo
                            for(q=N.rpos[brow];q<tq;++q)  //以M的对应元的列号为N的行号进行扫描 
                            {  
                                   ccol=N.data[q].j;//提取对应元的列号  
                                   ctemp[ccol]+=M.data[p].value*N.data[q].value;    
                                 //两个对应元的值相乘并累加到以列号为序号的累加器中
                            }  
                     } 
                     for(ccol=1;ccol<=Q.col;++ccol) // 将此行非零元压缩入Q中
                     {  
                            if(ctemp[ccol])
                            {  
                                   if(++Q.num>MAXSIZE)  
                                          return ERROR;  
                                   Q.data[Q.num].i=arow;  
                                   Q.data[Q.num].j=ccol;  
                                   Q.data[Q.num].value=ctemp[ccol];  
                            }  
                     }  
              }  
       }  
       return OK;  
}
//加法的实现
int addTriple(XiShuArray M,XiShuArray W,XiShuArray &X)
{
	int p,q,temp=1;
	int min,row,num;
	if(M.row!=W.row||M.col!=W.col)
	{
		printf("您输入的矩阵不能相加减!\n");
              return ERROR;
	}
	   //初始化X
	 X.row=M.row;  
       X.col=M.col;
       M.num=0;
	   for(p=1;p<=M.num||p<=W.num;p++)
	   {
		   for(q=1;q<=M.num||q<=W.num;p++)
		   {
		   if(M.data[p].i==W.data[q].i&&M.data[p].j==W.data[q].j)
		   {X.data[temp].value=M.data[p].value+W.data[q].value;temp++;}
		   else
			  { X.data[temp].value=M.data[p].value;temp++;
		        X.data[temp].value=W.data[q].value;temp++;
		      }
		   }
	   }




	      for(p=1;p<=X.num-1;++p)   // 按行为主序依次重新排列非零元  
       {  
              min=p;           //     使较小的行数、列数的元的序号min为当前值p;  
              for(q=p+1;q<=X.num;++q)           //     开始依次比较;  
              {  
                     if(X.data[min].i>X.data[q].i||(X.data[min].i==X.data[q].i&&X.data[min].j>X.data[q].j))  
                            min=q;           //     在乱序的三元表中,始终保证min是较小的行列数的序号;  
              }  
              temp=X.data[min].i;                         //     交换行值;            
               X.data[min].i=X.data[p].i;  
              X.data[p].i=temp;  
              temp=X.data[min].j;                         //     交换列值;  
              X.data[min].j=X.data[p].j;  
              X.data[p].j=temp;  
              temp=X.data[min].value;                        //     交换元素值;  
              X.data[min].value=X.data[p].value;  
             X.data[p].value=temp;  
       }  
       for(row=1,num=0;row<=X.row;++row)            // 记录M.rpos[row];  
       {  
              X.rpos[row]=num+1;  
              while(X.data[num+1].i==row)  
                     ++num;    
       }  



	   return OK;
}


//减法的实现
/*int redTriple(XiShuArray M,XiShuArray W,XiShuArray &Y)
{
}*/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值