一位数组元素移动算法:
设计一个算法,将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指向数组的列下标:
- 在遍历每一行的时候,创建一个行指针,指向行链表的尾结点
- 依次遍历该行的每一个数组元素,若元素值不为零,则按照尾插法分别插入到行链表的末尾,列链表的末尾