行逻辑链接的顺序表
行逻辑链接的顺序表 #include
#include
#include
#define MAXSIZE 12500 //设非零元个数最大值
#define MAXRC 100 //非零元最大数
typedef int ElemType;
typedef struct
{
int i,j; //非零元素的行下标和列下标
ElemType e;
}Triple; //三元组结构
typedef struct
{
Triple data[MAXSIZE+1];//非零元三元组表,0下标不用
int rpos[MAXRC+1]; //各行第一个非零元位置表
int mu,nu,tu; //矩阵的行数mu,列数nu和非零元个数tu
}RLSMatrix;
void CreateSMatrix(RLSMatrix *T,ElemType *M,int m,int n) //
创建稀疏矩阵,m,n为行列数
{
int i,j,subscript,count,total;
Triple tElem; //三元组元素
subscript = 1;
count = 0; //用于计算每列非零元
total = 0;
for(i=0;idata[subscript++] =
tElem;
++total;
}
subscript = 1;
T->rpos[1] = 1; //第一位肯定为1
for(i=0;irpos[subscript+1] = T->rpos[subscript] + count;//上一行的rpos+该列非零个数
subscript++;
}
count = 0;
}
T->mu = m; //取得行,列数,非零元数
T->nu = n;
T->tu = total;
}
void FastTransposeSMatrix(RLSMatrix M,RLSMatrix *T)
{
//求稀疏矩阵M的转置矩阵T,三元组表示
int col,t;//其它变量
int p,q; //分别代表指向M,T非零元的指针
int num[30],cpot[30]; //num
记录
混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载
每列非零元个数,cpot
记录每列非零元在矩阵T中的相应位置
Triple tElem; //三元组元素
T->mu = M.nu; T->nu = M.mu; T->tu = M.tu;
if(T->tu)
{
for(col=1;col<=M.nu;++col) num[col] = 0;//每列先置0
//根据列号j,在相应的num列号(下标)中求出该
列非零元个数
for(t=1;t<=M.tu;++t) ++num[M.data[t].j];
T->rpos[1] = cpot[1] = 1; //第1位总为1
//求第col列中第一个非0元在T.data中的序号
for(col=2;col<=M.tu;++col)
T->rpos[col] = cpot[col] = cpot[col-1] + num[col-1];
for(p=1;p<=M.tu;++p) //进行置换
{
col = M.data[p].j; q = cpot[col];
tElem.i = M.data[p].j;
tElem.j = M.data[p].i;
tElem.e = M.data[p].e;
T->data[q] = tElem;
++cpot[col];
}//for p
}//if T
}
void MultSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix *Q)
{
//求矩阵乘积Q=M X N,采用行逻辑链接存储表示。
int arow,brow; //行变量
int tp; //非0元个数中间变量
int p,q; //M,N中的位置指针
int ccol; //列中间变量
int i;
int ctemp[10]; //对应位置元素相乘积的累加器
Triple tElem; //三元组元素
if(M.nu!=N.mu) exit(EXIT_SUCCESS); //M列数不等于N
行数不能相乘
Q->mu = M.mu; Q->nu = N.nu; Q->tu = 0; //初始化Q
if(M.tu*N.tu!=0) //判断是否非0矩阵
{
for(arow=1;arow<=M.mu;++arow)//处理M每一行
{
for(i=1;i<=N.nu;i++)
ctemp[i] = 0;
Q->rpos[arow] = Q->tu + 1;//求出Q每
行第一非0元的位置
if(arownu;++ccol)
if(ctemp[ccol])
{
if(++Q->tu>MAXSIZE) exit(1);
//取得行号 ,列号
tElem.i = arow; tElem.j = ccol;
tElem.e = ctemp[ccol];
Q->data[Q->tu] = tElem;
}
}// fro arow
}// if M.tu*N.tu
}
void PrintSMatrix(RLSMatrix *T)//打印三元组表
{
int i;
printf("i j e\n");
for(i=1;i<=T->tu;++i)
printf("%d %d %d %d\n",T->data[i].i,T->data[i].j,T->data[i
].e,T->rpos[i]);
}
int main(void)
{
ElemType arr[][4] = {{0,1,0,1},{2,0,3,0},{0,1,0,0}};
ElemType arr2[][3] =
{{0,0,0},{0,2,0},{1,0,0},{4,0,0}};
RLSMatrix T,TS,TMul;
CreateSMatrix(&T,arr,3,4);
printf("稀疏矩阵T:\n");
PrintSMatrix(&T);
//FastTransposeSMatrix(T,&TS);
printf("\n");
//printf("转置后的");
//PrintSMatrix(&TS);
CreateSMatrix(&TS,arr2,4,3);
printf("稀疏矩阵TS:\n");
PrintSMatrix(&TS);
printf("\n");
MultSMatrix(T,TS,&TMul);
printf("稀疏矩阵TXTS:\n");
PrintSMatrix(&TMul);
return 0;
}