稀疏矩阵的转置,求和,乘积的C/C++实现。

来源:互联网 发布:access2000数据库修复 编辑:程序博客网 时间:2024/06/04 00:57

第二次大作业,作为自己第一次完整打下来的代码,虽然出现了很多bug,但是都一一找出来的,写得不好,但是我会继续努力的,传上blog,mark一下。

#include <iostream>#include <cstdio>using namespace std;typedef struct Node{int i, j, v;Node *right, *down;}Node;typedef struct Crosslist{int s;Node **rHead, **cHead;}Crosslist;int Tran (Crosslist &N){int k, flag = 0;Node *R;for (k=0; k<N.s; k++){for (R=N.cHead[k]; R!=NULL; R=R->down){if (flag == 0){printf ("%d %d %d", R->j, R->i, R->v);}elseprintf ("\n%d %d %d", R->j, R->i, R->v);flag = 1;}}return 0;}int Add (Crosslist &N){int k, flag;Node *R, *S;for (k=0; k<N.s; k++){R = N.rHead[k];S = N.cHead[k];flag = 1;while (flag == 1){if (R!=NULL && S!=NULL){if (R->j == S->i){if(R->v+S->v != 0)printf ("\n%d %d %d", S->j, S->i, (R->v+S->v));R = R->right;S = S->down;}else if (R->j < S->i){printf ("\n%d %d %d", R->i, R->j, R->v);R = R->right;}else if (R->j > S->i){printf ("\n%d %d %d", S->j,S->i, S->v);S = S->down;}}else if (R!=NULL && S==NULL){while (R!=NULL){printf ("\n%d %d %d", R->i, R->j, R->v);R = R->right;}}else if (R==NULL && S!=NULL){while (S!=NULL){printf ("\n%d %d %d", S->j, S->i, S->v);S = S->down;}}else if (R==NULL && S==NULL){flag = 0;}}}return 0;}int Muti (Crosslist &N){int k, t, flag, sum = 0;Node *R, *S;for (k=0; k<N.s; k++){for (t=0; t<N.s; t++){R = N.rHead[k];S = N.rHead[t];flag = 1;while (flag == 1){if (R!=NULL && S!=NULL){if (R->j == S->j){sum += R->v*S->v;R = R->right;S = S->right;}else if (R->j < S->j){R = R->right;}else if (R->j > S->j){S = S->right;}}else{flag = 0;}}while (sum != 0){printf("\n%d %d %d",k,t,sum);sum = 0;}}}return 0;}int main (){int m = 0, n = 0, l = 0, t, flag = 0;Node *P, *Q;Crosslist M;scanf ("%d%d%d",&m, &n, &l);if (m<=0 || n<=0 || l<=0 || m!=n || l>m*n)return 0;M.s = m;M.rHead = new Node *[m];M.cHead = new Node *[n];for(t=0; t<m; t++){M.rHead[t] = NULL;M.cHead[t] = NULL;}for (t=0; t<l; t++){P = new Node;scanf ("%d%d%d",&P->i, &P->j, &P->v);if (P->i>=0 && P->i<m && P->j>=0 && P->j<n && P->v>=-10 && P->v<=10 && P->v!=0){flag = 1;if (M.rHead[P->i]==NULL || P->j<M.rHead[P->i]->j){P->right = M.rHead[P->i];M.rHead[P->i] = P;}else{for (Q=M.rHead[P->i]; Q->right && P->j>Q->right->j; Q=Q->right);P->right = Q->right;Q->right = P;}if (M.cHead[P->j]==NULL || P->i<M.cHead[P->j]->i){P->down = M.cHead[P->j];M.cHead[P->j] = P;}else{for (Q=M.cHead[P->j]; Q->down && P->i>Q->down->i; Q=Q->down);P->down = Q->down;Q->down = P;}}}if (flag == 0)return 0;Tran (M);Add (M);Muti (M);return 0;}