第九周项目6—稀疏矩阵相加

问题及代码

02. *Copyright(c)2016,烟台大学计算机学院 
03. *All right reserved. 
04. *文件名称:稀疏矩阵的相加 .cpp 
05. *作者:郗传秀 
06. *完成日期;2016年10月27日 
07. *版本号;v1.0 
08. * 
09. *问题描述: 采用三元组存储稀疏矩阵,设计两个稀疏矩阵相加的运算算法  
10.提示1:两个行数、列数相同的矩阵可以相加  
11.提示2:充分利用已经建立好的算法库解决问题 
12. 
13. 
14. 
15. 
16. 
17. *输入描述:两个稀疏矩阵 
18. *程序输出:稀疏矩阵的三元组表示结果以及相加的结果 
19.*/  
20.  
21.#include <stdio.h>  
22.#include "tup.h"  
23.  
24.  
25.int main()  
26.{  
27.    TSMatrix ta,tb,tc;  
28.    int A[M][N]=  
29.    {  
30.        {0,0,1,0,0,0,0},  
31.        {0,2,0,0,0,0,0},  
32.        {3,0,0,0,0,0,0},  
33.        {0,0,0,5,0,0,0},  
34.        {0,0,0,0,6,0,0},  
35.        {0,0,0,0,0,7,4}  
36.    };  
37.    int B[M][N]=  
38.    {  
39.        {0,0,10,0,0,0,0},  
40.        {0,0,0,20,0,0,0},  
41.        {0,0,0,0,0,0,0},  
42.        {0,0,0,50,0,0,0},  
43.        {0,0,20,0,0,0,0},  
44.        {0,0,0,10,0,0,4}  
45.    };  
46.    CreatMat(ta,A);  
47.    CreatMat(tb,B);  
48.    printf("A:\n");  
49.    DispMat(ta);  
50.    printf("B:\n");  
51.    DispMat(tb);  
52.    if(MatAdd(ta, tb, tc))  
53.    {  
54.        printf("A+B:\n");  
55.        DispMat(tc);  
56.    }  
57.    else  
58.    {  
59.        printf("相加失败\n");  
60.    }  
61.    return 0;  
62.}  
63.#include "stdio.h"  
64.#include "tup.h"  
65.  
66.void CreatMat(TSMatrix &t,ElemType A[M][N])  //从一个二维稀疏矩阵创建其三元组表示  
67.{  
68.    int i,j;  
69.    t.rows=M;  
70.    t.cols=N;  
71.    t.nums=0;  
72.    for (i=0; i<M; i++)  
73.    {  
74.        for (j=0; j<N; j++)  
75.            if (A[i][j]!=0)     //只存储非零元素  
76.            {  
77.                t.data[t.nums].r=i;  
78.                t.data[t.nums].c=j;  
79.                t.data[t.nums].d=A[i][j];  
80.                t.nums++;  
81.            }  
82.    }  
83.}  
84.  
85.bool Value(TSMatrix &t,ElemType x,int i,int j)  //三元组元素赋值  
86.{  
87.    int k=0,k1;  
88.    if (i>=t.rows || j>=t.cols)  
89.        return false;               //失败时返回false  
90.    while (k<t.nums && i>t.data[k].r) k++;                  //查找行  
91.    while (k<t.nums && i==t.data[k].r && j>t.data[k].c) k++;//查找列  
92.    if (t.data[k].r==i && t.data[k].c==j)   //存在这样的元素  
93.        t.data[k].d=x;  
94.    else                                    //不存在这样的元素时插入一个元素  
95.    {  
96.        for (k1=t.nums-1; k1>=k; k1--)  
97.        {  
98.            t.data[k1+1].r=t.data[k1].r;  
99.            t.data[k1+1].c=t.data[k1].c;  
100.            t.data[k1+1].d=t.data[k1].d;  
101.        }  
102.        t.data[k].r=i;  
103.        t.data[k].c=j;  
104.        t.data[k].d=x;  
105.        t.nums++;  
106.    }  
107.    return true;                        //成功时返回true  
108.}  
109.  
110.bool Assign(TSMatrix t,ElemType &x,int i,int j)  //将指定位置的元素值赋给变量  
111.{  
112.    int k=0;  
113.    if (i>=t.rows || j>=t.cols)  
114.        return false;           //失败时返回false  
115.    while (k<t.nums && i>t.data[k].r) k++;                  //查找行  
116.    while (k<t.nums && i==t.data[k].r && j>t.data[k].c) k++;//查找列  
117.    if (t.data[k].r==i && t.data[k].c==j)  
118.        x=t.data[k].d;  
119.    else  
120.        x=0;                //在三元组中没有找到表示是零元素  
121.    return true;            //成功时返回true  
122.}  
123.  
124.void DispMat(TSMatrix t)        //输出三元组  
125.{  
126.    int i;  
127.    if (t.nums<=0)          //没有非零元素时返回  
128.        return;  
129.    printf("\t%d\t%d\t%d\n",t.rows,t.cols,t.nums);  
130.    printf("\t------------------\n");  
131.    for (i=0; i<t.nums; i++)  
132.        printf("\t%d\t%d\t%d\n",t.data[i].r,t.data[i].c,t.data[i].d);  
133.}  
134.  
135.void TranTat(TSMatrix t,TSMatrix &tb)       //矩阵转置  
136.{  
137.    int p,q=0,v;                    //q为tb.data的下标  
138.    tb.rows=t.cols;  
139.    tb.cols=t.rows;  
140.    tb.nums=t.nums;  
141.    if (t.nums!=0)                  //当存在非零元素时执行转置  
142.    {  
143.        for (v=0; v<t.cols; v++)        //tb.data[q]中的记录以c域的次序排列  
144.            for (p=0; p<t.nums; p++)    //p为t.data的下标  
145.                if (t.data[p].c==v)  
146.                {  
147.                    tb.data[q].r=t.data[p].c;  
148.                    tb.data[q].c=t.data[p].r;  
149.                    tb.data[q].d=t.data[p].d;  
150.                    q++;  
151.                }  
152.    }  
153.}  
154.bool MatAdd(TSMatrix a,TSMatrix b,TSMatrix &c)  
155.{  
156.    int i,j;  
157.    ElemType va,vb,vc;  
158.    if (a.rows!=b.rows || a.cols!=b.cols)  
159.        return false;                        //行数或列数不等时不能进行相加运算  
160.    c.rows=a.rows;  
161.    c.cols=a.cols;       //c的行列数与a的相同  
162.    c.nums=0;  
163.    for(i=0; i<M; i++)  
164.        for(j=0; j<N; j++)  
165.        {  
166.            Assign(a,va,i,j);  
167.            Assign(b,vb,i,j);  
168.            vc=va+vb;  
169.            if(vc)  
170.                Value(c,vc,i,j);  
171.        }  
172.    return true;  
173.}  
174.#ifndef TUP_H_INCLUDED  
175.#define TUP_H_INCLUDED  
176.  
177.#define M 6  
178.#define N 7  
179.#define MaxSize  100         //矩阵中非零元素最多个数  
180.typedef int ElemType;  
181.  
182.typedef struct  
183.{  
184.    int r;                  //行号  
185.    int c;                  //列号  
186.    ElemType d;             //元素值  
187.} TupNode;                  //三元组定义  
188.  
189.typedef struct  
190.{  
191.    int rows;               //行数  
192.    int cols;               //列数  
193.    int nums;               //非零元素个数  
194.    TupNode data[MaxSize];  
195.} TSMatrix;                 //三元组顺序表定义  
196.  
197.void CreatMat(TSMatrix &t,ElemType A[M][N]);  //从一个二维稀疏矩阵创建其三元组表示  
198.bool Value(TSMatrix &t,ElemType x,int i,int j);  //三元组元素赋值  
199.bool Assign(TSMatrix t,ElemType &x,int i,int j); //将指定位置的元素值赋给变量  
200.void DispMat(TSMatrix t);//输出三元组  
201.void TranTat(TSMatrix t,TSMatrix &tb);//矩阵转置  
202.bool MatAdd(TSMatrix a,TSMatrix b,TSMatrix &c);  
203.#endif // TUP_H_INCLUDED  




运行结果






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值