三元组顺序标的快速转置
对于稀疏矩阵,为了节省空间,通常使用 三元组顺序表 和 十字链表存储。
对于矩阵,转置运算是很常见的。对于三元组顺序表,如果仅仅将顺序表中每个元素的行号和列号进行交换,生成的新三元组顺序表不是真正的三元组顺序表,因为,行号不是依次递增的,当然,也可以先进行交换行号列号,再对它进行按行号升序的排序,但涉及到排序,就会很麻烦,所以,介绍一种快速转置的方法。
如果要遍历一次三元组顺序表,就要将其转置成功,那么,在遍历每一个元素时,除了交换它的行号和列号,还要将它放到新的顺序表中的特定位置,但是我们怎么知道这个位置呢,我们可以使用一个pos数组进行定位,即pos[列号]就是这个元素在新的三元组顺序表中的位置。
例如,现在第一次遍历到列号为n的元素,那它应该放在哪个位置?这与列号为n-1的最后一个元素的位置有关,要知道列号为n-1的最后一个元素的下一个位置,就要知道列号为n-1的起始位置,和列号为n-1的元素的个数,所以,要引进一个新的数组num,则 pos[n]=pos[n-1]+num[n-1]
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
/****类型声明****/
typedef struct{
int row,col;
int value;
}Triple;
typedef struct{
Triple data[MAXSIZE+1];
int rows,cols,nums;
}TSMatrix;
/****函数声明****/
//初始化三元组顺序表
//@flag 1表明需要进行输入,0表示不需要进行输入
TSMatrix * Init(int flag);
//对顺序表进行排序,这个在初始化中用到
void Sorttable(TSMatrix *A,int left,int right);
//按照矩阵的形式输出三元组顺序表
void Print(T