//求矩阵的转置矩阵 status transposeSMatrix(crossList *M,crossList *T){ int u,i; oLink *head,p,q,r; if((T->rhead)) destroySMatrix(T); copySMatrix(M,T);//T=M u = T->mu;//交换T->mu和T->nu T->mu = T->nu; T->nu = u;//u为临时变量 //交换rhead与chead head = T->rhead; T->rhead = T->chead; T->chead = head; //对T的每一行,注意行列值已经交换了 for(u=1;u<=T->mu;u++){ p = T->rhead[u];//p为行表头 while(p){//没到表尾,对T的每一结点 q = p->down;//q指向下一结点 //交换i和j i = p->i; p->i = p->j; p->j = i; //交换down和right r = p->down; p->down = p->right; p->right = r; p = q;//p指向下一个新行的结点 } } return true; }
//Ï¡Êè¾ØÕó²âÊÔ void testRLSMatrix() { RLSMatrix<int> A,B,C,D,E,F; createSMatrix(A); printSMatrix1(A); createSMatrix(B,2); printSMatrix1(B); addSMatrix(A,B,C); printSMatrix1(C); destroySMatrix(C); multSMatrix(A,B,C); printSMatrix1(C); transposeSMatrix(C,D); printSMatrix1(D); createSMatrix(E,3); printSMatrix1(E); }
//稀疏矩阵M复制得到T status copySMatrix(crossList *M,crossList *T){ int i; oLink p,q,q1,q2; if(T->rhead) destroySMatrix(T); T->mu = M->mu;T->nu = M->nu;T->tu = M->tu; //指针数组 T->rhead = (oLink*)malloc((M->mu+1)*sizeof(oLink)); if(!(T->rhead)) exit(0); T->chead = (oLink*)malloc((M->nu+1)*sizeof(oLink)); if(!(T->chead)) exit(0); //初始化矩阵T的行头指针向量;各行链表为空链表 for(i=1;i<=M->mu;i++) T->rhead[i] = NULL; //初始化矩阵T的列头指针向量;各列链表为空链表 for(i=1;i<=M->nu;i++) T->chead[i] = NULL; //按行复制 for(i=1;i<=M->mu;i++){ p = M->rhead[i]; //没到行尾 while(p){ if(!(q = (oLink)malloc(sizeof(oNode)))) exit(0);//存放新插入的结点 q->i = p->i; q->j = p->j; q->e = p->e; //插到行表头 if(!T->rhead[i]) T->rhead[i]=q1=q;//赋值运算符是自右向左的结合顺序 else q1=q1->right=q;//q1始终指向行尾元素 //插到列表头 if(!T->chead[q->j]){ T->chead[q->j] = q; q->down = NULL; }else{//插到列表尾 q2 = T->chead[q->j]; while(q2->down) q2 = q2->down;//寻找列表尾 q2->down = q; q->down = NULL; } p = p->right; } q->right = NULL;//第一行的值复制完了后需要 } return true; }