数据结构矩阵的压缩存储程序.docx

上传人:b****8 文档编号:11268186 上传时间:2023-02-26 格式:DOCX 页数:14 大小:56.51KB
下载 相关 举报
数据结构矩阵的压缩存储程序.docx_第1页
第1页 / 共14页
数据结构矩阵的压缩存储程序.docx_第2页
第2页 / 共14页
数据结构矩阵的压缩存储程序.docx_第3页
第3页 / 共14页
数据结构矩阵的压缩存储程序.docx_第4页
第4页 / 共14页
数据结构矩阵的压缩存储程序.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

数据结构矩阵的压缩存储程序.docx

《数据结构矩阵的压缩存储程序.docx》由会员分享,可在线阅读,更多相关《数据结构矩阵的压缩存储程序.docx(14页珍藏版)》请在冰豆网上搜索。

数据结构矩阵的压缩存储程序.docx

数据结构矩阵的压缩存储程序

实验报告

 

课程名:

数据结构(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:

矩阵的乘法程序程序运行结果

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 哲学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1