数据结构实验报告稀疏矩阵运算.docx

上传人:b****3 文档编号:26669023 上传时间:2023-06-21 格式:DOCX 页数:14 大小:176.77KB
下载 相关 举报
数据结构实验报告稀疏矩阵运算.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

数据结构实验报告稀疏矩阵运算

教学单位 计算机科学与技术

学生学号 5  

数据结构

课程设计报告书

 

题  目 稀疏矩阵运算器 

学生  豹      

专业名称 软件工程     

指导教师  志敏     

实验目的:

深入研究数组的存储表示和实现技术,熟悉广义表存储结构的特性。

需要分析:

稀疏矩阵是指那些多数元素为零的矩阵。

利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。

实现一个能进行稀疏矩阵基本运算的运算器。

要求以带“行逻辑信息”的三元组顺序表存储稀疏矩阵,实现两矩阵的相加、相减、相乘等运算。

输入以三元组表示,输出以通常的阵列形式列出。

软件平台:

Windows2000,VisualC++6.0或WINTC

概要设计:

ADTArray{

数据对象:

D={aij|0≤i≤b1-1,0≤j≤b2-1}

数据关系:

R={ROW,COL}

ROW={|0≤i≤b1-2,0≤j≤b2-1}

COL={|0≤i≤b1-1,0≤j≤b2-2}

基本操作:

CreateSMatrix(&M);//操作结果:

创建稀疏矩阵M.

PrintSMatrix(M);

//初始化条件:

稀疏矩阵M存在.

//操作结果:

输出稀疏矩阵M.

AddSMatrix(M,N,&Q);

//初始化条件:

稀疏矩阵M与N的行数和列数对应相等.

//操作结果:

求稀疏矩阵的和Q=M+N.

SubSMatrix(M,N,&Q);

//初始化条件:

稀疏矩阵M与N的行数和列数对应相等.

//操作结果:

求稀疏矩阵的差Q=M-N.

MultSMatrix(M,N,&Q);

//初始化条件:

稀疏矩阵M的列数等于N的行数.

//操作结果:

求稀疏矩阵的乘积Q=M*N.

}ADTArray

 

调试测试:

初始界面

矩阵的加法

矩阵的减法

矩阵的转置

矩阵的乘法

程序源码:

#include

#include

#include

#defineMAXSIZE40//假设非零元素个数的最大值为40

#defineMAXRC20//假设矩阵的最大行数为20

typedefintElemType;

typedefstruct

{

inti,j;//非零元的行下标和列下标

ElemTypee;//非零元的值

}Triple;

typedefstruct

{

Tripledata[MAXSIZE+1];

intrpos[MAXRC+1];//各行第一个非零元在三元组的位置表

inths,ls,fls;

}TSMatrix,*Matrix;

voidCreat(TSMatrix&M)

