第五章(3)行逻辑链接的顺序表

本文介绍了行逻辑链接顺序表的概念,它是一种用于存储稀疏矩阵的结构,允许按行顺序处理矩阵运算。通过附加行链接信息,可以方便地随机存取任意一行的非零元素。文章提供了C语言实现的代码,包括创建、设置行位置、打印、销毁、复制、加法、减法、乘法和转置等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//三元组顺序表又称有序的双下标法,它的特点是:非零元在表中按行序列有序存储,因此便于进行依行顺序处理的矩阵运算。
//然而若需要按行号存取某一行的非零元,则需要从头开始查找。
//为便于随机存取任意一行的非零元,则需知道每一行的第一个非零元在三元组表中的位置。
//为此,可将上节快速转置矩阵的算法中创建的,指示“行”信息的辅助数组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 ;
   }
  }        //for

  if( count != 0 )
  {
   M.rpos[  i + 1 ] = M.rpos[ i - k ] + count ;    //中间也可能有些行不存在非零元(i- k)
   k = 0 ;
  }
  else
  {
   ++ k ;
  }
 }    //for

 return 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[ row ] = 0 ; 
 }
 for( i = 1 ; i <= M.tu ; ++ i )  
 {
  ++ num[ M.data[ i ].row ] ;        //M.data为哪行,则增加哪行的元素个数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值