- 以三元组顺序表存储稀疏矩阵,实现两个矩阵的相加、相减与转置。
(2) 根据屏幕菜单的选择,可以进行稀疏矩阵的相加、相减与转置,且能进行输入数据出错的处理,例如参与相加运算的两个矩阵行数和列数不同,等等。
(3) 矩阵的输入、输出均为矩阵形式。
//
// Created by CHAO on 2021-11-15.
//
//以三元组顺序表存储稀疏矩阵,实现两个矩阵的相加、相减与转置。
//(2) 根据屏幕菜单的选择,可以进行稀疏矩阵的相加、相减与转置,且能进行输入数据出错的处理,例如参与相加运算的两个矩阵行数和列数不同,等等。
//(3) 矩阵的输入、输出均为矩阵形式。
#include <string.h>
#include "stdlib.h"
#include "stdio.h"
#define Max 1000
typedef int Elemtype;
typedef struct a{
int i;
int j;
Elemtype zhi;
}triple; //三元组
typedef struct b{
triple data[Max];
int row;
int colomu;
int count;
}tsmatrix;
void result(tsmatrix m){ //将三元组转化为矩阵输出
//
int zu[m.row][m.colomu];
memset(zu,0,sizeof (zu)); //将数组元素都设置为0
for(int ii=1;ii<=m.count;ii++){
zu[m.data[ii].i-1][m.data[ii].j-1]=m.data[ii].zhi;
}
for(int row=0;row<m.row;row++){
for(int col=0;col<m.colomu;col++){
printf("%d ",zu[row][col]);
}
printf("\n");
}
}
void FastTransposeSMatrix(tsmatrix M){ //矩阵的转置
tsmatrix T;
T.row=M.colomu;
T.colomu=M.row;
T.count=M.count; //赋值
int col,t,p,q;
int num[M.count];
int cpot[M.count+1];
if(T.count){
for(col=1;col<=M.colomu;col++){
num[col]=0;
}
for(t=1;t<=M.count;t++){
num[M.data[t].j]++; //求M中每一列含非零元个数
}
cpot[1]=1;
//求第col列中第一个非零元在b.bata中 的序号
for(col=2;col<=M.colomu;col++)
{
cpot[col]=cpot[col-1]+num[col-1];
}
for(p=1;p<=M.count;p++)
{
col=M.data[p].j; q=cpot[col];//放置的位置
T.data[q].i=M.data[p].j;
T.data[q].j=M.data[p].i;
T.data[q].zhi=M.data[p].zhi;
cpot[col]++;
}
}
result(T);
}
void addition(tsmatrix m,tsmatrix n){ //相加
//行列不对应
if(m.row!=n.row||m.colomu!=n.colomu)
{
printf("矩阵不对应,不能进行相加\n");
return;
}
tsmatrix c;
c.row=m.row;
c.colomu=m.colomu;
c.count=0;
for(int k=1;k<=m.count;k++){ //先把一个三元组复制过来
c.data[++c.count].i=m.data[k].i;
c.data[c.count].j=m.data[k].j;
c.data[c.count].zhi=m.data[k].zhi;
}
for(int jj=1;jj<=n.count;jj++){
int flag=0;
for(int ii=1;ii<=m.count;ii++){
if(m.data[ii].i==n.data[jj].i&&m.data[ii].j==n.data[jj].j) //如果存在元素,则对应位置相加
{
flag=1;
c.data[ii].zhi+=n.data[jj].zhi; //赋值给第三个三元组
}
}
if(flag==0){
c.data[++c.count].i=n.data[jj].i; //不在a中的元素
c.data[c.count].j=n.data[jj].j;
c.data[c.count].zhi=n.data[jj].zhi;
}
}
printf("两矩阵相加结果为:\n");
result(c);
}
void reduce(tsmatrix m,tsmatrix n){ //相减
//行列不对应
if(m.row!=n.row||m.colomu!=n.colomu)
{
printf("矩阵不对应,不能进行相加\n");
return;
}
tsmatrix c;
c.row=m.row;
c.colomu=m.colomu;
c.count=0;
for(int k=1;k<=m.count;k++){ //先把一个三元组复制过来
c.data[++c.count].i=m.data[k].i;
c.data[c.count].j=m.data[k].j;
c.data[c.count].zhi=m.data[k].zhi;
}
for(int jj=1;jj<=n.count;jj++){
int flag=0;
for(int ii=1;ii<=m.count;ii++){
if(m.data[ii].i==n.data[jj].i&&m.data[ii].j==n.data[jj].j) //如果存在元素,则对应位置相加
{
flag=1;
c.data[ii].zhi-=n.data[jj].zhi; //赋值给第三个三元组
}
}
if(flag==0){
c.data[++c.count].i=n.data[jj].i; //不在a中的元素
c.data[c.count].j=n.data[jj].j;
c.data[c.count].zhi=-1*n.data[jj].zhi;
}
}
printf("两矩阵相加结果为:\n");
result(c);
}
void prepare(tsmatrix *m){ //矩阵转化为三元组
//进行矩阵的初始化输入
int ii,jj;
m->count=0;
//
scanf("%d",&ii);
scanf("%d",&jj);
printf("开始输入:\n");
int zu[ii][jj];
for(int row=0;row<ii;row++){
for(int col=0;col<jj;col++){
scanf("%d",&zu[row][col]);
}
}
printf("矩阵输入完毕\n");
for(int a=0;a<ii;a++){
for(int b=0;b<jj;b++){
if(zu[a][b]!=0){
m->data[++m->count].i=a+1; //给三元组赋值
m->data[m->count].j=b+1;
m->data[m->count].zhi=zu[a][b];
// printf("值为%d\n",m->data[m->count].zhi);
}
}
}
m->row=ii;
m->colomu=jj;
}
int main(){
printf("输入矩阵1的行和列:\n");
tsmatrix m,n;
prepare(&m);
printf("输入矩阵2的行和列:\n");
prepare(&n);
while (1){
printf("1.矩阵相加\n");
printf("2.矩阵A减去B\n");
printf("3.矩阵A转置为矩阵C\n");
printf("4.矩阵B转置为矩阵C\n");
printf("5.退出\n");
printf("请输入需要进行的操作:\n");
int choice;
scanf("%d",&choice);
switch (choice) { //选择操作
case(1):
addition(m,n);
break;
case 2:
reduce(m,n);
break;
case 3:
FastTransposeSMatrix(m);
break;
case 4:
FastTransposeSMatrix(n);
break;
case 5:
printf("运行结束\n");
exit(0);
break;
default:
printf("输入错误\n");
return 1;
}
}
return 0;
}