一、实验目的
1. 掌握数组的顺序和压缩存储结构。
2. 掌握数组的基本操作。
二、实验环境
windows 10、 Visual C++6.0
三、实验内容
1.利用三元组存储实现矩阵的相加算法。
#include <stdio.h>
#include <stdlib.h>
typedef struct threetuple{
int x;//表示非零元素的行标
int y;//表示非零元素的列标
int value;//表示非零元的值
}Triple;//用来存放三元组中每一个非零元素的信息
typedef struct infor
{
int col;//列数
int row;//行数
int counts;//存放非零元的个数
}Tripledata;//用来存放三元组矩阵的信息
void printtuple(Triple m[],Tripledata n,int A[n.col][n.row]);
void add_print(Tripledata n,int A[n.col][n.row],int B[n.col][n.row]);
int main()
{
Tripledata t[2];//定义两个信息结构体来存放矩阵信息
int i,j;
for(i=0;i<=1;i++)//行列数信息
{
printf("请输入第%d个元组的信息:\n依次输入行数,列数,非零元个数\n",i+1);
scanf("%d%d%d",&t[i].col,&t[i].row,&t[i].counts);//对非零元素进行赋值操作
}
if(t[0].col!=t[1].col||t[0].row!=t[1].row)
{
printf("该情况无法相加,程序退出");
exit(0);
}
int a,b;
a=t[0].counts;
b=t[1].counts;
Triple T1[a],T2[b];//定义两个非零元素信息结构体,前者对应A,后者是B
printf("请输入每个三元组矩阵的非零元素的信息:\n");
for(i=1,j=0;i<=t[0].counts;j++,i++)//每个三元组的信息;
{
printf("依次输入元组1第%d个非零元素行标,列标,数值",i);
scanf("%d%d%d",&T1[j].x,&T1[j].y,&T1[j].value);
}
for(i=1,j=0;i<=t[0].counts;j++,i++)//每个三元组的信息;
{
printf("依次输入元组2第%d个非零元素行标,列标,数值",i);
scanf("%d%d%d",&T2[j].x,&T2[j].y,&T2[j].value);
}
int A[t[0].col][t[0].row];//定义一个二维数组来存放矩阵信息
int B[t[1].col][t[1].row];//同上
printf("\nA的矩阵形式:");
printtuple(T1,t[0],A);//以矩阵形式打印A
printf("\nB的矩阵形式:");
printtuple(T2,t[1],B);//以矩阵形式打印B
add_print(t[0],A,B);//
return 0;
}
void printtuple(Triple m[],Tripledata n,int A[n.col][n.row])//以矩阵形式输出两个三元祖
{
int i,j;
for(i=0;i<n.col;i++)
{
for(j=0;j<n.row;j++)
{
A[i][j]=0;//将所有元素赋值0
}
}
for(i=0;i<n.counts;i++)
{
A[m[i].x-1][m[i].y-1]=m[i].value;//把三元组非零元素在对应位置赋值
}
for(i=0;i<n.col;i++)
{
printf("\n");
for(j=0;j<n.row;j++)
{
printf("%2d",A[i][j]);//以矩阵形式打印
}
}
}
void add_print(Tripledata n,int A[n.col][n.row],int B[n.col][n.row])
{
int i,j;
int C[n.col][n.row];//定义一个新矩阵用来存储相加后的结果。
printf("\n执行矩阵相加,并打印结果:\n");
for(i=0;i<n.col;i++)
{
for(j=0;j<n.row;j++)
{
C[i][j]=A[i][j]+B[i][j];//进行矩阵相加运算
printf("%-3d",C[i][j]);//相加和打印同时进行
}
printf("\n");
}
}
2.利用三元组存储实现矩阵的转置算法。
#include <stdio.h>
#define MAXSIZE 100
//三元组的定义
typedef struct
{
int row, col;//表示行列
int e; //表示值
}Triple;
//三元组容器的定义
typedef struct
{
Triple data[MAXSIZE];
int m,n,len;
}TSMatrix;
//实现转置
void TransposeTSMatrix(TSMatrix A, TSMatrix* B)
{
int i,j,k;
B->m = A.n;
B->n = A.m;
B->len = A.len;
j=0;
for( k=0; k<A.len; ++k)
{
for( i=0; i<A.len; ++i)
{
if(A.data[i].col == k)
{
B->data[j].row = A.data[i].col;
B->data[j].col = A.data[i].row;
B->data[j].e = A.data[i].e;
++j;
}
}
}
}
//测试驱动函数
int main()
{
//将输入重定向到根目录下的data.txt
freopen("data.txt", "r", stdin);
TSMatrix A,B;
int i,j,e;
int k=0;
printf("请输入三元组:");
while(scanf("%d%d%d", &i, &j, &e)!=EOF)
{
A.data[k].row = i-1;
A.data[k].col = j-1;
A.data[k].e = e;
A.len = ++k;
}
printf("\n原始三元组为:\n");
for(i=0; i<A.len; ++i )
{
printf("%3d%3d%3d\n", A.data[i].row+1, A.data[i].col+1, A.data[i].e);
}
printf("\n转置后:\n");
TransposeTSMatrix(A, &B);
for(i=0; i<B.len; ++i )
{
printf("%3d%3d%3d\n", B.data[i].row+1, B.data[i].col+1, B.data[i].e);
}
return 0;
}
四、实验结果与分析
1.
分析:三元组相加,首先,将两个矩阵储存在两个数组中。这两个矩阵分别取出元素相加,然后将相加的结果重新按大小排序。需要注意的是,当相加结果为0时,则删除该三元组。
2.
分析: 实现用三元组表示的矩阵的转置,可以直接把行列互换,然后再执行按行序为主的排序过程。为了避免重新排序引起的元素移动,可以采用列序递增转置法。