稀疏矩阵的存储和快速转置实验报告.docx
《稀疏矩阵的存储和快速转置实验报告.docx》由会员分享,可在线阅读,更多相关《稀疏矩阵的存储和快速转置实验报告.docx(9页珍藏版)》请在冰豆网上搜索。
稀疏矩阵的存储和快速转置实验报告
福建工程学院
课程设计
课程:
数据结构
题目:
稀疏矩阵的快速转置
专业:
运算机类
班级:
座号:
姓名:
2021年6月25日
实验题目:
稀疏矩阵的快速转置
一、要解决的问题
利用三元组表存储稀疏矩阵,利用快速转置算法进行转置,并输出转置之前和以后的三元组表和矩阵。
二、算法大体思想描述:
由于稀疏矩阵的非零元素较少,零元素较多,因此只需存储其非零元素。
因此能够成立一个三元组表,别离保存稀疏矩阵的非零元素的行号、列号和元素值。
对稀疏矩阵进行快速转置是能够引入两个向量num[n+1],cpot[n+1],别离标记矩阵中第col列的非零元素个数和第一个非零元素在转置后的矩阵的位置;再扫描三元组表,找到非零元素,直接对其在转置后的矩阵所在的位置上进行修改,以节省时刻。
三、详细设计
⒈元素类型,结点类型
typedefstruct{
inti,j;
inte;
}Triple;
typedefstruct{
Tripledata[MAXSIZE+1];
intmu,nu,tu;
}Tsmatrix;
2.对抽象数据类型中的部份大体操作的伪码算法如下:
Tsmatrix*creatarray(Tsmatrix*M)
{intm,n,p=1;
intc;
printf("pleaseinputthearrayA:
\n");
for(m=1;m<=a;m++)
for(n=1;n<=b;n++)
{scanf("%d",&c);
if(c!
=0)
{M->data[p].e=c;
M->data[p].i=m;
M->data[p].j=n;
p++;
}
}
M->tu=p;M->mu=a;M->nu=b;
printf("yuanlaisanyuanzudebiaoshiwei:
\n\n");
for(m=1;m<=M->tu;m++)
printf("%3d%3d%3d\t",M->data[m].i,M->data[m].j,M->data[m].e);
printf("\n");
returnM;
}
/*三元组快速转置*/
Tsmatrix*fasttrans(Tsmatrix*M,Tsmatrix*T)
{intp,col,q,t,m;
intnum[100];
intcpot[100];
T->mu=M->nu;T->nu=M->mu;T->tu=M->tu;
if(T->tu!
=0)
{
for(col=1;col<=M->nu;col++)num[col]=0;
for(t=1;t<=M->tu;t++)++num[M->data[t].j];
cpot[1]=1;
for(col=2;col<=M->nu;col++)cpot[col]=cpot[col-1]+num[col-1];
for(p=1;p<=M->tu;++p)
{col=M->data[p].j;q=cpot[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;
++cpot[col];
}
}
printf("\n\nzhuanzhihoudesanyuanzubiaoshiwei:
\n\n");
for(m=1;m<=T->tu;m++)
printf("%3d%3d%3d\t",T->data[m].i,T->data[m].j,T->data[m].e);
printf("\n");
returnT;
}
/*输出三元组函数*/
voidprint(Tsmatrix*T,intx,inty)
{intm,n,p=1;
intd;
for(m=1;m<=x;m++)
{printf("\n");
for(n=1;n<=y;n++)
{if(T->data[p].i==m&&T->data[p].j==n)
{d=T->data[p].e;
p++;
}
elsed=0;
printf("%6d",d);
}
}
}
}3.主函数和其他函数的伪码算法
voidmain()
{Tsmatrix*M,*T;
M=(Tsmatrix*)malloc(sizeof(Tsmatrix));
T=(Tsmatrix*)malloc(sizeof(Tsmatrix));
printf("pleaseinputarray'srowandcol:
\n");
scanf("%d%d",&a,&b);/*输入行列数*/
M=creatarray(M);/*创建稀疏矩阵*/
printf("youhadcreatthearray:
\n");
print(M,a,b);/*输出创建好的三元组*/
T=fasttrans(M,T);/*将三元组转置*/
printf("thetransarrayis:
\n");
print(T,b,a);
getch();
}
4、模块结构及功能
}
四、源程序清单:
#include<>
#defineMAXSIZE100
typedefstruct{
inti,j;
inte;
}Triple;
typedefstruct{
Tripledata[MAXSIZE+1];
intmu,nu,tu;
}Tsmatrix;
inta,b;/*概念全局变量数组的行数a和列数b*/
/*用数组创建三元组*/
Tsmatrix*creatarray(Tsmatrix*M)
{intm,n,p=1;
intc;
printf("pleaseinputthearrayA:
\n");
for(m=1;m<=a;m++)
for(n=1;n<=b;n++)
{scanf("%d",&c);
if(c!
=0)
{M->data[p].e=c;
M->data[p].i=m;
M->data[p].j=n;
p++;
}
}
M->tu=p;M->mu=a;M->nu=b;
printf("yuanlaisanyuanzudebiaoshiwei:
\n\n");
for(m=1;mtu;m++)
printf("%3d%3d%3d\t",M->data[m].i,M->data[m].j,M->data[m].e);
printf("\n");
returnM;
}
/*三元组快速转置*/
Tsmatrix*fasttrans(Tsmatrix*M,Tsmatrix*T)
{intp,col,q,t,m;
intnum[100];
intcpot[100];
T->mu=M->nu;T->nu=M->mu;T->tu=M->tu;
if(T->tu!
=0)
{
for(col=1;col<=M->nu;col++)num[col]=0;
for(t=1;t<=M->tu;t++)++num[M->data[t].j];
cpot[1]=1;
for(col=2;col<=M->nu;col++)cpot[col]=cpot[col-1]+num[col-1];
for(p=1;p<=M->tu;++p)
{col=M->data[p].j;q=cpot[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;
++cpot[col];
}
}
printf("\n\nzhuanzhihoudesanyuanzubiaoshiwei:
\n\n");
for(m=1;mtu;m++)
printf("%3d%3d%3d\t",T->data[m].i,T->data[m].j,T->data[m].e);
printf("\n");
returnT;
}
/*输出三元组函数*/
voidprint(Tsmatrix*T,intx,inty)
{intm,n,p=1;
intd;
for(m=1;m<=x;m++)
{printf("\n");
for(n=1;n<=y;n++)
{if(T->data[p].i==m&&T->data[p].j==n)
{d=T->data[p].e;
p++;
}
elsed=0;
printf("%6d",d);
}
}
}
voidmain()
{Tsmatrix*M,*T;
M=(Tsmatrix*)malloc(sizeof(Tsmatrix));
T=(Tsmatrix*)malloc(sizeof(Tsmatrix));
printf("pleaseinputarray'srowandcol:
\n");
scanf("%d%d",&a,&b);/*输入行列数*/
M=creatarray(M);
printf("youhadcreatthearray:
\n");
print(M,a,b);
T=fasttrans(M,T);
printf("thetransarrayis:
\n");
print(T,b,a);
getch();
}
五、测试数据及测试结果:
(1)我输入的稀疏矩阵为:
(2)回车显示的结果是:
六、课程设计总结及心得体会:
通过本次课程设计,我对有关稀疏矩阵及其三元组表的知识做了温习和巩固。
在课程设计的进程中,碰到了很多问题,如稀疏矩阵操作中对矩阵信息统计犯错的问题。
我为此在程序中加入printf语句,通过该语句是不是输出,找到致使运行犯错的位置,再进行改动调试,最终解决了问题,同时也加深了对两个程序的明白得。