稀疏矩阵加减乘运算

  • H7_694960
    了解作者
  • 9.8KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-05-22 06:01
    上传日期
稀疏矩阵加法、减法、乘法运算,抱歉没有除法运算,vc6.0运行
稀疏矩阵加减乘运算.rar
  • 稀疏矩阵四则运算
  • 2.cpp
    14.1KB
  • 稀疏矩阵四则运算.opt
    47.5KB
  • 稀疏矩阵四则运算.dsw
    557B
  • 稀疏矩阵四则运算.plg
    1.1KB
  • 稀疏矩阵四则运算.ncb
    49KB
  • 稀疏矩阵四则运算.dsp
    4.4KB
内容介绍
#include<stdlib.h> #include "stdio.h" enum MyStatus // 用来记录我的程序的返回值情况 { OK=0, EXCEPTIONERROR, FORMATERROR, OVERFLOW }; #define ElemType int typedef struct OLNode // 十字链表,参见 课本p104 { int i,j; // 稀疏矩阵的非零元的行和列下标(三元组形式),关于三元组参见课本p98 ElemType e; // 稀疏矩阵的非零元素值 OLNode *right,*down; // 指向稀疏矩阵后继结点(行,列)的指针。 }OLNode, *OLink; typedef struct // 十字链表的头结点 (与我们之前做过的链表程序的plist的含义是一样的),参见课本 p104 { OLink *rhead,*chead; // 行和列链表头指针向量基址,由CreateSMatrix分配 int mu,nu,tu; // 稀疏矩阵的行数、列数和非零元个数,这三个变量其实不应该作为十字链表头的属性,它们是为适用于本程序而添加的。 }CrossList; /*************************************************************** Author: WangBin Function: 通过CrossList M的行,列以及非零元素数初始化我们的十字链表(本质上是初始化链表的首地址) Create Date: 2011/11/28 Parameters: CrossList的引用 Return: MyStatus Revise history: ****************************************************************/ MyStatus CreateSmatixList(CrossList &M) //注意我们此时传递进来的是一个 CrossList的引用,这样做的好处是什么呢? { int i; if (M.mu<=0||M.nu<=0||M.tu<0) // 要求矩阵一定要有效夫人行,列,非零值否则将认为矩阵格式错误。 { return FORMATERROR; } if(!(M.rhead=(OLink *)malloc((M.mu+1)*sizeof(OLink)))) { return OVERFLOW; } if(!(M.chead=(OLink *)malloc((M.nu+1)*sizeof(OLink)))) { return OVERFLOW; } for(i=0;i<=M.mu;i++)//初始化行头指针向量;各行链表为空链表,之后通过 InsertSMartrix插入新节点 M.rhead[i]=NULL; for(i=0;i<=M.nu;i++)//初始化列头指针向量;各列链表为空链表,之后通过 InsertSMartrix插入新节点 M.chead[i]=NULL; return OK; }// CreateSmatixList /*************************************************************** Author: WangBin Function: 销毁十字链表的内存 Create Date: 2011/11/28 Parameters: CrossList的引用 Return: MyStatus Revise history: ****************************************************************/ MyStatus DestroySMatrix(CrossList &M) //销毁稀疏距阵M { int i; OLink DeletedNode; for(i=0;i<M.mu;i++) //按行释放结点 { DeletedNode=*(M.rhead+i); // 获得一行链表的首节点 while(DeletedNode) // 依次释放一行上的所有节点信息 { OLink TempNode=DeletedNode; DeletedNode=DeletedNode->right; free(TempNode); } } free(M.rhead); free(M.chead); M.rhead=M.chead=NULL; M.mu=M.nu=M.tu=0; return OK; }//DestroySMatrix /*************************************************************** Author: WangBin Function: 将一个被初始化的节点插入十字链表 Create Date: 2011/11/28 Parameters: CrossList的引用,待插入节点 Return: MyStatus Revise history: ****************************************************************/ MyStatus InsertSMartrix(CrossList &M,OLink p)//将结点p插入距阵M中 { OLink q=M.rhead[p->i]; if(!q||p->j<q->j) { p->right=M.rhead[p->i]; M.rhead[p->i]=p; }//end if 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||p->i<q->i) { p->down=M.chead[p->j]; M.chead[p->j]=p; }//end if else {//查找在列表中的插入位置 for(q;q->down&&q->down->i<p->i;q=q->down); p->down=q->down; q->down=p; }//完成列插入 return OK; }//InsertSMartrix /*************************************************************** Author: WangBin Function: 创建稀疏距阵M,用十字链表储存 Create Date: 2011/11/28 Parameters: CrossList的引用,行数,列数,非零元素数 Return: MyStatus Revise history: ****************************************************************/ MyStatus CreateSMatrixList(CrossList &M,int row,int col,int elemnumber) { MyStatus sh; OLink p;//定义结点p int i,j,e,m,n=0; M.mu=row; M.nu=col; M.tu=elemnumber; printf("malloc mu:%d,nu:%d size : %d\r\n",M.mu,M.nu,sizeof(OLink)); if (M.mu<=0||M.nu<=0||M.tu<0) // 要求矩阵一定要为有效行,列,非零值否则将认为矩阵格式错误。 { return FORMATERROR; } if(!(M.rhead=(OLink *)malloc((M.mu+1)*sizeof(OLink)))) { return OVERFLOW; } if(!(M.chead=(OLink *)malloc((M.nu+1)*sizeof(OLink)))) { return OVERFLOW; } for(i=0;i<=M.mu;i++)//初始化行头指针向量;各行链表为空链表,之后通过 InsertSMartrix插入新节点 M.rhead[i]=NULL; for(i=0;i<=M.nu;i++)//初始化列头指针向量;各列链表为空链表,之后通过 InsertSMartrix插入新节点 M.chead[i]=NULL; // 十字链表首节点初始化完毕,我们下面开始输入非零元素 m=0; for(n=1;n<=M.tu;n++) { do { printf("\r\n *** 请输入矩阵的第%d个非零元的行数:",n); scanf("%d",&i); if(i>M.mu) printf(" *** 输入错误! ***\r\n"); }while(i>M.mu); do { printf("\r\n *** 请输入矩阵的第%d个非零元的列数:",n); scanf("%d",&j); if(j>M.nu) printf(" *** 输入错误! ***\r\n"); }while(j>M.nu); printf("\r\n *** 请输入矩阵的第%d个非零元的值:",n); scanf("%d",&e); if(!(p=(OLNode *)malloc(sizeof(OLNode)))) { return OVERFLOW; } p->i=i; p->j=j; p->e=e;//生成结点 InsertSMartrix(M,p);//将结点p插入距阵M[m]中 }//end for return OK; }//GreateSMatrix /*************************************************************** Author: WangBin Function: 按距阵形式输出M Create Date: 2011/11/28 Parameters: CrossList的引用 Return: void Revise history: ****************************************************************/ void PrintSMatrix(CrossList &M) { int i,j; OLink p; 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; } }//end for printf("\r\n"); }//end for }//PrintSMatrix /*************************************************************** Author: WangBin Function: 将距阵M1和距阵M2进行加法运算 Create Date: 2011/11/28 Parameters: CrossList的引用 Return: MyStatus Revise history: ****************************************************************/ MyStatus Add(CrossList &M1,CrossList &M2) { CrossList T;//定义距阵T OLink d,d0,d1;//定义结点d,d0,d1 int i,l; if(M1.mu==M2.mu&&M1.nu==M2.nu) { T.mu=M1.mu; T.nu=M2.nu; T.tu=0; CreateSmatixList(T); for(i=1;i<=M1.mu;i++)//按行顺序相加 { d0=M1.rhead[i];//指向第一个结点 d1=M2.rhead[i]; for(l=1;l<=M1.nu;l++) { if(d0&&d1)//d0和d1都不为空时 { if(!(d=(OLNode *)malloc(sizeof(OLNode)))) { return OVERFLOW; } if(d0->j==d1->j)//当前结点所在的列数相等时 { *d=*d0; d->e+=d1->e; if(d->e!=0) InsertSMartrix(T,d); else free(d); d0=d0->right; d1=d1->right; } else if(d0->j<d1->j) {*d=*d0;InsertSMartrix(T,d);d0=d0->right;} else {*d=*d1;InsertSMartrix(T,d);d1=d1->right;} continue; }//end if if(d0)//d0不为空时 { if(!(d=(OLNode *)malloc(sizeof(OLNode)))) { return OVERFLOW; } *d=*d0; InsertSMartrix(T,d); d0=d0->right; continue; }//end if if(d1)//d1不为空时 { if(!(d=(OLNode *)malloc(sizeof(OLNode)))) { return OVERFLOW; } *d=*d1; InsertSMartrix(T,d); d1=d1->right; continue; }//end if }//end for }//end for printf("加法运算结果为:\r\n"); PrintSMatrix(T); printf("\r\n"); printf("下面以三元组方式输出结果:\r\n"); printf("\t\t i j e\r\n"); for(i=0;i<=T.mu;i++) //按行遍历链表 {
评论
    相关推荐
    • 矩阵
      矩阵
    • 矩阵
      矩阵
    • 矩阵函数
      矩阵函数 各种矩阵操作的功能:(乘法,行列式,转置,次要,辅因子,逆)
    • 矩阵计算器
      矩阵计算器
    • 矩阵
      矩阵
    • 矩阵计算器
      矩阵计算器 方便计算 伴随矩阵矩阵 转置矩阵
    • 矩阵计算器
      矩阵计算器,用于,矩阵的相乘求逆转置,实用性较强%
    • 描述矩阵
      描述矩阵不仅能给你参考与借鉴,还能够让学到许多成功方法与技巧,赶快来下载描述矩阵吧!PS:可下载全部...该文档为描述矩阵,是一份很不错的参考资料,具有较高参考价值,感兴趣的可以下载看看
    • 矩阵
      Ejercicios para aprender a usar矩阵
    • 矩阵计算器
      一个简单的矩阵计算程序,写作业遇到计算简单的矩阵运算时可以用得上.