数据结构矩阵的压缩存储程序.docx
《数据结构矩阵的压缩存储程序.docx》由会员分享,可在线阅读,更多相关《数据结构矩阵的压缩存储程序.docx(14页珍藏版)》请在冰豆网上搜索。
数据结构矩阵的压缩存储程序
实验报告
课程名:
数据结构(C语言版)
实验名:
矩阵的压缩存储
姓名:
班级:
学号:
时间:
2014.11.23
一实验目的与要求
1.掌握并实现稀疏矩阵的压缩存储的方法
2.在该存储方法上实现矩阵的操作
二实验容
•判断一个用二维数组存储的矩阵是不是稀疏矩阵
•将其转化为压缩存储的形式
•在压缩存储上实现矩阵的乘法和转置操作
三实验结果与分析
压缩转置程序:
#include
//判断该矩阵是否为稀疏矩阵
#definem10
#definen10
inta[m][n]={
{1,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{1,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,7,0},
{0,0,0,0,0,0,8,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
};
structthree
{
inti,j;
intvalue;
};
structthreestu[100];
structthree1
{
inti,j;
intvalue;
};
structthree1stu1[100];
intjiance()
{
intx=0;//赋初值为0
for(x=0;x<=99;x++)
{
stu[x].value=0;
}
floatt=0;
floatv;
for(inti=0;i{
for(intj=0;j{
if(a[i][j]!
=0)
t++;
}
}
if((v=t/(m*n))<=0.05)
{
printf("该矩阵为稀疏矩阵%f\n",v);
return1;
}
else
{
printf("该矩阵不是稀疏矩阵\n");
return0;
}
}
voidyasuo()
{
intt=0;
for(intr=0;r{
for(intc=0;c{
if(a[r][c]!
=0)
{
stu[t].i=r;
stu[t].j=c;
stu[t].value=a[r][c];
t++;
}
}
}
}
voiddisplay()
{
intx=0;
printf("压缩矩阵的三元组为:
\n");
for(x=0;x<=99;x++)
{
if(stu[x].value==0)break;
printf("{%d,%d,%d}",stu[x].i,stu[x].j,stu[x].value);
}
printf("\n");
}
voidzhuanzhi()
{
intx=0;//赋初值为0
intt=0;
intnum[10]={0,0,0,0,0,0,0,0,0,0};//每一列非0的数目
for(x=0;x<=99;x++)
{
stu1[x].value=0;
}
for(intj=0;j{
for(inti=0;i{
if(a[i][j]!
=0)
{
num[j]++;
t++;
}
}
}
intcpot[10]={0,0,0,0,0,0,0,0,0,0};
cpot[0]=0;
for(j=1;j{
cpot[j]=cpot[j-1]+num[j-1];
}
intcol=0;
intq=0;
for(intk=0;k{
col=stu[k].j;
q=cpot[col];
stu1[q].i=stu[k].j;
stu1[q].j=stu[k].i;
stu1[q].value=stu[k].value;
++cpot[col];
}
}
voiddisplay1()
{
intx=0;
printf("转置以后的三元组为:
\n");
for(x=0;x<=99;x++)
{
if(stu1[x].value==0)break;
printf("{%d,%d,%d}",stu1[x].i,stu1[x].j,stu1[x].value);
}
printf("\n");
}
voiddisplay2()
{
intd,b;
for(d=0;d{
for(b=0;b{
printf("%d",a[d][b]);
}
printf("\n");
}
}
voidmain()
{
display2();
if(jiance()==1)
{
yasuo();
display();
zhuanzhi();
display1();
}
}
图1:
压缩转置程序运行结果
矩阵的乘法程序:
#include
#definem13
#definen14
#definem24
#definen22
inta1[m1][n1]={
{3,0,0,5},
{0,-1,0,0},
{2,0,0,0},
};
inta2[m2][n2]={
{0,2},
{1,0},
{-2,4},
{0,0},
};
structthree1
{
inti,j;
intvalue;
};
structthree1stu1[100];
structthree2
{
inti,j;
intvalue;
};
structthree2stu2[100];
structthree3
{
inti,j;
intvalue;
};
structthree3stu3[100];
intar1pos[m1]={0};
intar2pos[m2]={0};
intQrpos[m1];
intyasuo1()
{
intt=0;
ar1pos[0]=0;
for(intr=0;r{
for(intc=0;c{
if(a1[r][c]!
=0)
{
stu1[t].i=r;
stu1[t].j=c;
stu1[t].value=a1[r][c];
t++;
}
}
ar1pos[r+1]=t;
}
returnt;
}
intyasuo2()
{
intt=0;
ar2pos[0]=0;
for(intr=0;r{
for(intc=0;c{
if(a2[r][c]!
=0)
{
stu2[t].i=r;
stu2[t].j=c;
stu2[t].value=a2[r][c];
t++;
}
}
ar2pos[r+1]=t;
}
returnt;
}
voidchengfa(intx1,intx2)
{
inta1m=0;
inta2m=0;
inttp,p,br,t,q,ccol;
intqtu=0;
for(a1m=0;a1m{
intctemp[m1]={0};
if(a1m<(m1-1))
tp=ar1pos[a1m+1];
else{tp=x1;}
for(p=ar1pos[a1m];p{
br=stu1[p].j;
if(br<(m2-1))
t=ar2pos[br+1];
else{t=x2;}
for(q=ar2pos[br];q{
ccol=stu2[q].j;
ctemp[ccol]+=stu1[p].value*stu2[q].value;
}
}
for(ccol=0;ccolif(ctemp[ccol]!
=0)
{
stu3[qtu].i=a1m;
stu3[qtu].j=ccol;
stu3[qtu].value=ctemp[ccol];
++qtu;
}
}
}
voiddisplay()
{
intx=0;
printf("a1与a2乘积之后的三元组是:
\n");
for(x=0;x<=99;x++)
{
if(stu3[x].value==0)break;
printf("{%d,%d,%d}",stu3[x].i,stu3[x].j,stu3[x].value);
}
printf("\n");
}
voiddisplay1()
{
intm,n;
printf("a1矩阵为:
\n");
for(m=0;m{
for(n=0;n{
printf("%d",a1[m][n]);
}
printf("\n");
}
printf("a2矩阵为:
\n");
for(m=0;m{
for(n=0;n{
printf("%d",a2[m][n]);
}
printf("\n");
}
}
voidmain()
{
inta;
intx1,x2;
display1();
x1=yasuo1();
x2=yasuo2();
chengfa(x1,x2);
display();
}
图2:
矩阵的乘法程序程序运行结果