#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<malloc.h>
#define ERROR   
-1
#define
OK    
1
#define
MAXSIZE   
100
#define MAXRC   
100
typedef int ElemType;
typedef struct {
 int i, j;
 ElemType e;
}Triple;
typedef struct {
 Triple data[MAXSIZE+1];
 int
rpos[MAXRC+1];   //各行第一个非零元的位置表
 int mu, nu, tu;
}TSMatrix;
//初始化稀疏矩阵M
int InitSMatrix(TSMatrix &M) {
 TSMatrix *p;
 p=(TSMatrix *)malloc(sizeof(TSMatrix));
 if(!p)
  return ERROR;
 M=*p;
 M.mu=0; M.nu=0; M.tu=0;
 for(int l=0; l<=MAXRC+1;
l++)
  M.rpos[l]=0;
 return OK;
}
//创建稀疏矩阵M
int CreateSMatrix(TSMatrix &M) {
 InitSMatrix(M);
 printf("Please input the TSMatrix's mu, nu,
tu:\n");
 scanf("%d %d
%d",&M.mu,&M.nu,&M.tu);
 printf("\nInput %d elements:\n",M.tu);
 for(int i=1; i<=M.tu; i++)
  scanf("%d %d
%d",&M.data[i].i,&M.data[i].j,&M.data[i].e);
 return OK;
}
//销毁稀疏矩阵M
void DestroySMatrix(TSMatrix &M) {
 M.nu=0; M.mu=0; M.tu=0;
}
//输出稀疏矩阵M
int PrintSMatrix(TSMatrix M) {
 if(M.tu<=0) return ERROR;
 int p=1;
 for(int a=1; a<=M.mu; a++) {
  for(int b=1;
b<=M.nu; b++) {
   if(p<=M.tu
&& M.data[p].i==a
&& M.data[p].j==b) {
    printf("%d
",M.data[p].e);
    p++;
   }
   else
    printf("0
");
  }
  printf("\n");   
//输出每一行数组后换行
 }
 //printf("Input any key to the menu.\n");
 getch();
 return OK;
}
 
//求稀疏矩阵的转置
int FastTransposeSMatrix(TSMatrix M,TSMatrix &T)
{
 int col, t, p, q;
 int num[100], cpot[100];
 if(M.tu<=0 ||
M.mu<=0 || M.nu<=0)
  return ERROR;
 //T=(TSMatrix *)malloc(sizeof(TSMatrix));
 T.mu=M.nu;
 T.nu=M.mu;
 T.tu=M.tu;
 if(T.tu) {
  for(col=1;
col<=M.nu; ++col) num[col]=0;
  for(t=1;
t<=M.tu; ++t)
++num[M.data[t].j]; //求M中每一列含非零元个数
  cpot[1]=1;
  //求第col列中第一个非零元在b.data中的序号
  for(col=2;
col<=M.nu; ++col)
cpot[col]=cpot[col-1]+num[col-1];
  for(p=1;
p<=M.nu; ++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].e=M.data[p].e; ++cpot[col];
  }
 }
 printf("FastTransposeSMatrix success!\nThe
FastTransposeSMatrix is:\n");
 PrintSMatrix(T);
 return OK;
}
void GetRpos(TSMatrix &M) {
  int row,t,num[MAXSIZE];
  for (row=1;row<=MAXSIZE;++row)
num[row]=0; 
  for (t=1;t<=M.tu;++t)
++num[M.data[t].i];
  M.rpos[1]=1;
  for (row=2;row<=M.mu;++row)
M.rpos[row]=M.rpos[row-1]+num[row-1];
}
//求稀疏矩阵的乘积
int MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix
&Q) {
 //求矩阵乘积Q=M X N,采用行逻辑链接存储表示
 if(M.nu!=N.mu)
  return ERROR;
 Q.mu=M.mu; Q.nu=N.nu; Q.tu=0;
 int arow, brow, tp, p, q, t, ccol, k=1;
 GetRpos(M); GetRpos(N);
 if(M.tu*N.tu!=0)
{     //Q是非零矩阵
  for(arow=1;
arow<=M.mu; ++arow)
{ //处理M的每一行
   int
ctemp[50]={0};    //当前行各元素累加器清零
   Q.rpos[arow]=Q.tu+1;
   if(arow<M.mu)
    tp=M.rpos[arow+1];
   else {
tp=M.tu+1; }
   for(p=M.rpos[arow];
p<tp; ++p)
{  //对当前行中每一个非零元
    brow=M.data[p].j;     //找到对应元在N中的行号
    if(brow<N.mu)
t=N.rpos[brow+1];
    else
{ t=N.tu+1; }
    for(q=N.rpos[brow];
q<t; ++q) {
     ccol=N.data[q].j;    //乘积元素在Q中列号
     ctemp[ccol]
+= M.data[p].e * N.data[q].e;
    }
   } //求得Q中第crow(=arow)行的非零元
   for(ccol=1;
ccol<=Q.nu;
++ccol)   //压缩存储该行非零元
    if(ctemp[ccol])
{
     if(++Q.tu>MAXSIZE)
return ERROR;
     //Q.data[Q.tu]=(arow,ccol,ctemp[ccol]);
     Q.data[Q.tu].i=arow;
     Q.data[Q.tu].j=ccol;
     Q.data[Q.tu].e=ctemp[ccol];
    }
  }
 }
 PrintSMatrix(Q);
 getch();
 return OK;
}
int AddSMatrix(TSMatrix M, TSMatrix N, TSMatrix
&Q) {
 if(M.mu!=N.mu||M.nu!=N.nu)
       
return ERROR;
   
Q.mu=M.mu;
   
Q.nu=M.nu;
   
Q.tu=0;
    int
x=0,y=0;
    for(int
i=1;i<=Q.mu;i++){
    
for(int j=1;j<=Q.nu;j++){
     
for(int p=1;p<=M.tu;p++){
      
if((i==M.data[p].i)&&(j==M.data[p].j)){
             
x=M.data[p].e;
             
break;
               
}
    
else x=0; 
        
}//for p
        
for(int q=1;q<=N.tu;q++){
      
if((i==N.data[q].i)&&(j==N.data[q].j)){
             
y=N.data[q].e;
             
break;
               
}
    
else
y=0;   
        
}//for q
        
if((x+y)!=0){
            
Q.data[Q.tu+1].i=i;
            
Q.data[Q.tu+1].j=j;
            
Q.data[Q.tu+1].e=x+y;
            
Q.tu++;
      
}//if
    
}//for j
    }//for
i 
 PrintSMatrix(Q);
return OK;
}
 
void menu() {
 printf("\t************************************************************\n");
 printf("\t  
   
  菜单选项\n");
 printf("\t************************************************************\n\n\n\n");
 printf("\t\t\t1. CreateSMatrix.\n");
 printf("\t\t\t2. DestroySMatrix.\n");
 printf("\t\t\t3. PrintSMatrix.\n");
 printf("\t\t\t4. AddSMatrix.\n");
 printf("\t\t\t5. MultSMatrix.\n");
 printf("\t\t\t6. FastTransposeSMatrix.\n");
 printf("\t\t\t0. exit.\n\n");
 printf("\t\t\tInput your choose:\n\t\t\t");
}
void main(){
 int swh;
 TSMatrix M, N, Q, T;
 do {
  menu();
  scanf("%d",
&swh);
  switch(swh) {
  case(1):
   InitSMatrix(M);
   CreateSMatrix(M);
   break;
  case(2):
   DestroySMatrix(M);
   break;
  case(3):
   PrintSMatrix(M);
   break;
  case(4):
   InitSMatrix(Q);
   printf("Input
M:\n");
   CreateSMatrix(M);
   printf("Input
N:\n");
       
 CreateSMatrix(N);
   AddSMatrix(M,N,Q);
   break;
  case(5):
   InitSMatrix(Q);
   printf("Input
M:\n");
   CreateSMatrix(M);
   printf("Input
N:\n");
       
 CreateSMatrix(N);
   MultSMatrix(M,N,Q);
   break;
  case(6):
   InitSMatrix(T);
   FastTransposeSMatrix(M,T);
   break;
  case(0):
   exit(0);
  default:
   menu();
  }
  
 }while(1);
}
							
		 
						
		加载中,请稍候......