矩阵内容很简单,三元组中一个重点是为什么malloc申请需要count+1的内容?
矩阵基础操作如下:包括转置、输出、相加、相乘很简单。
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10
//输出
void printfmat(int a[][MaxSize])
{
for (int i = 0;i < MaxSize;i++)
{
for (int j = 0;j < MaxSize;j++)
{
printf("%d\t",a[i][j]);
}
printf("\n");
}
}
//转置
void trsmat(int a[][MaxSize],int b[][MaxSize],int m,int n)
{
for(int i=0;i<m;i++)
for (int j = 0;j < n;j++)
{
b[j][i] = a[i][j];
}
}
//矩阵相加
void addmat(int a[][MaxSize], int b[][MaxSize], int c[][MaxSize], int m, int n)
{
for (int i = 0;i < m;i++)
for (int j = 0;j < n;j++)
{
c[i][j] = a[i][j]+b[i][j];
}
}
//矩阵相乘
void mutMat(int a[][MaxSize], int b[][MaxSize], int c[][MaxSize], int m, int n)
{
for (int i = 0;i < m;i++)
for (int j = 0;j < n;j++)
{
c[i][j] = a[i][j] * b[i][j];
}
}
int main()
{
int num[MaxSize][MaxSize],num2[MaxSize][MaxSize], num3[MaxSize][MaxSize], num4[MaxSize][MaxSize];
for (int i = 0;i < MaxSize;i++)
{
for (int j = 0;j < MaxSize;j++)
{
num[i][j] = i;
}
}
printf("The original:\n");
printfmat(num);
trsmat(num, num2, MaxSize, MaxSize);
printf("transposition result:\n");
printfmat(num2);
addmat(num, num2, num3, MaxSize, MaxSize);
printf("add result:\n");
printfmat(num3);
mutMat(num, num2, num4, MaxSize, MaxSize);
printf("multiply result:\n");
printfmat(num4);
return 0;
}
三元组内部包括所在行、列以及自己值,这样就可以将稀疏矩阵中的非0元素存储起来。
操作主要就是如何将数组转换为三元组,首先统计非0个数,为了申请足够的空间去存储非0元素,后遍历将非0存入即可。
注意:申请时需要多申请一个,因为有头指针记录非0个数,原矩阵行列数。
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10
typedef int Elemtype;
//三元组
typedef struct
{
Elemtype value;
int i,//行
j;//列
}ThirMat;
//输出
void printfmat(int a[][MaxSize])
{
for (int i = 0;i < MaxSize;i++)
{
for (int j = 0;j < MaxSize;j++)
{
printf("%d\t", a[i][j]);
}
printf("\n");
}
}
int count(int a[][MaxSize])
{
int num = 0;
for (int i = 0;i < MaxSize;i++)
{
for (int j = 0;j < MaxSize;j++)
{
if (a[i][j] != 0)
num++;
}
}
return num;
}
ThirMat* resverMat(int a[][MaxSize],int m,int n)
{
int num = count(a);
ThirMat* trimat = (ThirMat*)malloc(sizeof(ThirMat) * (num + 1));
//头指针
trimat->value = num;
trimat->i = m;
trimat->j = n;
ThirMat* aa = trimat;
aa++;
for (int i = 0;i < MaxSize;i++)
{
for (int j = 0;j < MaxSize;j++)
{
if (a[i][j] != 0)
{
aa->value = a[i][j];
aa->i = i;
aa->j = j;
aa++;
}
}
}
return trimat;
}
void printftrimat(ThirMat* b,int n)
{
ThirMat* a = b;
for(int i =0;i<=n;i++)
{
printf("%d\t",a->value);
a++;
if (i % 10 == 0)
printf("\n");
}
}
int main(void)
{
int a[MaxSize][MaxSize];
//赋值
for (int i = 0;i < MaxSize;i++)
{
for (int j = 0;j < MaxSize;j++)
{
a[i][j] = i;
}
}
printfmat(a);
ThirMat* b = resverMat(a, MaxSize, MaxSize);
printftrimat(b,count(a));
return 0;
}