三元组法 将矩阵转置 并输出转置后的三元组

#include<stdio.h>
#define ROW 3 
#define COL 3
#define MAXSIZE 30

int number[MAXSIZE+1], position[MAXSIZE+1];//number数组表示  每一列有几个元素,position数组存放每一列第一个元素在矩阵中的位置
typedef int ElemType;
typedef struct
{
	int row,col;
	ElemType e;
}Triple;

typedef struct
{
	Triple data[MAXSIZE];
	int n,m,len;
}Matrix;

void transmatrix(Matrix *A, Matrix *B)
{
	int t, j, q;
	B->n = A->n;
	B->m = A->m;
	B->len = A ->len;
	printf("hehe\n");
	if(A->len)
	{
		for(t = 1; t <= (A->len); t ++)
		{	number[A->data[t].col] ++;
			printf("number[%d]:%d",A->data[t].col, number[A->data[t].col])	;
		}
		position[1] = 1;
		for(t = 2; t <= (A->len); t ++)
			position[t] = position[t - 1] + number[t - 1];
		for(t =1; t <= (A->len); t++)
		{
			j = A->data[t].col;
			q = position[j];
			B->data[q].row = A->data[t].col;
			B->data[q].col = A->data[t].row;
			B->data[q].e = A->data[t].e;
			position[j] ++;
		}
	
	}
}

int main()
{
	Matrix mat,B;
	int array[ROW][COL];
	int i = 0, j, k = 0;
	int *p =  array;
	mat.n = ROW;
	mat.m = COL;
	mat.len = ROW * COL;
	printf("ROW number:%d COL number:%d LEN:%d\n",mat.n,mat.m,mat.len);
	for(p = array[0]; p <= array[ROW -1] + (COL -1); p ++)//point and array:see array[0] as a one-dementional array, then *p is the address of every elem
	{
		scanf("%d",p);
	}
	for(i = 0; i < ROW; i ++)
		for(j = 0; j < COL; j ++)//ordinary method
		{	
			printf("%d ",array[i][j]);
			k ++;
			if(k % COL == 0)
			{
				printf("\n");
				k = 0;
			}
		}
		printf("k = %d\n",k);
		k = 1;
	printf("hehe\n");
	for(i = 0; i < ROW; i ++)
		for(j = 0; j < COL; j ++)
		{
			if(array[i][j] == 0)
				continue;
			else
			{
				mat.data[k].row = i + 1;
				mat.data[k].col = j + 1;
				mat.data[k].e = array[i][j];
				printf("k:%d row:%d col:%d e:%d\n ",k, mat.data[k].row, mat.data[k].col, mat.data[k].e);
				k ++;
			}
		}

	transmatrix(&mat, &B);	
		printf("row col e\n");
		for(i = 1; i <= k -1; i ++)
			printf("%d %d %d\n",B.data[i].row, B.data[i].col, B.data[i].e);
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值