稀疏矩阵运算源代码

  • j3_834201
    了解作者
  • 735.4KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-06-05 02:43
    上传日期
特别用心写的原代码,当人里面也不乏借鉴之说,不过确实学到了很多东西
稀疏矩阵运算源代码.rar
内容介绍
#include<stdlib.h> #include "stdio.h" #include<conio.h> enum Status{ OK=0, EXCEPTIONERROR, FORMATERROR, OVERFLOW }; #define ElemType int typedef struct OLNode{ int i,j; ElemType e; struct OLNode *right, *down; }OLNode; typedef struct{ OLNode **rhead; OLNode **chead; int mu, nu, tu; }CrossList; Status InsertMatrix(CrossList &M,OLNode * p) { OLNode *q; q=(OLNode *)malloc(sizeof(OLNode)); q=M.rhead[p->i]; if(!q||q->j>p->j) { p->right=M.rhead[p->j]; M.rhead[p->i]=p; } else { for(q;(q->right)&&(q->right->j<p->j);q=q->right); p->right=q->right; q->right=p; } // 完成行插入 q=M.chead[p->j]; if(!q||q->i>p->i) { p->down=M.chead[p->j]; M.chead[p->j]=p; } else { for(q;(q->down)&&(q->right->j<p->j);q=q->right); p->down=q->down; q->down=p; } // 完成列插入 return OK; } Status CreateMatrix(CrossList &M) { int n=0; int i,j,e; printf("\n please input the mu,nu,tu:\n"); //scanf("%d,%d,%d",&M.mu,&M.nu,&M.tu); scanf("%d",&M.mu); scanf("%d",&M.nu); scanf("%d",&M.tu); if (M.mu<=0||M.nu<=0||M.tu<0) // 要求矩阵一定要为有效行,列,非零值否则将认为矩阵格式错误。 { return FORMATERROR; } if(!(M.rhead=(OLNode **)malloc((M.mu+1)*sizeof(OLNode)))) { return OVERFLOW; } if(!(M.chead=(OLNode **)malloc((M.nu+1)*sizeof(OLNode)))) { return OVERFLOW; } for(n=0;n<=M.mu;n++) M.rhead[n]=NULL; for(n=0;n<=M.nu;n++) M.chead[n]=NULL; for(n=1;n<=M.tu;n++) { printf("请输入第 %d 个元素的三元组:\n",n); //scanf("%d,%d,%d",&i,&j,&e); scanf("%d",&i ); scanf("%d",&j ); scanf("%d",&e ); OLNode * p; p=(OLNode *)malloc(sizeof(OLNode)); p->i=i; p->j=j; p->e=e; InsertMatrix(M,p); } return OK; } void PrintMatrix(CrossList &M) { int i,j; OLNode * p; p=(OLNode *)malloc(sizeof(OLNode)); for(i=1;i<=M.mu;i++) { p=M.rhead[i]; for(j=1;j<=M.nu;j++) { if(!p||p->j!=j) printf(" 0"); else { printf(" %d",p->e); p=p->right; } } printf(" \r\n"); }//end for } Status AddMatrix(CrossList &M1,CrossList &M2) { CrossList T; int m,n=0; OLNode *d; OLNode *d1; OLNode *d2; //可不可以直接写成OLNode *d,d1,d2; d=(OLNode *)malloc(sizeof(OLNode)); d1=(OLNode *)malloc(sizeof(OLNode)); d2=(OLNode *)malloc(sizeof(OLNode)); if(M1.mu==M2.mu&&M1.nu==M2.nu) { T.mu=M1.mu; T.nu=M2.nu; T.tu=0; if (T.mu<=0||T.nu<=0||T.tu<0) // 要求矩阵一定要有效行,列,非零值否则将认为矩阵格式错误。 { return FORMATERROR; } if(!(T.rhead=(OLNode **)malloc((T.mu+1)*sizeof(OLNode *)))) { return OVERFLOW; } if(!(T.chead=(OLNode **)malloc((T.nu+1)*sizeof(OLNode *)))) { return OVERFLOW; } for(m=0;m<=T.mu;m++) //初始化行头指针向量;各行链表为空链表,之后通过 InsertSMartrix插入新节点 T.rhead[m]=NULL; for(m=0;m<=T.nu;m++) //初始化列头指针向量;各列链表为空链表,之后通过 InsertSMartrix插入新节点 T.chead[m]=NULL; /*--------------------------初始化了矩阵T----------------------------------*/ for(m=1;m<=M1.mu;m++) { d1=M1.rhead[m]; d2=M2.rhead[m]; for(n=1;n<=M1.nu;n++) { if(d1!=NULL&&d2!=NULL){ if(!(d=(OLNode *)malloc(sizeof(OLNode)))) { return OVERFLOW; } if(d1->j==d2->j) { *d=*d1; d->e+=d2->e; if(d->e!=0) InsertMatrix(T,d); else free(d); d1=d1->right; d2=d2->right; } else if(d1->j<d2->j) { *d=*d1; InsertMatrix(T,d); d1=d1->right; } else { *d=*d2; InsertMatrix(T,d); d2=d2->right; } continue; }//end if(d0&&d1) if(d1) { if(!(d=(OLNode *)malloc(sizeof(OLNode)))) { return OVERFLOW; } *d=*d1; InsertMatrix(T,d); d1=d1->right; continue; }//end if(d1) if(d2) { if(!(d=(OLNode *)malloc(sizeof(OLNode)))) { return OVERFLOW; } *d=*d2; InsertMatrix(T,d); d2=d2->right; continue; }//end if(d2) }//end for循环 } } else { return EXCEPTIONERROR; } PrintMatrix(T); return OK; }//AddMatrix Status MultiplyMatrix(CrossList &M1,CrossList &M2) { CrossList T; int m,n,sum,k=0; int temp[10]; OLNode *d; OLNode *d1; OLNode *d2; //可不可以直接写成OLNode *d,d1,d2; d=(OLNode *)malloc(sizeof(OLNode)); d1=(OLNode *)malloc(sizeof(OLNode)); d2=(OLNode *)malloc(sizeof(OLNode)); if(M1.mu==M2.nu&&M1.nu==M2.mu) { T.mu=M1.mu; T.nu=M2.nu; T.tu=0; //T的行数等于M1矩阵的行数,T的列数等于M2矩阵的列数 if (T.mu<=0||T.nu<=0||T.tu<0) // 要求矩阵一定要有效行、列和非零值否则将认为矩阵格式错误 { return FORMATERROR; } if(!(T.rhead=(OLNode **)malloc((T.mu+1)*sizeof(OLNode *)))) { return OVERFLOW; } if(!(T.chead=(OLNode **)malloc((T.nu+1)*sizeof(OLNode *)))) { return OVERFLOW; } for(m=0;m<=T.mu;m++) //初始化行头指针向量;各行链表为空链表,之后通过 InsertSMartrix插入新节点 T.rhead[m]=NULL; for(m=0;m<=T.nu;m++) //初始化列头指针向量;各列链表为空链表,之后通过 InsertSMartrix插入新节点 T.chead[m]=NULL; /*--------------------------初始化了矩阵T----------------------------------*/ for(m=1;m<=T.mu;m++) { for(n=1;n<=T.nu;n++) { d1=M1.rhead[m]; //d1=M1.rhead[T.mu]; d2=M2.chead[n]; //d2=M2.chead[T.nu] sum=0; for(k=0;k<=M1.mu;k++) { temp[k]=0; }//temp[]数组清零 k=0; for(d1;d1!=NULL;d1=d1->right) { if(d2==NULL) //if(d2==NULL) { break; } if(d1->j==d2->i) //当d1的列等于d2的行,则进行乘法运算,让计数数组temp加1 { temp[k]=(d1->e)*(d2->e); k++; d2=d2->down; } else if(d1->j>d2->i) //当d1的列比d2的行大,则使d2的向下移,即行数增加 { while(d2->i<=d1->j) { d2=d2->down; if(d2==NULL) { break; } } if(d2==NULL) break; } else{;} //当d1的列比d2的行小,空语句 } for(k=0;k<=M1.mu;k++) //以上段落部分有问题,待调试 { sum+=temp[k]; }//sum=temp[]数组求和 d=(OLNode *)malloc(sizeof(OLNode)); d->i=m; d->j=n; d->e=sum; if(d->e!=0){ //当d->e不为零的时候才插入 InsertMatrix(T,d); T.tu++; } } } } else { return EXCEPTIONERROR; } PrintMatrix(T); } void main(void) { Status sh; CrossList M1,M2; CreateMatrix(M1); PrintMatrix(M1); CreateMatrix(M2); PrintMatrix(M2); printf("加法结果:\n"); AddMatrix(M1,M2); printf("乘法结果:\n"); MultiplyMatrix(M1,M2); getchar(); getch(); }
评论
    相关推荐
    • 矩阵
      矩阵
    • 矩阵
      矩阵
    • 矩阵函数
      矩阵函数 各种矩阵操作的功能:(乘法,行列式,转置,次要,辅因子,逆)
    • 矩阵计算器
      矩阵计算器
    • 矩阵
      矩阵
    • 矩阵计算器
      矩阵计算器 方便计算 伴随矩阵矩阵 转置矩阵
    • 矩阵计算器
      矩阵计算器,用于,矩阵的相乘求逆转置,实用性较强%
    • 描述矩阵
      描述矩阵不仅能给你参考与借鉴,还能够让学到许多成功方法与技巧,赶快来下载描述矩阵吧!PS:可下载全部...该文档为描述矩阵,是一份很不错的参考资料,具有较高参考价值,感兴趣的可以下载看看
    • 矩阵
      Ejercicios para aprender a usar矩阵
    • 矩阵计算器
      一个简单的矩阵计算程序,写作业遇到计算简单的矩阵运算时可以用得上.