稀疏矩阵的加减法.docx
《稀疏矩阵的加减法.docx》由会员分享,可在线阅读,更多相关《稀疏矩阵的加减法.docx(26页珍藏版)》请在冰豆网上搜索。
稀疏矩阵的加减法
《数据结构》
课程设计报告书
题目:
稀疏矩阵的加减法
专业:
计算机科学与技术
学号:
学生姓名:
指导教师:
完成日期:
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;