用三元组表存储表示求稀疏矩阵M转置函数T.docx
《用三元组表存储表示求稀疏矩阵M转置函数T.docx》由会员分享,可在线阅读,更多相关《用三元组表存储表示求稀疏矩阵M转置函数T.docx(10页珍藏版)》请在冰点文库上搜索。
![用三元组表存储表示求稀疏矩阵M转置函数T.docx](https://file1.bingdoc.com/fileroot1/2023-6/7/04733cf8-7b52-4c9a-ab68-dff9101a2640/04733cf8-7b52-4c9a-ab68-dff9101a26401.gif)
用三元组表存储表示求稀疏矩阵M转置函数T
实验目的
采用三元组表存储表示,求稀疏矩阵M转置函数T
实验内容
编程序并上机调试运行。
采用三元组表存储表示,求稀疏矩阵M转置函数T
编写程序
//采用三元组表存储表示,求稀疏矩阵M转置函数T
#include
#defineMAXSIZE100
typedefstruct
{
inti,j;
inte;
}Triple;
typedefstruct
{
Tripledata[MAXSIZE+1];
intmu,nu,tu;
}TSMatrix;
//创建稀疏矩阵M
CreateSMatrix(TSMatrix*M)
{
inti,m,n,e,k;
printf("输入矩阵M的行数、列数、非零元的个数(中间用逗号隔开):
");
scanf("%d,%d,%d",&(*M).mu,&(*M).nu,&(*M).tu);
(*M).data[0].i=0;
printf("\n");
for(i=1;i<=(*M).tu;i++)
{
do
{
printf("输入第%d个非零元素所在的行(1~%d)列(1~%d)值以及该数值:
",i,(*M).mu,(*M).nu);
scanf("%d,%d,%d",&m,&n,&e);
k=0;
if(m<1||m>(*M).mu||n<1||n>(*M).nu)
k=1;
if(m<(*M).data[i-1].i||m==(*M).data[i-1].i&&n<(*M).data[i-1].j)
k=1;
}while(k);
(*M).data[i].i=m;
(*M).data[i].j=n;
(*M).data[i].e=e;
}
printf("\n");
return1;
}
//输出稀疏矩阵M
voidPrintSMatrix(TSMatrixM)
{
inti;
printf("**************************************\n");
for(i=1;i<=M.tu;i++)
printf("%2d%4d%8d\n",M.data[i].i,M.data[i].j,M.data[i].e);
printf("**************************************\n");
printf("\n");
}
//求稀疏矩阵M的转置矩阵T
voidTransposeSMatrix(TSMatrixM,TSMatrix*T)
{
intp,q,col;
(*T).mu=M.nu;
(*T).nu=M.mu;
(*T).tu=M.tu;
if((*T).tu)
{
q=1;
for(col=1;col<=M.nu;++col)
for(p=1;p<=M.tu;++p)
if(M.data[p].j==col)
{(*T).data[q].i=M.data[p].j;
(*T).data[q].j=M.data[p].i;
(*T).data[q].e=M.data[p].e;
++q;
}
}
return1;
}
//打印矩阵函数,以通常形式输出矩阵
voidprint(TSMatrixA)
{
intk=1,a,b;
intM[MAXSIZE][MAXSIZE];
printf("非零元素所对应的位置:
\n");
printf("**************************************\n");
for(a=0;a{
for(b=0;bM[a][b]=0;
}
while(k<=A.tu)
{
M[A.data[k].i-1][A.data[k].j-1]=A.data[k].e;
k++;
}
for(a=0;a{
printf("|");
for(b=0;bprintf("%d",M[a][b]);
printf("|\n");
}
printf("**************************************\n");
printf("\n");
}
//主函数
intmain()
{
TSMatrixM,T;
printf("创建矩阵M:
");
CreateSMatrix(&M);
printf("矩阵M的三元组表为:
\n");
PrintSMatrix(M);
print(M);
TransposeSMatrix(M,&T);
printf("稀疏矩阵M的转换矩阵T的三元组表为:
\n");
PrintSMatrix(T);
print(T);
printf("\n\n");
getchar();
return0;
}
运行程序:
程序解析:
1.首先是将程序的开头写好,定义非零元个数最多为100.
定义非零元的行下标,列下标,和非零元素为int型。
由mu,nu,tu分别代表矩阵的行数,列数和非零元个数。
2.创建稀疏矩阵M。
创建一个稀疏矩阵,用scanf进行用户输入行数,列数及非零元个数。
当i小于等于非零元个数时,进行以下的for循环,执行内循环的循环语句。
当k不为0时,重复执行输入非零元素的行列值以及其值,若超出行数或列数或非零元个数,则跳出循环。
加入外循环,执行外循环的三个语句,直到,i等于非零个数,跳出外循环。
3.输出稀疏矩阵M
用PrintSMatrix函数输出稀疏矩阵,从i等于1循环执行到i等于非零元个数,使非零元的行列数一个一个输出。
4.求稀疏矩阵的转置矩阵。
用TransposeSMatrix函数实现稀疏矩阵M转置为矩阵T。
让T的行等于M的列,T的列等于M的行。
非零元素相等。
当非零元素不等于零时,就执行if语句,if语句中两个for循环和一个if循环实现了MT矩阵行列的对调,按列序求转置。
最后返回1.
5.打印函数,输出非零元素对应的位置
这里定义一个M的数组,当a小于行数数,执行内循环,使b的列数不断增加,赋值为0,在执行外循环,b变为1,执行内循环,在赋值为0,然后再跳出内循环,执行外循环,如此直到,a等于行数则跳出外循环。
执行下面的while语句。
当k<=A的非零元个数时,将非零元素放置到指定的位置。
然后跳出循环执行下面的for语句,结果就可以输出链表状的非零元素。
6.建立main函数。
Main函数直接调用各个函数,在M的后面打印出其普通排列,T后面也打印出其普通排列。