三元组稀疏矩阵的快速转置

小问题却整了这么久,能力有待加强,要强烈区分三元组的列数与元素总数,不能将他俩写混了可怜可怜

#include<stdio.h>

#define MAXSIZE 1250

#define    OK      1
#define    ERROR   0
#define    TRUE    1
#define    FLASE   0

typedef    int     Status;
typedef    int     ElemType;

typedef struct{
	int   i, j;       //该非零元的行下标和列下标
	ElemType e;       //非零元对应的值
}Triple;

typedef struct{
	Triple   data[MAXSIZE+1];       //非零元三元组表,data[0]未用
	int      mu, nu, tu;            //矩阵的行数,列数,非零元个数
}TSMatrix;

Status FastTransposeSMatrix(TSMatrix M, TSMatrix &T)              //快速转置
{                                                      //采用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵T
	T.mu=M.nu;
	T.nu=M.mu;
	T.tu=M.tu;
	if(T.tu)
	{
		int col;
		int num[100], cpot[100];
		for(col=1;col<=M.nu;++col)
			num[col]=0;                 //num数组的初始化
		for(int t=1;t<=M.tu;++t)
			++num[M.data[t].j];         //求M中每一列含有的非零元个数
		cpot[1]=1;
		for(col=2;col<=M.nu;++col)
			cpot[col]=cpot[col-1]+num[col-1];         //求cpot向量
		int q;
		for(int p=1;p<=M.tu;++p)
		{
			col=M.data[p].j;
			q=cpot[col];
			T.data[q].i=M.data[p].j;
			T.data[q].j=M.data[p].i;
			T.data[q].e=M.data[p].e;
			++cpot[col];
		}//for
	}//if
	return OK;
}//FastTransposeSMatrix

Status main()
{
	TSMatrix M;
	TSMatrix T;
	printf("请输入原矩阵:\n");
	printf("行数、列数: ");
	scanf("%d%d", &M.mu, &M.nu);
	printf("元素总数: ");
	scanf("%d",&M.tu);
	printf("输入各个对应压缩值:\n");
	for(int i=1;i<=M.tu;++i)
		scanf("%d%d%d", &M.data[i].i, &M.data[i].j, &M.data[i].e);

	FastTransposeSMatrix(M, T);

	printf("转置后行数、列数、元素总数非别为:\n%d     %d     %d\n\n", T.mu, T.nu, T.tu);
	printf("值为:\n");
	for(int t=1;t<=T.tu;++t)
		printf("%d     %d     %d\n", T.data[t].i, T.data[t].j, T.data[t].e);
	return OK;
}//main


 

posted on 2011-11-27 02:16  java课程设计例子  阅读(949)  评论(0编辑  收藏  举报