稀疏矩阵的加减法.docx

上传人:b****7 文档编号:9269505 上传时间:2023-02-03 格式:DOCX 页数:26 大小:172.90KB
下载 相关 举报
稀疏矩阵的加减法.docx_第1页
第1页 / 共26页
稀疏矩阵的加减法.docx_第2页
第2页 / 共26页
稀疏矩阵的加减法.docx_第3页
第3页 / 共26页
稀疏矩阵的加减法.docx_第4页
第4页 / 共26页
稀疏矩阵的加减法.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

稀疏矩阵的加减法.docx

《稀疏矩阵的加减法.docx》由会员分享,可在线阅读,更多相关《稀疏矩阵的加减法.docx(26页珍藏版)》请在冰豆网上搜索。

稀疏矩阵的加减法.docx

稀疏矩阵的加减法

《数据结构》

课程设计报告书

 

题目:

稀疏矩阵的加减法

专业:

计算机科学与技术

学号:

学生姓名:

指导教师:

完成日期:

2016-06-20

稀疏矩阵的加减法运算

1.题目描述

假设稀疏矩阵A和B(m行n列)都采用三元组表示,编写程序计算C=A+B,D=A-B,矩阵C和D也采用三元组表示。

编写程序实现,并输出结果。

2.预备知识

1函数模块调用关系

2三元组中抽象数据类型定义

3三元组表的赋值操作

4三元组和稀疏矩阵之间的转换

3.问题分析

该程序主要实现以下功能:

(1)用三元组存储方式创建稀疏矩阵;

(2)用三元组存储方式进行稀疏矩阵的加法;

(3)用三元组存储方式进行稀疏矩阵的减法;

程序流程和设计思想可以用以下流程图来描述:

 

图1.程序运行流程图

4.数据结构设计

抽象数据类型定义

三元组中抽象数据类型定义

1typedefstruct//三元组表中元素类型的定义

{

inti,j;

inte;

}Triple;

②typedefstruct

{

a)Tripledata[MAX+1];//存放非零元素的数组,行优先

b)introw,nu,tu;

}Matrix;//三元组表类型名

③InitMatrix(A);//初始化

④AddMatrix(A,B,C);//矩阵相加

⑤SubMatrix(A,B,C);//矩阵相减

5.模块设计

1voidInitMatrix(Matrix&M)//初始化三元组矩阵