{

inti,k;

for(i=1;i<=MAXRC+1;i++)

M.rpos[i]=0;

printf("请输入矩阵的行数、列数和非零元个数(以空格隔开):

");

scanf("%d%d%d",&M.hs,&M.ls,&M.fls);

for(i=1;i<=M.fls;i++)

{

printf("请用三元组形式输入矩阵的元素(行列非零元素):

");

scanf("%d%d%d",&M.data[i].i,&M.data[i].j,&M.data[i].e);

}

for(i=1,k=1;i<=M.hs;i++)

{

M.rpos[i]=k;

while(M.data[k].i<=i&&k<=M.fls)

k++;

}

}

voidXiangjia(TSMatrixA,TSMatrixB,TSMatrix&C,intn)

{

inta,b,temp,l;

C.hs=A.hs;

C.ls=A.ls;

a=b=l=1;

while(a<=A.fls&&b<=B.fls)

{

if(A.data[a].i==B.data[b].i)

{

if(A.data[a].j

C.data[l++]=A.data[a++];

elseif(A.data[a].j>B.data[b].j)

{C.data[l]=B.data[b];C.data[l++].e=n*B.data[b++].e;}

else{

temp=A.data[a].e+n*B.data[b].e;

if(temp)

{

C.data[l]=A.data[a];

C.data[l].e=temp;

l++;

}

a++;b++;

}

}

elseif(A.data[a].i

C.data[l++]=A.data[a++];

else{C.data[l]=B.data[b];C.data[l++].e=n*B.data[b++].e;}

}

while(a<=A.fls)

C.data[l++]=A.data[a++];

while(b<=B.fls)

{C.data[l]=B.data[b];C.data[l++].e=n*B.data[b++].e;}

C.fls=l-1;

}

intXiangcheng(TSMatrixA,TSMatrixB,TSMatrix&Q)

{

intarow,brow,ccol,tp,p,q,t;

intctemp[MAXRC+1];

if(A.ls!

=B.hs)return0;

Q.hs=A.hs;Q.ls=B.ls;Q.fls=0;

if(A.fls*B.fls)

{

for(arow=1;arow<=A.hs;arow++)

{

for(ccol=1;ccol<=Q.ls;ccol++)

ctemp[ccol]=0;

Q.rpos[arow]=Q.fls+1;

if(arow

elsetp=A.fls+1;

for(p=A.rpos[arow];p

{

brow=A.data[p].j;

if(brow

elset=B.fls+1;

for(q=B.rpos[brow];q

{

ccol=B.data[q].j;

ctemp[ccol]+=A.data[p].e*B.data[q].e;

}

}

for(ccol=1;ccol<=Q.ls;ccol++)

{

if(ctemp[ccol]){

if(++Q.fls>MAXSIZE)return0;

Q.data[Q.fls].i=arow;

Q.data[Q.fls].j=ccol;

Q.data[Q.fls].e=ctemp[ccol];

}

}

}

}

return1;

}

voidPrint_SMatrix(TSMatrixM)

{

intk,l,n;

Matrixp;

p=&M;

for(k=1,n=1;k<=p->hs;k++)

{

for(l=1;l<=p->ls;l++)

{

if(p->data[n].i==k&&p->data[n].j==l)

{

printf("%5d",p->data[n].e);

n++;

}

else

printf("%5d",0);

}

printf("\n");

}

printf("\n");

}

voidZhuanzhi(TSMatrix*a,TSMatrix*b)

{

intq,col,p;

b->hs=a->ls;

b->ls=a->hs;

b->fls=a->fls;

if(b->fls)

{

q=1;

for(col=1;col<=a->ls;col++)

for(p=1;p<=a->fls;p++)

if(a->data[p].j==col)

{

b->data[q].i=a->data[p].j;

b->data[q].j=a->data[p].i;

b->data[q].e=a->data[p].e;

++q;

}

}

}

voidDestory_SMatrix(TSMatrix&M)

{

M.hs=M.ls=M.fls=0;

}

voidmain()

{

TSMatrixA,B,C;

TSMatrix*p=&A,*q=&B;

intflag,n;

while

(1)

{

system("cls");

printf("\n\n\n");

printf("\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");

printf("\t┃***稀疏矩阵的加、减、转、乘***┃\n");

printf("\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");

printf("\t┃1、稀疏矩阵的加法┃\n");

printf("\t┃2、稀疏矩阵的减法┃\n");

printf("\t┃3、稀疏矩阵的转置┃\n");

printf("\t┃4、稀疏矩阵的乘法┃\n");

printf("\t┃5、退出该应用程序┃\n");

printf("\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");

printf("输入要进行的项目的编号:

");

scanf("%d",&flag);

if(flag==5)break;

Creat(A);

printf("矩阵A:

\n");Print_SMatrix(A);

switch(flag)

{

case1:

Creat(B);n=1;

printf("矩阵B:

\n");

Print_SMatrix(B);

if(A.hs==B.hs&&A.ls==B.ls)

{

printf("A+B:

\n");

Xiangjia(A,B,C,n);

Print_SMatrix(C);

}

elseprintf("错误!

行列不一致\n");

break;

case2:

Creat(B);n=-1;

printf("矩阵B:

\n");

Print_SMatrix(B);

if(A.hs==B.hs&&A.ls==B.ls)

{

printf("A-B:

\n");

Xiangjia(A,B,C,n);

Print_SMatrix(C);

}

elseprintf("错误!

行列不一致\n");

break;

case3:

printf("A->B:

\n");

Zhuanzhi(p,q);

Print_SMatrix(B);

break;

case4:

Creat(B);

printf("矩阵B:

\n");

Print_SMatrix(B);

printf("A*B:

\n");

n=Xiangcheng(A,B,C);

if(!

n)printf("错误!

行列不匹配\n");

elsePrint_SMatrix(C);

break;

default:

printf("输入错误!

\n");

}

Destory_SMatrix(A);

Destory_SMatrix(B);

Destory_SMatrix(C);

getchar();getchar();

}

printf("\n\t\t\t***程序已经退出***\n");

getchar();

}

小结:

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

当前位置:首页 > IT计算机 > 电脑基础知识

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

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