//三元组顺序表表示的稀疏矩阵的初始化
#include <stdio.h>
#include<stdlib.h>
#include"constant.h"
#define MAXSIZE 12500//假设非零元最大个数为12500
typedef int ElemType;
typedef struct{
int i,j;//非零元行下标和列下标
ElemType e;//数据域
}Triple;
typedef struct{
Triple data[MAXSIZE+1];//data[0]未使用
int mu,nu,tu;//三元组矩阵的行数,列数和非零元个数
}TSMatrix;//三元组的存储表示
//三元组初始化
Status Init_tsmatrix(TSMatrix *M)
{
int m,n,t;
printf("Inpnt the row of the TSMatrix:");
scanf("%d",&m);
printf("Input the clown of the TSMatrix:");
scanf("%d",&n);
printf("Input the number of the TSMatrix:");
scanf("%d",&t);
printf("Input the data in row order\n ");
if(m>0&&n>0){
if(t<=MAXSIZE)
{
for(int k=1;k<=t;k++)
{
scanf("%d%d%d",&M->data[k].i,&M->data[k].j,&M->data[k].e);
if(M->data[k].i>m||M->data[k].j>n)
return ERROR;
}
}else return ERROR;
}else{
M->mu=0;M->nu=0;M->tu=0;
}
M->mu=m;M->nu=n;M->tu=t;
return OK;
}
//三元组矩阵的快速转置
其中,为防止在M中多次遍历以寻找T中每一行的元素,用num数组记录M每一列非零元出现的次数,并由此算出每一列的第一个非零元在T中的下标位置,用cpot数组记录
Status FastTransposeSMatrix(TSMatrix M,TSMatrix *T)//M转置后放在T中
{
T->mu=M.nu;//行列互换
T->nu=M.mu;
T->tu=0;
int num[M.nu+1],cpot[M.nu+1];num[0],cpot[0]均不使用
int col,t,p,q;
if(M.tu)//三元组不为空
{
for(col=1;col<=M.nu;col++) num[col]=0;
for(t=1;t<=M.tu;t++) ++num[M.data[t].j];//记录M中每一列的元素个数
cpot[1]=1;//第一行元素起始下标为1
for(col=2;col<=M.nu;col++) cpot[col]=cpot[col-1]+num[col-1];//cpot数组记录T中每一行起始元素下标
for(p=1;p<=M.tu;p++)//逐个移入T阵中 //遍历一遍M矩阵即可得到T矩阵
{
col=M.data[p].j;
q=cpot[col];
T->data[q].j=M.data[p].i;
T->data[q].i=M.data[p].j;
T->data[q].e=M.data[p].e;
cpot[col]++;//此时要把该行起始元素对应的下标后移一位
}
T->tu=M.tu;//非零元个数不变
}
return OK;
}
该算法时间复杂度为O(mu*nu),比转置的一般算法(每求一列循环一次)的复杂度O(n*tu)小,大大节省了执行效率。