转置是对的,加法乘法没测试过。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define MAX_SIZE 1000
#define ERROR -1;
#define OK 0
typedef struct
{
int i, j;//数据的行列值
int value;//数据值
}Triple;
typedef struct
{
Triple data[MAX_SIZE];
int row, column;//矩阵的行数,列数,非零元的个数
int num;
}TSMatrix;
int sortMatrix(TSMatrix& matrix)//行序优先 (冒泡)
{
Triple temp;
for (int m = 0; m < matrix.num - 1; m++)//行序优先 ,一次外循环结束(行+列)值最大的data被移到最后
{
for (int n = 0; n < (matrix.num - m - 1); n++)
{
if (matrix.data[n].i > matrix.data[n + 1].i)
{
temp = matrix.data[n + 1];
matrix.data[n + 1] = matrix.data[n];
matrix.data[n] = temp;
}
else if (matrix.data[n].i == matrix.data[n + 1].i) //行相等时,列从小到大排
{
if (matrix.data[n].j > matrix.data[n + 1].j)
{
temp = matrix.data[n + 1];
matrix.data[n + 1] = matrix.data[n];
matrix.data[n] = temp;
}
}
}
}
return OK;
}
int creatTSMatix(TSMatrix& matrix)//建立一个三元组表
{
printf("输入矩阵行数:");
scanf("%d", &matrix.row);
printf("输入矩阵列数:");
scanf("%d", &matrix.column);
printf("输入非零元素的个数:");
scanf("%d", &matrix.num);
if ((matrix.num) > (matrix.row * matrix.column))
{
printf("Too many elements!");
exit(0);
}
for (int l = 0; l < matrix.num; l++)
{
printf("Please input the (row,column,value) of the %d non zero data:", l + 1);
scanf("%d,%d,%d", &matrix.data[l].i, &matrix.data[l].j, &matrix.data[l].value);
if (matrix.data[l].i <= 0 || matrix.data[l].i > matrix.row || matrix.data[l].j <= 0 || matrix.data[l].j > matrix.column)
{
printf("输入有误!");
return ERROR;
}
}
sortMatrix(matrix);
return OK;
}
int output(TSMatrix& matrix)//打印矩阵
{
int a = 0;
for (int m = 0; m < matrix.row; m++)
{
for (int n = 0; n < matrix.column; n++)
{
if ((matrix.data[a].value != 0) && (matrix.data[a].i == m + 1) && (matrix.data[a].j == n + 1))
{
printf("%d ", matrix.data[a].value);
a++;
}
else
{
printf("%d ", 0);
}
}
printf("\n");
}
printf("\n");
return OK;
}
int transMatrix(TSMatrix originalMatrix, TSMatrix& matrix)//矩阵转置
{
matrix.row = originalMatrix.column;
matrix.column = originalMatrix.row;
matrix.num = originalMatrix.num;
int x = 0;
for (int m = 0; m < originalMatrix.column; m++)
{
for (int n = 0; n < originalMatrix.num; n++)
{
if (originalMatrix.data[n].j == m + 1)
{
matrix.data[x].i = originalMatrix.data[n].j;
matrix.data[x].j = originalMatrix.data[n].i;
matrix.data[x].value = originalMatrix.data[n].value;
x++;
}
}
}
sortMatrix(matrix);
return OK;
}
/*第一次扫完data[],把原矩阵里列数是1的都给了新矩阵里(并且行列交换),第二次扫完data[],把原矩阵里列数是2的都给了新矩阵里(并且行列交换),总共要扫描次数=原矩阵的列数*/
int addMatrix(TSMatrix matrix1, TSMatrix matrix2, TSMatrix& matrix3)//矩阵加法
{
int aNum = 0, bNum = 0, cNum = 0;//abc矩阵的非零元素索引
if (matrix1.column != matrix2.column || matrix1.row != matrix2.row)
{
printf("矩阵无法相加!");
return ERROR;
}
while (aNum < matrix1.num&&bNum < matrix2.num)
{
if (matrix1.data[aNum].i == matrix2.data[bNum].i)//12行号相等
{
if (matrix1.data[aNum].j < matrix2.data[bNum].j)
{
matrix3.data[cNum].i = matrix1.data[aNum].i;
matrix3.data[cNum].j = matrix1.data[aNum].j;
matrix3.data[cNum].value = matrix1.data[aNum].value;
aNum++;
cNum++;
}
else if(matrix1.data[aNum].j > matrix2.data[bNum].j)
{
matrix3.data[cNum].i = matrix2.data[bNum].i;
matrix3.data[cNum].j = matrix2.data[bNum].j;
matrix3.data[cNum].value = matrix2.data[bNum].value;
bNum++;
cNum++;
}
else
{
matrix3.data[cNum].i = matrix2.data[bNum].i;
matrix3.data[cNum].j = matrix2.data[bNum].j;
matrix3.data[cNum].value = matrix1.data[aNum].value+ matrix2.data[bNum].value;
aNum++;
bNum++;
cNum++;
}
}
else if (matrix1.data[aNum].i < matrix2.data[bNum].i)//1的行号小
{
matrix3.data[cNum].i = matrix1.data[aNum].i;
matrix3.data[cNum].j = matrix1.data[aNum].j;
matrix3.data[cNum].value = matrix1.data[aNum].value;
aNum++;
cNum++;
}
else//2的行号小
{
matrix3.data[cNum].i = matrix2.data[bNum].i;
matrix3.data[cNum].j = matrix2.data[bNum].j;
matrix3.data[cNum].value = matrix2.data[bNum].value;
bNum++;
cNum++;
}
}
return OK;
}
int getValue(TSMatrix m, int r, int c)
{
int k= 0;
while (k < m.num && (m.data[k].i != r || m.data[k].j != c))
{
k++;
}
if (k < m.num)
{
return m.data[k].value;
}
else
{
return 0;
}
}
int multMatrix(TSMatrix matrix1, TSMatrix matrix2, TSMatrix& matrix3)//矩阵相乘
{
int s = 0, num = 0;
if (matrix1.column != matrix2.row)
{
printf("矩阵无法相乘!");
return ERROR;
}
for (int i = 1; i <= matrix1.row; i++)
{
for (int j = 1; j <= matrix2.column; j++)
{
s = 0;
for (int k = 1; k <= matrix1.column; k++)
{
s += getValue(matrix1, i, k)*getValue(matrix2, k, j);
}
if (s != 0)
{
matrix3.data[num].i = i;
matrix3.data[num].j = j;
matrix3.data[num].value = s;
num++;
}
}
}
matrix3.row = matrix1.row;
matrix3.column = matrix2.column;
matrix3.num = num;
return OK;
}
int main()
{
TSMatrix testMatrix;
TSMatrix testTransMatrix;
creatTSMatix(testMatrix);
output(testMatrix);
transMatrix(testMatrix, testTransMatrix);
output(testTransMatrix);
return 0;
}