}
}
}
else
(*Q).rpos[row]=0;
else
(*Q).rpos[row]=0;
第 12 页 共26页
第五章 程序编码
源程序代码:
#include
#define MAXSIZE 100 //非零元个数的最大值 #define MAXROW 100 typedef struct triple {
int i,j; //行下标,列下标 int e; //非零元素值 }triple;
typedef struct RLSMatrix {
triple data[MAXSIZE + 1]; //非零元三元组表
int rpos[MAXROW + 1]; //各行第一个非零元的位置表 int mu,nu,tu,num; //矩阵行数、列数和非零元个数
}RLSMatrix;
Greatesmatrix(RLSMatrix &M) //创建稀疏矩阵 {
int e,i,m,n;
M.data[0].i=0; //为以下比较顺序做准备
printf(\请输入矩阵的行数,列数,和非零元素的个数:\ scanf(\ for(i=1;i<=M.tu;i++)
{
printf(\请按行序输入第%d个非零元素所在的行(1~%d),列(1~%d),元素值:\
scanf(\ if(m<1||m>M.mu||n<1||n>M.nu)
{printf(\行或列超出范围\
第 13 页 共26页
M.data[i].i=m; M.data[i].j=n; M.data[i].e=e; }
void TransposeSMatrix(RLSMatrix M,RLSMatrix &T) {//采用三元组表存储表示,求稀疏矩阵M的转置矩阵T
int q,p;
T.mu=M.nu; T.nu=M.mu; T.tu=M.tu; if(T.tu) { } return ;
q=1;
for(int col=1;col<=M.nu;++col)
for(p=1;p<=M.tu;++p)
if(M.data[p].j==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; ++q;
} return OK;
}//TransposeRLSMatrix
void HeRLSMatrix(RLSMatrix *M,RLSMatrix *N,RLSMatrix *Q) {//矩阵求和函数
int row;
if((*M).mu!=(*N).mu||(*M).nu!=(*N).nu)
{printf(\不满足矩阵相加的条件!\
int k=1; triple *p,*q;
//设置两个指针,分别指向M,N的第一个非零元位置,移动指针进行比较,得出相
加后的新矩阵非零元
p=&(*M).data[1]; q=&(*N).data[1];
第 14 页 共26页
while(p<(*M).data+(*M).tu+1&&q<(*N).data+(*N).tu+1)
if((*p).i<=(*q).i)
if((*p).i<(*q).i){
(*Q).data[k].i=(*p).i; (*Q).data[k].j=(*p).j; (*Q).data[k].e=(*p).e; k++;p++; }
else
if((*p).j<=(*q).j) if((*p).j<(*q).j){
(*Q).data[k].i=(*p).i; (*Q).data[k].j=(*p).j; (*Q).data[k].e=(*p).e; k++;p++; }
else
{
(*Q).data[k].i=(*p).i; (*Q).data[k].j=(*p).j; (*Q).data[k].e=(*p).e+(*q).e; k++;p++;q++; }
else {
(*Q).data[k].i=(*q).i; (*Q).data[k].j=(*q).j; (*Q).data[k].e=(*q).e; k++;q++; }
else
{
(*Q).data[k].i=(*q).i; (*Q).data[k].j=(*q).j; (*Q).data[k].e=(*q).e;
第 15 页 共26页
k++;q++; }
if(p<=(*M).data+(*M).tu) while(p<=(*M).data+(*M).tu){
(*Q).data[k].i=(*p).i; (*Q).data[k].j=(*p).j; (*Q).data[k].e=(*p).e; k++;p++; }
if(q<=(*N).data+(*N).tu) while(q<=(*N).data+(*N).tu){
(*Q).mu=(*M).mu;(*Q).nu=(*M).nu;(*Q).tu=k-1;
(*Q).data[k].i=(*q).i; (*Q).data[k].j=(*q).j; (*Q).data[k].e=(*q).e; k++;q++; }
//计算各行第一个非零元素在存储数组中的位置 //若该行无非零元,则rpos[]值为零
for(row=1;row<=(*Q).mu;row++){
if(cpot[row]<=(*Q).tu)
if((*Q).data[cpot[row]].i==row){ for(k=1;k<=(*Q).tu;k++)
++num[(*Q).data[k].i];
int num[MAXROW + 1];int cpot[MAXROW + 1]; num[(*Q).mu+1],row,cpot[(*Q).mu+1]; cpot[1]=1;
for(k=1;k<=(*Q).mu;k++)
num[k]=0;
for(row=2;row<=(*Q).mu;row++)
cpot[row]=cpot[row-1]+num[row-1];
第 16 页 共26页