稀疏矩阵基本操作

转置是对的,加法乘法没测试过。

#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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值