试编写一算法实现两个稀疏矩阵相加(C=A+B),要求稀疏矩阵用三元组表示|数据结构

试编写一算法实现两个稀疏矩阵相加(C=A+B),要求稀疏矩阵用三元组表示。
算法思路:
 当三元组A和B均未结束时
(1)若 A、B中当前三元组行、列号相同,则将A、B对应元素值相加 ,赋与C矩阵;
(2)若A中当前三元组的行号小于B,或A中当前三元组的行号与B相同,但A中列号小于 B,则将A当前三元组赋与C矩阵;
(3)若B中当前三元组的行号小于A,或B中当前三元组的行号与A相同,但B中列号小于A,则将B当前三元组赋与C矩阵;
 当B处理结束,而A中尚有未处理完的三元组时,则将A中剩余三元组全部赋与C矩阵 ;
 当A处理结束,而B中尚有未处理完的三元组时,则将B中剩余三元组全部赋与C矩阵 。

在这里插入图片描述
在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#define SMAX 16 //非零元素个数
typedef int datatype;

typedef struct
{
	int i;
	int j;
	datatype val;
}node;

typedef struct
{
	node data[SMAX];
	int m;  //行数
	int n;  //列数
	int t;  //非零元素个数
}spmatrix;

int main()
{
	spmatrix *a, *b, *c;
	spmatrix * Add(spmatrix *AA, spmatrix *BB);
	spmatrix * InitTriple();
	void Out(spmatrix *S);
	printf("初始化第一个矩阵:\n");
	a = InitTriple();
	printf("第一个矩阵为:\n");
	Out(a);
	printf("初始化第二个矩阵:\n");
	b = InitTriple();
	printf("第二个矩阵为:\n");
	Out(b);
	printf("两个矩阵相加得:\n");
	c = Add(a, b);
	Out(c);
    printf("两个矩阵相加得三元组:\n");
	printf("m=%d,n=%d,t=%d",c->m,c->n,c->t);

	return 0;
}

spmatrix * Add(spmatrix *A, spmatrix *B)
{
	void Out(spmatrix *S);
	spmatrix *C;
	int i = 0;
	int j = 0;
	int t = 0;
	C = (spmatrix *)malloc(sizeof(spmatrix));
	if (!C)
	{
		printf("分配空间失败!\n");
		exit(-1);
	}
	C->m = A->m;
	C->n = A->n;

	if (A->m != B->m || A->n != B->n)
	{
		printf("矩阵形状不一致!无法进行加法运算!\n");
	}

	while (i < A->t && j < B->t)
	{
		if (A->data[i].i > B->data[j].i)
		{
			C->data[t].i = B->data[j].i;
			C->data[t].j = B->data[j].j;
			C->data[t].val = B->data[j].val;
			j++;
			t++;
		}
		else if (A->data[i].i < B->data[j].i)
		{
			C->data[t].i = A->data[i].i;
			C->data[t].j = A->data[i].j;
			C->data[t].val = A->data[i].val;
			i++;
			t++;
		}
		else
		{
			if (A->data[i].j < B->data[j].j)
			{
				C->data[t].i = A->data[i].i;
				C->data[t].j = A->data[i].j;
				C->data[t].val = A->data[i].val;
				i++;
				t++;
			}
			else if (A->data[i].j > B->data[j].j)
			{
				C->data[t].i = A->data[i].i;
				C->data[t].j = A->data[i].j;
				C->data[t].val = A->data[i].val;
				i++;
				t++;
			}
			else
			{
				C->data[t].i = A->data[i].i;
				C->data[t].j = A->data[i].j;
				C->data[t].val = A->data[i].val + B->data[j].val;
				j++;
				i++;
				t++;
			}
		}
	}

	while (i < A->t)
	{
		C->data[t].i = A->data[i].i;
		C->data[t].j = A->data[i].j;
		C->data[t].val = A->data[i].val;
		i++;
		t++;
	}
	while (j < B->t)
	{
		C->data[t].i = B->data[j].i;
		C->data[t].j = B->data[j].j;
		C->data[t].val = B->data[j].val;
		j++;
		t++;
	}

	C->t = t;
	return C;

}


spmatrix * InitTriple()
{
	int i;
	spmatrix* S;
	S = (spmatrix*)malloc(sizeof(spmatrix));
	if (!S)
	{
		printf("分配空间失败!\n");
		exit(-1);
	}
	printf("请输入矩阵的行数和列数(m,n):\n");
	scanf("%d,%d", &S->m, &S->n);
	//printf("%d,%d", S->m, S->n);
	getchar();
	printf("请输入矩阵非零元的个数:\n");
	//getchar();
	scanf("%d", &S->t);
	//printf("%d", S->t);
	for (i = 1; i <= S->t; i++)
	{
		printf("请输入%d个非零元素的行数,列数和值(m,n,t):\n", i);
		scanf("%d,%d,%d", &S->data[i - 1].i, &S->data[i - 1].j, &S->data[i - 1].val);
	}
	return S;
}

void Out(spmatrix *S)
{
	int i;
	printf("m  n val\n");
	for (i = 0; i < S->t; i++)
	{
		printf("%d  %d  %d\n", S->data[i].i, S->data[i].j, S->data[i].val);
	}
}

  • 8
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值