//稀疏矩阵 三元组算法

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

//稀疏矩阵的算法 模式匹配 				  //

//三元组算法							  // 

//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;

}

你可能感兴趣的:(算法)