三元组顺序表表示的稀疏矩阵的转置和加法运算的实现

我为编程上架构 我为编程上架构     2022-10-04     505

关键词:

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<conio.h>
#include<malloc.h>
#include<string.h>
#define MAXSIZE 100
#define MAXMU 25
typedef struct
{
int i,j;
int v;
}Triple;
typedef struct
{ int rpos[MAXMU+1];
Triple data[MAXSIZE+1];
int mu,nu,tu;
}TSMatrix;

void creat(TSMatrix *T)
{
int row,num,k;
do
{



printf(" 请输入稀疏矩阵行数: ");
scanf("%d", &T->mu);
if (T->mu<0 || T->mu>MAXMU)
printf(" 行数超出定义范围,请重新输入! ");
} while (T->mu<0 || T->mu>MAXMU);
do
{
printf(" 请输入稀疏矩阵列数: ");
scanf("%d", &T->nu);
if (T->nu<0 || T->nu>MAXMU)
printf(" 列数超出定义范围,请重新输入! ");
} while (T->nu<0 || T->nu>MAXMU);
do
{
printf(" 请输入稀疏矩阵的非零元素个数: ");
scanf("%d", &T->tu);
if (T->tu>MAXSIZE || (T->tu>T->mu*T->nu))
printf(" 非零元素个数超出定义范围,请重新输入! ");
} while (T->tu>MAXSIZE || (T->tu>T->mu*T->nu));


for (k=1; k<=T->tu; k++)
{
do
{
printf(" 请输入第%d个非零元素的行数i:", k);
scanf("%d", &T->data[k].i);
if (!T->data[k].i || T->data[k].i>T->mu)
printf(" 输入有误,请重新输入! ");
} while ((!T->data[k].i || T->data[k].i>T->mu));
do
{
printf(" 请输入第%d个非零元素的列数j:", k);
scanf("%d", &T->data[k].j);
if (!T->data[k].j || T->data[k].j>T->nu)
printf(" 输入有误,请重新输入! ");
} while ((!T->data[k].j || T->data[k].j>T->nu));
do
{
printf(" 请输入第%d个非零元素的值v:", k);
scanf("%d", &T->data[k].v);
if (T->data[k].v==0)
printf(" 输入有误,请重新输入! ");
} while (T->data[k].v==0);

}
for(row=1,num=1;row<=T->mu;row++)
{
T->rpos[row]=num;
while(T->data[num].i==row)
num++;
}
return;
}

void print(TSMatrix A)
{
int q,n,k,a=0;


printf(" 稀疏矩阵为: ");

for(n=1;n<=A.mu;n++)
{
for(k=1;k<=A.nu;k++)
{
for(q=1;q<=A.tu;q++)
if(A.data[q].i==n && A.data[q].j==k)
{
printf(" %-3d",A.data[q].v);break;
}
if(q>A.tu)
printf(" %-3d",a);
}
printf(" ");
}

}

void add(TSMatrix A,TSMatrix B)
{

int n,k;
if(A.mu!=B.mu || A.nu!=B.nu)
{
printf(" 不满足矩阵相加条件!");
printf(" 需满足两矩阵的行数、列数均对应相等方可进行加法运算!!");
}
else
{
for(n=1;n<=A.tu;n++)
for(k=1;k<=B.tu;k++)
if(A.data[n].i==B.data[k].i && A.data[n].j==B.data[k].j)
{
A.data[n].v+=B.data[k].v;
B.data[k].v=0;
}
for(k=1;k<=B.tu;k++)
if(B.data[k].v!=0)
{
A.data[A.tu+1].i=B.data[k].i;
A.data[A.tu+1].j=B.data[k].j;
A.data[A.tu+1].v=B.data[k].v;
A.tu++;
}
print(A);
}
}



char menu()
{
char n;


printf(" 1:矩阵相加 ");
printf(" 2:矩阵转置 ");
printf(" 3:退出 ");
printf(" 输入序号进行操作 ");
;n=getchar();

return n;
}

void zhuanzhi(TSMatrix A)
{
int p,q,m;
TSMatrix B;
B.mu=A.nu;
B.nu=A.mu;
B.tu=A.tu;
if(B.tu)
{
m=1;
for(p=1;p<=A.mu;p++)
for(q=1;q<=A.nu;q++)
{
B.data[m].i=A.data[m].j;
B.data[m].j=A.data[m].i;
B.data[m].v=A.data[m].v;
++m;
}
}
print(B);
}



int main()
{
TSMatrix A,B,C;

for(;;)
switch(menu())
{case ‘1‘:creat(&A);
creat(&B);
print(A);
print(B);
add(A,B);
getch();
break;
case ‘2‘:creat(&A);
print(A);
zhuanzhi(A);
getch();
break;
case ‘3‘:


exit(0);
}
}

数据结构22:数组和广义表(代码片段)

