源代码——三元组实现稀疏矩阵及其转置


//三元组数值有一个特点:那就是在不同位置上的行值相同的元素
//一定是按照列值升序出现的。

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct TRIPLE//三元组成员
{
	int row;
	int col;
	int value;
}TRIPLE;
typedef struct TRIPLE_HEAD//三元组头
{
	int rowCount;
	int colCount;
	int elementCount;
	TRIPLE *values;
}TRIPLE_HEAD;

TRIPLE_HEAD *initTriple();
void destoryTriple(TRIPLE_HEAD *triHd);
void showTriple(TRIPLE_HEAD triHd);
TRIPLE_HEAD *revange(TRIPLE_HEAD trip);

TRIPLE_HEAD *revange(TRIPLE_HEAD trip)
{
	TRIPLE_HEAD *ntrip = NULL; //new
	int t;				//temp
	int *ass;			//辅助数组
	int i;
	int index;

	ass = (int *)malloc(sizeof(int)* (trip.colCount + 1));
	memset(ass, 0, sizeof(int) * (trip.colCount + 1));//数组清零
	
	for (i = 0; i < trip.elementCount; i++)
	{
		//统计列下标+1 的成员 的个数
		ass[trip.values[i].col + 1]++;
	}
	printf("数组ass元素值如下:(列 个数)\n");
	for (i = 0; i < trip.colCount + 1; i++)
		printf("%d, %d\n", i, ass[i]);

	for (i = 1; i < trip.colCount; i++)
		ass[i] += ass[i - 1];

	ntrip = (TRIPLE_HEAD *)malloc(sizeof(TRIPLE_HEAD));
	*ntrip = trip;

	//交换行列
	t = ntrip->rowCount;
	ntrip->rowCount = ntrip->colCount;
	ntrip->colCount = t;
	ntrip->values = (TRIPLE *)malloc(sizeof(TRIPLE)* ntrip->elementCount);

	for (i = 0; i < trip.elementCount; i++)
	{
		index = ass[trip.values[i].col]++;
		ntrip->values[index] = trip.values[i];
		t = ntrip->values[index].col;
		ntrip->values[index].col = ntrip->values[index].row;
		ntrip->values[index].row = t;
	}
	free(ass);

	return ntrip;
}
void showTriple(TRIPLE_HEAD triHd)
{
	int i, j, t = 0;

	printf("\n");
	for (i = 0; i < triHd.rowCount; i++)
	{
		for (j = 0; j < triHd.colCount; j++)
		{
			if (t < triHd.elementCount && i == triHd.values[t].row && j == triHd.values[t].col){
				printf("%d ", triHd.values[t++].value);
			}
			else{
				printf("0 ");
			}
		}
		printf("\n");
	}
}
void destoryTriple(TRIPLE_HEAD *triHd)
{
	free(triHd->values);
	free(triHd);
}
TRIPLE_HEAD *initTriple()
{
	TRIPLE_HEAD *th;
	int row;
	int col;
	int value;
	int i;

	th = (TRIPLE_HEAD *)malloc(sizeof(TRIPLE_HEAD));
	printf("请输入矩阵的阶数(行 列):");
	scanf("%d%d", &th->rowCount, &th->colCount);

	printf("请输入有效元素的个数:\n");
	scanf("%d", &th->elementCount);

	th->values = (TRIPLE *)malloc(sizeof(TRIPLE)* th->elementCount);
	for (i = 0; i < th->elementCount; i++)
	{
		printf("请输入第%d个元素(行 列 值)(共%d个):", i+1, th->elementCount);
		scanf("%d%d%d", &row, &col, &value);
		th->values[i].row = row;
		th->values[i].col = col;
		th->values[i].value = value;
	}
	return th;
}

void main(void)
{
	TRIPLE_HEAD *trip, *revTrip;

	trip = initTriple();

	showTriple(*trip);
	revTrip = revange(*trip);

	showTriple(*revTrip);//转置之后的稀疏矩阵
	destoryTriple(trip);
	destoryTriple(revTrip);

	system("pause");
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值