//三元组顺序表又称有序的双下标法,它的特点是:非零元在表中按行序列有序存储,因此便于进行依行顺序处理的矩阵运算。
//然而若需要按行号存取某一行的非零元,则需要从头开始查找。
//为便于随机存取任意一行的非零元,则需知道每一行的第一个非零元在三元组表中的位置。
//为此,可将上节快速转置矩阵的算法中创建的,指示“行”信息的辅助数组cpot固定在稀疏矩阵的存储结构中,这种“带行链接信息”的三元组表为行逻辑链接顺序表//------------处理乘法有优势------------//
#include < stdio.h >
#include < stdlib.h >#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define UNDERFLOW -3#define MAXSIZE 12500 //非零元个数的最大值
#define MAXRC 100 //行数typedef int Status; //函数一般有返回值最好,即使没有用,也可以用来判断
typedef int ElemType ;typedef struct
{
int row , col ; //非零元素的行下标和列下标
ElemType e ;} Triple ;
typedef struct
{
Triple data[ MAXSIZE + 1 ] ; //非零元的三元组,data[0]未用
int mu , nu , tu ; //此处是矩阵的行数(mu)、列数(nu)而不是三元组的行数和列数 . 非零元个数(tu)
int rpos[ MAXRC + 1 ] ; //各行第一个非零元的位置表} TSMatrix ;
//-----------------Function------------------//
/*Status SetRposA( TSMatrix M ) //此处考虑的是在无非零元的行,其rpos 均为 0 。//而书本上考虑的是在无非零元的行,其rpos为上一行的rpos.
{ //计算rpos[ ]值
//rpos[ row ] 指示矩阵M的第row行中第一个非零元在M.data(三元组矩阵)中的序号
//而( rpos[ row + 1 ] - 1 )则指示矩阵M的第row行中最后一个非零元在M.data(三元组矩阵)中的序号
//而最后一行中最后一个非零元在M.data中的位置显然就是M.tu了!
int i , j , count , k = 0 ;for( i = 1 ; i <= M.mu ; ++ i ) //无非零元的行,其rpos均为0
{
rpos[ i ] = 0 ;
}i = M.data[ 1 ].row ; //第一个非零元素的行下标
M.rpos[ i ] = 1 ;
for( ; i < M.mu ; ++ i ) //不能从第一行开始计算,因为第一行可能没有非零元
{
count = 0 ;
for( j = 1 ; j <= M.tu ; ++ j )
{
if( M.data[ j ].row == i )
{
count ++ ; //统计一行的非零元个数
}
if( M.data[ j ].row > i )
{
break ;
}
} //forif( count != 0 )
{
M.rpos[ i + 1 ] = M.rpos[ i - k ] + count ; //中间也可能有些行不存在非零元(i- k)
k = 0 ;
}
else
{
++ k ;
}
} //forreturn OK ;
}*/Status SetRposB( TSMatrix &M )
{
int i , row ;
int * num ;num = ( int * )malloc( ( M.nu + 1 ) * sizeof( int ) ) ;
//统计每行的非零元的个数
for( row = 1 ; row <= M.mu ; ++ row )
{
num[
第五章(3)行逻辑链接的顺序表
最新推荐文章于 2022-03-05 21:05:27 发布