...内容:1.数据结构之多维数组2.矩阵压缩存储(十字链表、三元组顺序表、行逻辑3.矩阵转置算法及代码实现(三元组顺序表)4.矩阵乘法(行逻辑链接的顺序表)及代码实现5.矩阵加法(基于十字链表)及C语言代码实现6 查看详情

数据结构实验报告之三元组顺序表存储的稀疏矩阵练习(代码片段)

数据结构实验报告之三元组顺序表存储的稀疏矩阵练习一、实验内容1.实验目的2.实验内容二、实现过程1.编译预处理以及使用类别名2.sumDiagnoal3()函数3.FastTransposeTSMatrix()函数4.主函数三、实验结果四、编程时遇到的问题五、总结... 查看详情

稀疏矩阵三元组快速转置(转poklau123写的很清楚)

 关于稀疏矩阵的快速转置法,首先得明白其是通过对三元表进行转置。如果误以为是对矩阵进行转置,毫无疑问就算你想破脑袋也想不出个所以然,别陷入死胡同了!         对于一个三元表... 查看详情

稀疏矩阵的转置运算

...会遇到阶数很高的大型稀疏矩阵。如果按常规分配方法,顺序分配在计算机内,那将是相当浪费内存的。为此提出另外一种存储方法,仅仅存放非零元素。但对于这类矩阵,通常零元素分布没有规律,为了能找到相应的元素,所... 查看详情

数据结构-稀疏矩阵的封装(三元组,行逻辑链接)(代码片段)

稀疏矩阵(三元组,行逻辑连接)本次代码将关于基本三元组和行逻辑链接表示的三元组进行了封装,还附加了两个系数矩阵的乘法和加法,欢迎大家参考测试代码。#pragmaonce#include<iostream>#include<queue>#include<vector>#defineMAXS... 查看详情

稀疏矩阵的加法(用十字链表实现a=a+b)

...1和第二个矩阵的非零元素的个数t2,接下来的t1+t2行是三元组,各自是第一个矩阵的数据和第二个矩阵的数据, 三元组的第一个元素表示行,第二个元素表示列,第三个元素是该元素的值。输出:输出相加后的 查看详情

关于稀疏矩阵三元组的转置

直接上代码:#include<stdio.h>#include<alloc.h>#defineERROR0#defineOK1#defineEQUAL1#defineOVERFLOW-1#defineMAXSIZE12500structTripleinti;intj;intdata;;typedefstructTripleElemType;structMastrixElemType*e;intmu,nu,tu;;typedefstructMastrixmastrix;typedefstructMastrix*list;voidInitMastri... 查看详情

多维数组-矩阵的压缩存储-稀疏矩阵(一)

...  其中每一个非零元素所在的行号、列号和值组成一个三元组(i,j,aij),并由此三元组惟一确定。  稀疏矩阵进行压缩存储通常有两类方法:顺序存储和链式存储。链式存储方法【参见参考书目】。  2、三元组表  将... 查看详情

数据结构:线性表的使用原则以及链表的应用-稀疏矩阵的三元组表示

...没有介绍的链表中的双链表进行介绍。并通过稀疏矩阵的三元组的链式结构来深入理解较为复杂的链表存储结构。最后对三次博文所讲述的内容进行 查看详情

数据结构-稀疏矩阵(代码片段)

使用一个三元组<row,column,value>来唯一的确定一个矩阵元素。稀疏矩阵用一个三元组数组(三元组表)来表示。在该数组中,各矩阵元素的三元组按照在原矩阵中的位置,以行优先的顺序依次存放。定义一个Trituple结构和一个S... 查看详情

稀疏矩阵转置

...填到新矩阵即可。【行列自身保留的顺序】!!【矩阵=三元组表】 查看详情

稀疏矩阵的压缩存储思想?

...:不重复存储相同元素;不存储零值元素。稀疏矩阵,有三元组表示法、带辅助行向量的二元组表示法(也即行逻辑链表的顺序表),十字链表表示法等。算法基本思想:num[col]:第col列的非零元素个数;cpot[col]:第col列第一个非... 查看详情

稀疏矩阵一般的压缩存储方法有两种

稀疏矩阵一般的压缩存储方法有两种分别是三元组和十字链表。三元组是指形如((x,y),z)的集合(这就是说,三元组是这样的偶,其第一个射影亦是一个偶),常简记为(x,y,z)。三元组是计算机专业的一门公共基础课... 查看详情

矩阵三元组表

这里讲的矩阵三元组表有创建矩阵三元组表,求三元组表的转置矩阵,三元组表矩阵相乘,输出三元组表矩阵。 #include<stdio.h>#include<stdlib.h>#define OK1#defineERROR0#defineTRUE1#defineFALSE0#defineMAXSIZE100typedef intStatus;type 查看详情

稀疏矩阵

...零元素较少且分布的没有规律     2、三元组存储 矩阵中的一个元素有三个属性:行号,列号,元素的值,成为三元组 3、顺序结构  对于每一个三元组而已,根据行号优先或者列号优先排序起来... 查看详情

17稀疏矩阵转置

...(3,2,-1),(5,4,5)(5,1,-3),则其转置矩阵的三元组表中第3个三元组为()分析:原始的1,2,31,6,13,1,53,2,-15,4,55,1,-3转置之后相当于交换xy之后再存储2, 1, 36, 1, 1,1, 3, 52, 3,- 查看详情

matlab中矩阵的转置怎么表示

matlab中,矩阵A的转置表示成A\'【附注】matlab中常用的矩阵运算1、矩阵加、减(+,-)运算规则:(1)相加、减的两矩阵必须有相同的行和列两矩阵对应元素相加减;(2)允许参与运算的两矩阵之一是标量。标量与矩阵的所有元素分... 查看详情

稀疏矩阵--三元组表示法和十字链表示法

...大的尺寸,标准的算法经常无法操作这些稀疏矩阵。三元组表示法按照压缩存储的概念,只存储稀疏矩阵的非零元素。因此 查看详情