数据结构矩阵的压缩存储程序.docx
- 文档编号:10684840
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:14
- 大小:56.92KB
数据结构矩阵的压缩存储程序.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;ccol if(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: 矩阵的乘法程序程序运行结果
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 矩阵 压缩 存储 程序