【天勤第五章】数组、矩阵与广义表算法总结

一位数组元素移动算法:

设计一个算法,将A中所以非0元素依次移动到A数组的前端(T122.1)

算法1:变量i和j,i指向当前非零元素,j依次指向数组中每一个元素,如果找到非零元素,则使i指向下一个元素,如果i和j不相等说明i所指元素为零元素,将i和j的值交换,j继续遍历下一元素,i则指向了当前最新非零元素。

算法2:双端遍历法。i指向A[0],j指向A[n-1],当i<j时做while循环:移动i找到第一个零元素,移动j找到j所指第一个非零元素,如果此时i<j,则将二者所指元素值交换,继续循环。

 

 

 

三元组操作算法

(1)三元组的创建和查找

T123.6

(2)计算三元组A的转置矩阵B

核心思想:矩阵A的列是矩阵B的行,所以按列将A中对应的数组元素逐个变换至B中

(3)三元组的加减

问题描述:稀疏矩阵A和B行列数对应相等,计算C=A+B。其中C也采用三元组表示。

1)同时遍历A和B中每个元素:

  • 如果A的行号和B的行号相等,则判断列号,将列号较小的元素存入C中,如果列号相等则将二者相加,所得元素值如果不为0的话则存入C中;
  • 如果A的行号小于B的行号,则将A存入C中
  • 如果B的行号小于A的行号,则将B存入C中

2)将A或者B中剩余的元素存入C中。

(4)三元组的乘法

问题描述:稀疏矩阵A和B分别为m*n和n*k矩阵,采用三元组表示,计算C=A*B。其中C也采用三元组表示。

1)编写已知矩阵元素的行列号,从三元组D中获取对应元素值的函数。

2)采用常规方法解决矩阵相乘问题:

分别循环遍历m行k列,将第m行n列与n行k列的元素对应相乘再相加(将m,n和n,k分别代入1)中函数求解),如果和的值不为0则存入C中

 

 

 

 

 

十字链表算法(T119)

(1)十字链表的数据结构定义:

普通结点(OLNode):行号,列号,值,向下的指针,向右的指针

头结点(CrossList):行数,列数,非零元素个数,行结点数组,列结点数组

(2)十字链表的创建:

1)构造一个返回CrossList*的函数,传入参数为一个二维数组,行数,列数,非零元素个数;

2)CrossList初始化,结构体成员赋初值,构造行结点数组和列结点数组;

3)建立一个列链表辅助指针数组,用来指向每一个列链表的尾结点;

4)按行构造十字链表。两个for循环,i指向数组的行下标,j指向数组的列下标:

  • 在遍历每一行的时候,创建一个行指针,指向行链表的尾结点
  • 依次遍历该行的每一个数组元素,若元素值不为零,则按照尾插法分别插入到行链表的末尾,列链表的末尾

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值