//稀疏矩阵 三元组算法

////////////////////////////////////////////
//稀疏矩阵的算法 模式匹配 				  //
//三元组算法							  // 
//Author:Wang Yong				  		  //	
//Date:	2010.8.19				  		  //
////////////////////////////////////////////


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

#define MAX 1000			//矩阵中非0元素的个数 
typedef int ElemType;

////////////////////////////////////////////

//定义三元组

typedef struct
{
	int row,col;			//非零元素的行号列号 
	ElemType e;				//非零元素的值 
}Triple; 

//定义三元组表

typedef struct
{
	Triple data[MAX+1];		//三元组的表,data[0]未用 
	int m,n,num;			//矩阵的行数,列数和非零元素个数 
}TSMatrix;

////////////////////////////////////////////////

//三元组表的创建

void CreatTSMatrix(	TSMatrix &M)
{ 
	printf("请输入稀疏矩阵的行数:");
	scanf("%d",&M.m);
	printf("请输入稀疏矩阵的列数:");
	scanf("%d",&M.n);
	printf("请输入矩阵中非零元素的个数:");
	scanf("%d",&M.num);
	
	int i;
	for(i = 1; i <= M.num; i++)
	{
		printf("请输入第%d个元素的行号和列号及其元素的值:",i);
		scanf("%d %d %d",&M.data[i].row,&M.data[i].col,&M.data[i].e);
	}
} 
//////////////////////////////////////////////

//三元组的快速转置

TSMatrix FastTransMatrix(TSMatrix A,TSMatrix &B)
{
	int number[MAX];
	int position[MAX];
	int i,j,temp;
	B.m = A.n;
	B.n = A.m;
	B.num = A.num;
	if(A.num)
	{
		for(j = 0; j < A.n;j++)			//矩阵A每一列非零元素的个数初始化 
			number[j] = 0;
			
		for(i = 1 ; i <= A.num;i++)		//求矩阵中的每一列的非零元素个数
			number[A.data[i].col]++;
				
		position[0] = 1;				//position[i]为第i列第一个元素在B.data中的位置 
		for(j = 1 ; j < A.n; j++)		//求A.data的第j列第一个非零元素在B.data中的序号 
			position[j] = position[j-1] + number[j-1];				
		//求转置矩阵B的三元组表
		for(i = 1 ; i <= A.num;i++)
		{
			j = A.data[i].col;
			temp = position[j];
			B.data[temp].row = A.data[i].col;
			B.data[temp].col = A.data[i].row;
			B.data[temp].e = A.data[i].e;
			
			position[j]++;//第j列上后续元素的位置	 
		} 
	}
	return B;
} 

//输出稀疏矩阵

void Output(TSMatrix M)
{
	int i,j;
	int cnt = 1;
	int e = 0;
	for(i = 0; i < M.m;i++)
	{
		for(j = 0; j < M.n;j++)
		{
			if(i == M.data[cnt].row && j == M.data[cnt].col)
			{
				printf("%5d",M.data[cnt].e);
				++cnt;
			}
			else
				printf("%5d",e);
		}
		printf("\n");
	}
}
///////////////////////////////////////////

// 输出三元组表

void Print(TSMatrix M)
{
	int i;
	printf("{");
	for(i = 1; i <= M.num;i++)
	{
		printf("( %d, %d, %d) ",M.data[i].row,M.data[i].col,M.data[i].e);
	}
	printf("}");
} 

////////////////////////////////////////////////// 
int main()
{
	TSMatrix M,N;
	CreatTSMatrix(M);
	Output(M);
	Print(M);
	printf("\n"); 
	FastTransMatrix(M,N);
	Output(N);
	Print(N);
	printf("\n");
	return 0;
}
原文地址:https://www.cnblogs.com/newwy/p/1847470.html