{

intnum=0;

M=*(Matrix*)malloc(sizeof(Matrix));//为三元组申请内存

printf("请输入矩阵的行、列和非零元素个数:

\n");

scanf("%d%d",&M.row,&M.nu);//输入矩阵的行、列和非零元素个数

printf("请输入矩阵的非零元值:

\n");

scanf("%d",&num);getchar();

M.tu=num;

for(inti=1;i<=M.tu;i++)//输入三元组

{

printf("请输入第%d个非零元值:

\n",i);

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

getchar();

}

}

2voidAddMatrix(MatrixA,MatrixB,Matrix&C)//将A,B的值相加放到C上

{

C=*(Matrix*)malloc(sizeof(Matrix));//为三元组C申请内存

inti=1,j=1,k=1;

intv;

if(A.row!

=B.row||A.nu!

=B.nu)//判断A、B的行列数是否相等

printf("error!

\n");

else

{

C.row=A.row;//把A的行数赋给C

C.nu=A.nu;//把A的列数赋给C

while(i<=A.tu&&j<=B.tu)

{

if(A.data[i].i==B.data[j].i)//如果三元组A的行下标与B的行下标相等

{

if(A.data[i].j

{

C.data[k].i=A.data[i].i;//把当前三元组A行下标i插入三元组C

C.data[k].j=A.data[i].j;//把当前三元组A下列标j插入三元组C

C.data[k].e=A.data[i].e;//把当前三元组A下标i对于的数值e插入三元组C

k++;

i++;

}

elseif(A.data[i].j>B.data[j].j)//如果三元组A的列下标大于B的行下标

{

C.data[k].i=B.data[j].i;

C.data[k].j=B.data[j].j;

C.data[k].e=B.data[j].e;

k++;

j++;

}

else//如果三元组A的列下标等于B的行下标

{

v=A.data[i].e+B.data[j].e;

if(v!

=0)

{

C.data[k].i=A.data[i].i;//把当前三元组A行下标i插入三元组C

C.data[k].j=A.data[i].j;//把当前三元组A下列标j插入三元组C

C.data[k].e=v;//把三元组A-B下标i对于的数值v插入三元组C

k++;

}

i++;

j++;

}

}

elseif(A.data[i].i

{

C.data[k].i=A.data[i].i;//把当前三元组A行下标i插入三元组C

C.data[k].j=A.data[i].j;//把当前三元组A下列标j插入三元组C

C.data[k].e=A.data[i].e;//把当前三元组A下标i对于的数值e插入三元组C

k++;

i++;

}

else

{

C.data[k].i=B.data[j].i;//把当前三元组B下行标i插入三元组C

C.data[k].j=B.data[j].j;//把当前三元组B下列标j插入三元组C

C.data[k].e=B.data[j].e;//把当前三元组B下标i对于的数值e插入三元组C

k++;

j++;

}

 

}

while(i<=A.tu)

{

C.data[k].i=A.data[i].i;//把当前三元组A下行标i插入三元组C

C.data[k].j=A.data[i].j;//把当前三元组A下列标j插入三元组C

C.data[k].e=A.data[i].e;//把当前三元组A下标i对于的数值e插入三元组C

k++;

i++;

}

while(j<=B.tu)

{

C.data[k].i=B.data[j].i;//把当前三元组B下行标i插入三元组C

C.data[k].j=B.data[j].j;//把当前三元组B下列标j插入三元组C

C.data[k].e=B.data[j].e;//把当前三元组B下标i对于的数值e插入三元组C

k++;

j++;

}

C.tu=k-1;

}

}

3voidSubMatrix(MatrixA,MatrixB,Matrix&C)

{

C=*(Matrix*)malloc(sizeof(Matrix));

inti=1,j=1,k=1;

intv;

if(A.row!

=B.row||A.nu!

=B.nu)//判断A、B的行列数是否相等

printf("error!

\n");

else

{

C.row=A.row;

C.nu=A.nu;

while(i<=A.tu&&j<=B.tu)

{

if(A.data[i].i==B.data[j].i)

{

if(A.data[i].j

{

C.data[k].i=A.data[i].i;//把当前三元组A下行标i插入三元组C

C.data[k].j=A.data[i].j;//把当前三元组A下列标j插入三元组C

C.data[k].e=A.data[i].e;//把当前三元组A下标i对于的数值e插入三元组C

k++;

i++;

}

elseif(A.data[i].j>B.data[j].j)

{

C.data[k].i=B.data[j].i;//把当前三元组B下行标i插入三元组C

C.data[k].j=B.data[j].j;//把当前三元组B下列标j插入三元组C

C.data[k].e=B.data[j].e;//把当前三元组B下标i对于的数值e插入三元组C

k++;

j++;

}

else

{

v=A.data[i].e-B.data[j].e;

if(v!

=0)

{

C.data[k].i=A.data[i].i;//把当前三元组A下行标i插入三元组C

C.data[k].j=A.data[i].j;//把当前三元组A下列标j插入三元组C

C.data[k].e=v;//把三元组A-B下标i对于的数值v插入三元组C

k++;

}

i++;

j++;

}

}

elseif(A.data[i].i

{

C.data[k].i=A.data[i].i;//把当前三元组A下行标i插入三元组C

C.data[k].j=A.data[i].j;//把当前三元组A下列标j插入三元组C

C.data[k].e=A.data[i].e;//把当前三元组A下标i对于的数值e插入三元组C

k++;

i++;

}

else

{

C.data[k].i=B.data[j].i;//把当前三元组B下行标i插入三元组C

C.data[k].j=B.data[j].j;//把当前三元组B下列标j插入三元组C

C.data[k].e=B.data[j].e;//把当前三元组B下标i对于的数值e插入三元组C

k++;

j++;

}

 

}

while(i<=A.tu)

{

C.data[k].i=A.data[i].i;//把当前三元组A下行标i插入三元组C

C.data[k].j=A.data[i].j;//把当前三元组A下列标j插入三元组C

C.data[k].e=A.data[i].e;//把当前三元组A下标i对于的数值e插入三元组C

k++;

i++;

}

while(j<=B.tu)

{

C.data[k].i=B.data[j].i;//把当前三元组B下行标i插入三元组C

C.data[k].j=B.data[j].j;//把当前三元组B下列标j插入三元组C

C.data[k].e=B.data[j].e;//把当前三元组B下标i对于的数值e插入三元组C

k++;

j++;

}

C.tu=k-1;

}

}

4voidShowMatrix(MatrixM)//输出三元组矩阵

{

printf("\n\n矩阵信息:

\n");

printf("row:

%dnu:

%dtu:

%d\n",M.row,M.nu,M.tu);

printf("ijk\n");

for(inti=1;i<=M.tu;i++)

{

printf("%d,%d,%d,\n",M.data[i].i,M.data[i].j,M.data[i].e);//输出三元组

}

}

5intmain()

{

charx='';

cout<<"\t┏****************************************┓"<

cout<<"\t┃    请选择相应的功能:

┃"<

cout<<"\t┃----------------------------------------┃"<

cout<<"\t┃    1.求两个矩阵相加和┃"<

cout<<"\t┃----------------------------------------┃"<

cout<<"\t┃    2.求两个矩阵相减差┃"<

cout<<"\t┃----------------------------------------┃"<

cout<<"\t┃    0.退出系统┃"<

cout<<"\t┗━━━━━━━━━━━━━━━━━━━━┛"<

intflag=1;

while(flag)

{

printf("请选择相应的功能:

");

ints;

scanf("%d",&s);getchar();//输入menu编号

switch(s)

{

case1:

{

MatrixA,B,C;

printf("请输入第一个矩阵:

\n");

InitMatrix(A);//初始化

printf("请输入第二个矩阵:

\n");

InitMatrix(B);//初始化

printf("矩阵的和为:

\n");

AddMatrix(A,B,C);

ShowMatrix(C);//输出三元组表

break;

}

case2:

{

MatrixA,B,C;

printf("请输入第一个矩阵:

\n");

InitMatrix(A);//初始化

printf("请输入第二个矩阵:

\n");

InitMatrix(B);//初始化

printf("矩阵的差为:

\n");

SubMatrix(A,B,C);

ShowMatrix(C);//输出三元组表

break;

}

case0:

flag=0;break;

}

}

}

6.运行界面及运算结果

图5-1

图5-2

图5-3

图5-4

附录:

#include

#include

#include

usingnamespacestd;

#defineMAX1000

//三元组

typedefstruct//三元组表中元素类型的定义

{

inti,j;

inte;

}Triple;

typedefstruct

{

Tripledata[MAX+1];//存放非零元素的数组,行优先

introw,nu,tu;

}Matrix;//三元组表类型名

voidInitMatrix(Matrix&M)//初始化三元组矩阵

{

intnum=0;

M=*(Matrix*)malloc(sizeof(Matrix));//为三元组申请内存

printf("请输入矩阵的行、列和非零元素个数:

\n");

scanf("%d%d",&M.row,&M.nu);//输入矩阵的行、列和非零元素个数

printf("请输入矩阵的非零元值:

\n");

scanf("%d",&num);getchar();

M.tu=num;

for(inti=1;i<=M.tu;i++)//输入三元组

{

printf("请输入第%d个非零元值:

\n",i);

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

getchar();

}

}

voidShowMatrix(MatrixM)//输出三元组矩阵

{

printf("\n\n矩阵信息:

\n");

printf("row:

%dnu:

%dtu:

%d\n",M.row,M.nu,M.tu);

printf("ijk\n");

for(inti=1;i<=M.tu;i++)

{

printf("%d,%d,%d,\n",M.data[i].i,M.data[i].j,M.data[i].e);//输出三元组

}

}

voidAddMatrix(MatrixA,MatrixB,Matrix&C)//将A,B的值相加放到C上

{

C=*(Matrix*)malloc(sizeof(Matrix));//为三元组C申请内存

inti=1,j=1,k=1;

intv;

if(A.row!

=B.row||A.nu!

=B.nu)//判断A、B的行列数是否相等

printf("error!

\n");

else

{

C.row=A.row;//把A的行数赋给C

C.nu=A.nu;//把A的列数赋给C

while(i<=A.tu&&j<=B.tu)

{

if(A.data[i].i==B.data[j].i)//如果三元组A的行下标与B的行下标相等

{

if(A.data[i].j

{

C.data[k].i=A.data[i].i;//把当前三元组A行下标i插入三元组C

C.data[k].j=A.data[i].j;//把当前三元组A下列标j插入三元组C

C.data[k].e=A.data[i].e;//把当前三元组A下标i对于的数值e插入三元组C

k++;

i++;

}

elseif(A.data[i].j>B.data[j].j)//如果三元组A的列下标大于B的行下标

{

C.data[k].i=B.data[j].i;

C.data[k].j=B.data[j].j;

C.data[k].e=B.data[j].e;

k++;

j++;

}

else//如果三元组A的列下标等于B的行下标

{

v=A.data[i].e+B.data[j].e;

if(v!

=0)

{

C.data[k].i=A.data[i].i;//把当前三元组A行下标i插入三元组C

C.data[k].j=A.data[i].j;//把当前三元组A下列标j插入三元组C

C.data[k].e=v;//把三元组A-B下标i对于的数值v插入三元组C

k++;

}

i++;

j++;

}

}

elseif(A.data[i].i

{

C.data[k].i=A.data[i].i;//把当前三元组A行下标i插入三元组C

C.data[k].j=A.data[i].j;//把当前三元组A下列标j插入三元组C

C.data[k].e=A.data[i].e;//把当前三元组A下标i对于的数值e插入三元组C

k++;

i++;

}

else

{

C.data[k].i=B.data[j].i;//把当前三元组B下行标i插入三元组C

C.data[k].j=B.data[j].j;//把当前三元组B下列标j插入三元组C

C.data[k].e=B.data[j].e;//把当前三元组B下标i对于的数值e插入三元组C

k++;

j++;

}

 

}

while(i<=A.tu)

{

C.data[k].i=A.data[i].i;//把当前三元组A下行标i插入三元组C

C.data[k].j=A.data[i].j;//把当前三元组A下列标j插入三元组C

C.data[k].e=A.data[i].e;//把当前三元组A下标i对于的数值e插入三元组C

k++;

i++;

}

while(j<=B.tu)

{

C.data[k].i=B.data[j].i;//把当前三元组B下行标i插入三元组C

C.data[k].j=B.data[j].j;//把当前三元组B下列标j插入三元组C

C.data[k].e=B.data[j].e;//把当前三元组B下标i对于的数值e插入三元组C

k++;

j++;

}

C.tu=k-1;

}

}

voidSubMatrix(MatrixA,MatrixB,Matrix&C)

{

C=*(Matrix*)malloc(sizeof(Matrix));

inti=1,j=1,k=1;

intv;

if(A.row!

=B.row||A.nu!

=B.nu)//判断A、B的行列数是否相等

printf("error!

\n");

else

{

C.row=A.row;

C.nu=A.nu;

while(i<=A.tu&&j<=B.tu)

{

if(A.data[i].i==B.data[j].i)

{

if(A.data[i].j

{

C.data[k].i=A.data[i].i;//把当前三元组A下行标i插入三元组C

C.data[k].j=A.data[i].j;//把当前三元组A下列标j插入三元组C

C.data[k].e=A.data[i].e;//把当前三元组A下标i对于的数值e插入三元组C

k++;

i++;

}

elseif(A.data[i].j>B.data[j].j)

{

C.data[k].i=B.data[j].i;//把当前三元组B下行标i插入三元组C

C.data[k].j=B.data[j].j;//把当前三元组B下列标j插入三元组C

C.data[k].e=B.data[j].e;//把当前三元组B下标i对于的数值e插入三元组C

k++;

j++;

}

else

{

v=A.data[i].e-B.data[j].e;

if(v!

=0)

{

C.data[k].i=A.data[i].i;//把当前三元组A下行标i插入三元组C

C.data[k].j=A.data[i].j;//把当前三元组A下列标j插入三元组C

C.data[k].e=v;//把三元组A-B下标i对于的数值v插入三元组C

k++;

}

i++;

j++;

}

}

elseif(A.data[i].i

{

C.data[k].i=A.data[i].i;//把当前三元组A下行标i插入三元组C

C.data[k].j=A.data[i].j;//把当前三元组A下列标j插入三元组C

C.data[k].e=A.data[i].e;

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

当前位置:首页 > 经管营销 > 销售营销

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

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