注意:
程序:加法、乘法不调用。
#include
#include //稀疏矩阵的三元组顺序表存储表示
#define MAX_SIZE 12500 //假设非零元个数的最大值为12500
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct{
int i,j; //该零元的行下标和列下标
ElemType e; //非零元素值
}Triple;//三元组结构
typedef struct{
Triple data[MAX_SIZE+1]; //非零元三元组表,data[0]未用
int mu,nu,tu; //矩阵的行数、列数和非零元个数
}TSMatrix;
//函数声明
Status CreateTSMatrix(TSMatrix &M);
void DestroyTSMatrix(TSMatrix &M);
void PrintTSMatrix(TSMatrix M);
void PrintTSMatrix1(TSMatrix M);
void CopyTSMatrix(TSMatrix M,TSMatrix &T);
int comp(int c1,int c2);
Status AddTSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q);
Status SubtTSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q);
Status MultTSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q);
Status TransposeTSMatrix(TSMatrix M, TSMatrix &T);
//主函数
void main()
{
TSMatrix A,B,C; printf("创建矩阵A:\n"); CreateTSMatrix(A); PrintTSMatrix(A); printf("由矩阵A复制矩阵B:\n"); CopyTSMatrix(A,B); PrintTSMatrix1(B); DestroyTSMatrix(B); printf("销毁矩阵B后:\n"); PrintTSMatrix1(B); printf("重新创建矩阵B:(与矩阵A的行、列数相同,行、列分别为%d,%d)\n",A.mu,A.nu);
//
//
} CreateTSMatrix(B); PrintTSMatrix1(B); AddTSMatrix(A,B,C); printf("矩阵C1(A+B):\n"); PrintTSMatrix1(C); SubtTSMatrix(A,B,C); printf("矩阵C2(A-B):\n"); PrintTSMatrix1(C); TransposeTSMatrix(A,C); printf("矩阵C3(A的转置):\n"); PrintTSMatrix1(C); printf("创建矩阵A2:"); CreateTSMatrix(A); PrintTSMatrix1(A); printf("创建矩阵B2:(行数应与矩阵A的列数相同=%d)\n",A.nu); CreateTSMatrix(B); PrintTSMatrix1(B); MultTSMatrix(A,B,C); printf("矩阵C5(A*B):\n"); PrintTSMatrix1(C);
//1.创建稀疏矩阵M
Status CreateTSMatrix(TSMatrix &M)
{
int i,m,n; ElemType e; Status k; printf("请输入矩阵的行数,列数,非零元素数:"); scanf("%d%d%d",&M.mu,&M.nu,&M.tu); if(M.tu>MAX_SIZE) return ERROR; M.data[0].i=0;//为以下比较顺序做准备 for(i=1;i
{
printf("请按行序顺序输入第%d个非零元素所在的行(1~%d)、列(1~%d)、元素值",i,M.mu,M.nu);
scanf("%d%d%d",&m,&n,&e); k=0; if(mM.mu||nM.nu)//行或列超出范围 k=1; if((m
或列的顺序有错
}
//2.销毁稀疏矩阵M
void DestroyTSMatrix(TSMatrix &M) //&一定要有
{
} M.mu=M.nu=M.tu=0; } return OK; k=1; }while(k); //当k为0时,跳出while循环 M.data[i].i=m; M.data[i].j=n; M.data[i].e=e;
//3.输出稀疏矩阵M
void PrintTSMatrix(TSMatrix M)
{
int i; printf("%d行%d列%d个非零元素\n",M.mu,M.nu,M.tu); printf("行 列 元素值\n"); for(i=1;i
}
//按矩阵形式输出M
void PrintTSMatrix1(TSMatrix M)
{
int i,j,k=1;
Triple *p=M.data; p++; //p指向第一个非零元素 for(i=1;ii==i&&p->j==j) //p指向非零元,且p所指元素为当前处理 { 元素 printf("%3d",p->e);//输出p所指元素的值 p++;//p指向下一个元素 k++;//计数器+1 } else //p所指元素不是当前处理元素 printf("%3d",0);//输出0
printf("\n");
}
}
//4.由稀疏矩阵M复制得到T
void CopyTSMatrix(TSMatrix M,TSMatrix &T)
{
} T=M;
//5.求稀疏矩阵的和Q=M+N,M和N的行数和列数相等
//AddTSMatrix()中要用到
int comp(int c1,int c2)
{
}
Status AddTSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q)
{
int m=1,n=1,q=0; if(M.mu!=N.mu||M.nu!=N.nu) //M、N两稀疏矩阵行或列数不同 return ERROR; Q.mu=M.mu; Q.nu=M.nu; while(m
if(Q.data[q].e==0) //元素值为0,不存入压缩矩阵 q--; break; case 1: Q.data[++q]=N.data[n++]; } break; case 1: Q.data[++q]=N.data[n++];//将矩阵N的当前元素值赋给矩阵Q } } while(mMAX_SIZE)//非零元素个数太多 return ERROR;
return OK;
}
//6.求稀疏矩阵的差Q=M-N,M和N的行数和列数相等
Status SubtTSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q)
{
} int i; if(M.mu!=N.mu||M.nu!=N.nu) return ERROR; for(i=1;i
//7.求稀疏矩阵的乘积Q=M*N,M的列数和N的行数相等
Status MultTSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q)
{
int i,j; ElemType *Nc,*Tc; TSMatrix T; //临时矩阵 if(M.nu!=N.mu) return ERROR; T.nu=M.mu; //临时矩阵T是Q的转置矩阵 T.mu=N.nu;
T.tu=0;
Nc=(ElemType*)malloc((N.mu+1)*sizeof(ElemType));//Nc为矩阵N一列的临时数组(非压缩,【0】不用)
Tc=(ElemType*)malloc((M.nu+1)*sizeof(ElemType));//Tc为矩阵T一行的临时数组(非压缩,【0】不用)
if(!Nc||!Tc) //创建临时数组不成功
exit(ERROR);
for(i=1;i
{
for(j=1;j
Nc[j]=0; //矩阵Nc的初值为0
for(j=1;j
Tc[j]=0; //临时数组Tc的初值为0,【0】不用
for(j=1;j
Tc[M.data[j].i]+=M.data[j].e*Nc[M.data[j].j];//Tc中存N的第i列与M相乘
的结果
for(j=1;jMAX_SIZE) //非零元素个数太多 return ERROR; TransposeTSMatrix(T,Q); //将T的装置赋给Q DestroyTSMatrix(T); //销毁临时矩阵T free(Tc); //释放动态数组Tc和Nc free(Nc); return OK;
}
//8.求稀疏矩阵M的转置矩阵T TransposeTSMatrix(TSMatrix M,TSMatrix &T)
Status TransposeTSMatrix(TSMatrix M, TSMatrix &T)
{ // 算法5.1
// 采用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵T int p, q, col; T.mu = M.nu; T.nu = M.mu; T.tu = M.tu; if (T.tu) { q = 1; for (col=1; col
for (p=1; p
运行结果:
注意:
程序:加法、乘法不调用。
#include
#include //稀疏矩阵的三元组顺序表存储表示
#define MAX_SIZE 12500 //假设非零元个数的最大值为12500
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct{
int i,j; //该零元的行下标和列下标
ElemType e; //非零元素值
}Triple;//三元组结构
typedef struct{
Triple data[MAX_SIZE+1]; //非零元三元组表,data[0]未用
int mu,nu,tu; //矩阵的行数、列数和非零元个数
}TSMatrix;
//函数声明
Status CreateTSMatrix(TSMatrix &M);
void DestroyTSMatrix(TSMatrix &M);
void PrintTSMatrix(TSMatrix M);
void PrintTSMatrix1(TSMatrix M);
void CopyTSMatrix(TSMatrix M,TSMatrix &T);
int comp(int c1,int c2);
Status AddTSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q);
Status SubtTSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q);
Status MultTSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q);
Status TransposeTSMatrix(TSMatrix M, TSMatrix &T);
//主函数
void main()
{
TSMatrix A,B,C; printf("创建矩阵A:\n"); CreateTSMatrix(A); PrintTSMatrix(A); printf("由矩阵A复制矩阵B:\n"); CopyTSMatrix(A,B); PrintTSMatrix1(B); DestroyTSMatrix(B); printf("销毁矩阵B后:\n"); PrintTSMatrix1(B); printf("重新创建矩阵B:(与矩阵A的行、列数相同,行、列分别为%d,%d)\n",A.mu,A.nu);
//
//
} CreateTSMatrix(B); PrintTSMatrix1(B); AddTSMatrix(A,B,C); printf("矩阵C1(A+B):\n"); PrintTSMatrix1(C); SubtTSMatrix(A,B,C); printf("矩阵C2(A-B):\n"); PrintTSMatrix1(C); TransposeTSMatrix(A,C); printf("矩阵C3(A的转置):\n"); PrintTSMatrix1(C); printf("创建矩阵A2:"); CreateTSMatrix(A); PrintTSMatrix1(A); printf("创建矩阵B2:(行数应与矩阵A的列数相同=%d)\n",A.nu); CreateTSMatrix(B); PrintTSMatrix1(B); MultTSMatrix(A,B,C); printf("矩阵C5(A*B):\n"); PrintTSMatrix1(C);
//1.创建稀疏矩阵M
Status CreateTSMatrix(TSMatrix &M)
{
int i,m,n; ElemType e; Status k; printf("请输入矩阵的行数,列数,非零元素数:"); scanf("%d%d%d",&M.mu,&M.nu,&M.tu); if(M.tu>MAX_SIZE) return ERROR; M.data[0].i=0;//为以下比较顺序做准备 for(i=1;i
{
printf("请按行序顺序输入第%d个非零元素所在的行(1~%d)、列(1~%d)、元素值",i,M.mu,M.nu);
scanf("%d%d%d",&m,&n,&e); k=0; if(mM.mu||nM.nu)//行或列超出范围 k=1; if((m
或列的顺序有错
}
//2.销毁稀疏矩阵M
void DestroyTSMatrix(TSMatrix &M) //&一定要有
{
} M.mu=M.nu=M.tu=0; } return OK; k=1; }while(k); //当k为0时,跳出while循环 M.data[i].i=m; M.data[i].j=n; M.data[i].e=e;
//3.输出稀疏矩阵M
void PrintTSMatrix(TSMatrix M)
{
int i; printf("%d行%d列%d个非零元素\n",M.mu,M.nu,M.tu); printf("行 列 元素值\n"); for(i=1;i
}
//按矩阵形式输出M
void PrintTSMatrix1(TSMatrix M)
{
int i,j,k=1;
Triple *p=M.data; p++; //p指向第一个非零元素 for(i=1;ii==i&&p->j==j) //p指向非零元,且p所指元素为当前处理 { 元素 printf("%3d",p->e);//输出p所指元素的值 p++;//p指向下一个元素 k++;//计数器+1 } else //p所指元素不是当前处理元素 printf("%3d",0);//输出0
printf("\n");
}
}
//4.由稀疏矩阵M复制得到T
void CopyTSMatrix(TSMatrix M,TSMatrix &T)
{
} T=M;
//5.求稀疏矩阵的和Q=M+N,M和N的行数和列数相等
//AddTSMatrix()中要用到
int comp(int c1,int c2)
{
}
Status AddTSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q)
{
int m=1,n=1,q=0; if(M.mu!=N.mu||M.nu!=N.nu) //M、N两稀疏矩阵行或列数不同 return ERROR; Q.mu=M.mu; Q.nu=M.nu; while(m
if(Q.data[q].e==0) //元素值为0,不存入压缩矩阵 q--; break; case 1: Q.data[++q]=N.data[n++]; } break; case 1: Q.data[++q]=N.data[n++];//将矩阵N的当前元素值赋给矩阵Q } } while(mMAX_SIZE)//非零元素个数太多 return ERROR;
return OK;
}
//6.求稀疏矩阵的差Q=M-N,M和N的行数和列数相等
Status SubtTSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q)
{
} int i; if(M.mu!=N.mu||M.nu!=N.nu) return ERROR; for(i=1;i
//7.求稀疏矩阵的乘积Q=M*N,M的列数和N的行数相等
Status MultTSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q)
{
int i,j; ElemType *Nc,*Tc; TSMatrix T; //临时矩阵 if(M.nu!=N.mu) return ERROR; T.nu=M.mu; //临时矩阵T是Q的转置矩阵 T.mu=N.nu;
T.tu=0;
Nc=(ElemType*)malloc((N.mu+1)*sizeof(ElemType));//Nc为矩阵N一列的临时数组(非压缩,【0】不用)
Tc=(ElemType*)malloc((M.nu+1)*sizeof(ElemType));//Tc为矩阵T一行的临时数组(非压缩,【0】不用)
if(!Nc||!Tc) //创建临时数组不成功
exit(ERROR);
for(i=1;i
{
for(j=1;j
Nc[j]=0; //矩阵Nc的初值为0
for(j=1;j
Tc[j]=0; //临时数组Tc的初值为0,【0】不用
for(j=1;j
Tc[M.data[j].i]+=M.data[j].e*Nc[M.data[j].j];//Tc中存N的第i列与M相乘
的结果
for(j=1;jMAX_SIZE) //非零元素个数太多 return ERROR; TransposeTSMatrix(T,Q); //将T的装置赋给Q DestroyTSMatrix(T); //销毁临时矩阵T free(Tc); //释放动态数组Tc和Nc free(Nc); return OK;
}
//8.求稀疏矩阵M的转置矩阵T TransposeTSMatrix(TSMatrix M,TSMatrix &T)
Status TransposeTSMatrix(TSMatrix M, TSMatrix &T)
{ // 算法5.1
// 采用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵T int p, q, col; T.mu = M.nu; T.nu = M.mu; T.tu = M.tu; if (T.tu) { q = 1; for (col=1; col
for (p=1; p
运行结果: