数据结构上机:数组和三元组表示及建立在其上的相关运算
来源:互联网 发布:软件服务保密合同范本 编辑:程序博客网 时间:2024/04/29 17:27
问题描述:数组和三元组表示及建立在其上的相关运算
作者:何知令
作者:何知令
完成时间:2017年6月15日
算法设计:
三元组相加:先将三元组a存入c中,再遍历三元组b,若b中元素的行列值与a中某一元素行列值相同,将其元素值加到相应位置的c.data[k]中,否则新建一个数据域,把b的元素存在其中,这样就实现了相同行列数的三元组的相加;
三元组相乘:仔细分析矩阵相乘的方式发现:能相乘的数据的行列值满足:横行元素的列等于竖行元素的行,将其作为判断条件,用双层循环比较每一组三元组a和b中的元素是否满足条件,若满足,相应位置的结果三元组c的元素值为其对应元素的乘积,否则相乘结果为0,不需考虑;
矩阵转置:只需将其行列值互换就行
说明:这只是行列值相同的情况,不是广泛情况,广泛情况需要对每一种做出考虑代码:
/*问题描述:数组和三元组表示及建立在其上的相关运算作者:何知令完成时间:2017年6月15日*/#include <stdio.h>#include <stdlib.h>#define MaxSize 16typedef struct{ int r; int c; int d;//元素值} TupNode;typedef struct{ int rows; int cols; int nums;//非零元素个数 TupNode data[MaxSize];} TSMatrix; //三元组顺序表定义TSMatrix CreatMat(TSMatrix t,int A[4][4]){ int i,j; t.rows=4; t.cols=4; t.nums=0; for(i=0; i<4; i++) { for(j=0; j<4; j++) { if(A[i][j]!=0) { t.data[t.nums].r=i; t.data[t.nums].c=j; t.data[t.nums].d=A[i][j]; t.nums++; } } } return t;}void DispMat(TSMatrix t){ int i; if(t.nums<=0) return; printf("%d\t%d\t%d\n",t.rows,t.cols,t.nums); printf("------------------\n"); for(i=0; i<t.nums; i++) printf("%d\t%d\t%d\n",t.data[i].r,t.data[i].c,t.data[i].d); printf("\n");}TSMatrix TranTat(TSMatrix t,TSMatrix tb){ int p,q=0,v;//q为tb.data的下标 tb.rows=t.cols; tb.cols=t.rows; tb.nums=t.nums; if(t.nums!=0)//当存在非零元素事执行转置 { for(v=0; v<t.cols; v++)//tb.data[q]中的记录以c域的次序排列 for(p=0; p<t.nums; p++)//p为t.data的下标 if(t.data[p].c==v) { tb.data[q].r=t.data[p].c; tb.data[q].c=t.data[p].r; tb.data[q].d=t.data[p].d; q++; } } return tb;}TSMatrix MatAdd(TSMatrix a,TSMatrix b,TSMatrix c){ int i=0,j=0,k=0; c.rows=a.rows; c.cols=a.cols; for(i=0; i<a.nums; i++) { c.data[k].r=a.data[i].r; c.data[k].c=a.data[i].c; c.data[k].d=a.data[i].d; k++; } for(i=0; i<b.nums; i++) { for(j=0; j<a.nums; j++) { if(a.data[j].r==b.data[i].r&&a.data[j].c==b.data[i].c)//如果这两个数据在同行同列加起来 { c.data[j].d+=b.data[i].d; } else { c.data[k].r=b.data[i].r; c.data[k].c=b.data[i].c; c.data[k].d=b.data[i].d; k++; } } } return c;//成功返回1}TSMatrix MatMul(TSMatrix a,TSMatrix b,TSMatrix c){ int i,j,k=0; int v; c.rows=a.rows; c.cols=a.cols; for(i=0; i<a.nums; i++) { for(j=0; j<b.nums; j++) { if(a.data[i].c==b.data[j].r)//如果两个数据行列数正好相反,则才两个数能相乘 { v=a.data[i].d*b.data[j].d; c.data[k].r=a.data[i].r; c.data[k].c=b.data[j].c; c.data[k].d=v; k++; } } } return c;}int main(){ int A[4][4]= {{1,0,3,0},{0,1,0,0},{0,0,1,0},{0,0,1,1}}; int B[4][4]= {{3,0,0,0},{0,4,0,0},{0,0,1,0},{0,0,0,2}}; TSMatrix a; TSMatrix b; TSMatrix tb; a=CreatMat(a,A); b=CreatMat(b,B); DispMat(a); DispMat(b); printf("a转置为c\n"); tb=TranTat(a,tb); DispMat(tb); printf("c=a+b:\n"); printf("c的三元组为:\n"); tb=MatAdd(a,b,tb); DispMat(tb); printf("c=a*b:\n"); tb=MatMul(a,b,tb); DispMat(tb); return 0;}程序运行结果展示:
知识点总结:三元组存储
学习心得:结构体函数传址的问题似乎不是第一次遇到了
阅读全文
0 0
- 数据结构上机:数组和三元组表示及建立在其上的相关运算
- 数据结构上机实践第八周项目8-稀疏矩阵的三元组表示的实现及应用
- 数据结构上机实践第八周项目8-稀疏矩阵的三元组表示的实现及应用
- 第九周 数据结构实践项目——数组和广义表【项目3.1-稀疏矩阵的三元组表示的实现及应用】
- 2015年大二上-数据结构-数组与广义表(3)-1.稀疏矩阵的三元组表示
- 2015年大二上-数据结构-数组与广义表(3)-2.稀疏矩阵的三元组表示
- 第九周上机实践—项目3(1)—建立稀疏矩阵三元组表示的算法库
- 稀疏矩阵的三元组表示的实现及应用(1)——建立稀疏矩阵三元组表示的算法库
- 第九周项目3--稀疏矩阵的三元组表示的实现及应用--(1)建立稀疏矩阵三元组表示的算法库
- 第九周--数据结构--稀疏矩阵的三元组表示的实现及应用
- 第九周上机实践项目3——稀疏矩阵的三元组表示的实现及应用(1)
- 第九周上机实践项目3——稀疏矩阵的三元组表示的实现及应用(2)
- 数据结构实践——稀疏矩阵的三元组表示
- 稀疏矩阵的三元组表示的实现及应用(2)——采用三元组存储稀疏矩阵,设计两个稀疏矩阵相加的运算算法
- C/C++ 第八周串和数组 (一)稀疏矩阵的三元组表示的实现及应用 项目4—(1)
- C/C++ 第八周串和数组 (一)稀疏矩阵的三元组表示的实现及应用 项目4—(2)
- 第9周SHH数据结构-【项目3-稀疏矩阵的三元组表示的实现及应用(1)】
- 第9周SHH数据结构-【项目3-稀疏矩阵的三元组表示的实现及应用(2)】
- SDUT-1135 C/C++经典程序训练5---图形打印问题
- Fiddler连接手机抓包
- Vue.js
- scala 数组详解
- C# 常用数据结构简单总结(与C++对比)
- 数据结构上机:数组和三元组表示及建立在其上的相关运算
- ios KVO机制探索
- 富文本编辑器ueditor的简单实现,及编辑器加载的图片不自适应的问题
- ubuntu下cmake3.4的安装(有GUI界面)
- static修饰符和特点
- 四舍五入-round()方法
- SpringAop-1.AspectJ起步
- |BZOJ 1635|差分序列|[Usaco2007 Jan]Tallest Cow 最高的牛
- 自定义MVC2之优化