用三元组表实现稀疏矩阵的基本操作

程序中设计了三个函数:

>函数 InitSPNode()用来建立一个稀疏矩阵的三元组表。

首先输入行数、列数和非零元的值,输入(-1,-1,-1)结束输入。

>函数showMatrix()用来输出稀疏矩阵

算法中按矩阵a的列进行循环处理,对a的每一列扫描三元组,找出相应的元素,若找到,则交换其行号与列号,并存储到矩阵b的三元组中。

>函数TransposeSMatrix()用来完成稀疏矩阵的转置算法。

算法主要的工作是在p和col的两重循环中完成,时间复杂度为O(n*t)。如果非零元个数t和 m*n同数量级,则算法的时间复杂度变为O(m*n2)

#include "stdafx.h"
#include "string.h"
#define OK 1
#define MAXSIZE 10 //用户自定义三元组最大长度  
typedef struct //定义三元组表
{
	int i, j;
	int v;
}SPNode;
typedef struct //定义三元组表
{
	SPNode data[MAXSIZE];
	int m, n, t;//矩阵行,列及三元组表长度
}SPMatrix;

//输入三元组表
void InitSPNode(SPMatrix *a)
{
	int i, j, k, val, maxrow, maxcol;
	maxrow = 0;
	maxcol = 0;
	i = j = 0;
	k = 0;
	//rol=-1&&col = -1结束输入
	while (i != -1 && j != -1)
	{
		printf("输入行列值:");
		scanf("%d %d %d", &i, &j, &val);
		a->data[k].i = i;
		a->data[k].j = j;
		a->data[k].v = val;
		if (maxrow < i)
		{
			maxrow = i;
		}
		if (maxcol < j)
		{
			maxcol = j;
		}
		k++;
	}
	a->m = maxrow;
	a->n = maxcol;
	a->t = k - 1;
}

//输出矩阵
void showMatrix(SPMatrix *a)
{
	int p, q;
	int t = 0;
	for (p = 0; p <= a->m; p++)
	{
		for (q = 0; q <= a->n; q++)
		{
			if (a->data[t].i == p&&a->data[t].j == q)
			{
				printf("%d ", a->data[t].v);
				t++;
			}
			else printf("0 ");
		}
		printf("\n");
	}
}

//稀疏矩阵转置
void TransposeSMatrix(SPMatrix *a, SPMatrix *b)
{
	int q, col, p;
	b->m = a->n;
	b->n = a->m;
	b->t = a->t;
	if (b->t)
	{
		q = 0;
		for (col = 0; col <= a->n; ++col)
		{
			for (p = 0; p < a->t; ++p)
			{
				if (a->data[p].j == col)
				{
					b->data[q].i = a->data[p].j;
					b->data[q].j = a->data[p].i;
					b->data[q].v = a->data[p].v;
					++q;
				}
			}
		}
	}
}

void main(void)
{
	SPMatrix a, b;
	printf("\n结束请输入(-1 -1 -1)\n");
	InitSPNode(&a);
	printf("输入矩阵为:\n");
	showMatrix(&a);//转置前
	TransposeSMatrix(&a, &b);
	printf("输出矩阵为:\n");
	showMatrix(&b);//转制后
}

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值