1. 程式人生 > >第五章 陣列和廣義表(3)三元組矩陣轉換

第五章 陣列和廣義表(3)三元組矩陣轉換

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

//巨集定義
#define OK 1  
#define ERROR 0  
#define TRUE 1  
#define FALSE 0  

#define MAXSIZE 12

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;

//建立稀疏M
Status CreateSMatrix(TSMatrix *M){
	int a,b,c;
	int m=3,n=4,t; 
	M->mu=m;      //稀疏矩陣的行列
	M->nu=n;

	printf("請輸入稀疏矩陣的非零元素個數:\n");
	scanf("%d",&t);
	for(int i=1;i<=t;i++){
		printf("請輸入 第 %d 個元素的行、列和值:",i);
		scanf("%d %d %d",&a, &b, &c);
		M->data[i].i=a;
		M->data[i].j=b;
		M->data[i].e=c;
	}
	M->tu=t;
	return OK;
}

//輸出稀疏矩陣、行數列數
//輸出,在螢幕上以行列的形式輸出矩陣
Status PrintSMatrix(TSMatrix *M){
	int i=0,j=0,k=1;
	for(i=1;i<=M->mu;i++){
		for(j=1;j<=M->nu;j++){
			if(i==M->data[k].i && j==M->data[k].j){
				printf("%d",M->data[k].e);
				k++;
			}
			else{
				printf("%d",0);
			}
		}
		printf("\n");
	}
	return OK;
}

//採用三元組表儲存表示,求稀疏矩陣M的轉置矩陣T 
Status TransposeSMatrix(TSMatrix *M,TSMatrix *T){
	int col,p,q;
	T->mu=M->nu; T->nu=M->mu; T->tu=M->tu;
	if(T->tu){
		q=1;
		for(col=1;col<=M->nu;col++)
			for(p=1;p<=M->tu;p++)
				if(M->data[p].j==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;
					++q;
				}
	}
	return OK;
}

void main(){
	TSMatrix M;

	TSMatrix T;
	//M= (TSMatrix *)malloc(sizeof(TSMatrix));   //建立一個稀疏矩陣a
	CreateSMatrix(&M);
	PrintSMatrix(&M);

	TransposeSMatrix(&M,&T);

	PrintSMatrix(&T);

}

一般矩陣的轉置演算法為:

  for(col=1;col<=nu;col++)

       for(row=1;row<=mu;row++)

              T[col][row]=M[row][col];

其時間複雜度為 O(mu*nu);

----------------------------------------------------------------------------------------------------------------

//採用三元組順序表儲存表示,求稀疏矩陣M的轉置矩陣T(快速轉置)
Status FastTransposeSMatrix(const TSMatrix *M,TSMatrix *T){
	int col,t,p,q,*num,*cpot;
	T->mu=M->nu; T->nu=M->mu; T->tu=M->tu;
	if(T->tu){
		num=(int *)malloc(M->tu*sizeof(int));
		cpot=(int *)malloc(M->tu*sizeof(int));
	

    	for(col=1;col<=M->nu;col++)
	    	num[col]=0;

    	//求M中每一列含有非零元素個數
    	for(t=1;t<=M->tu;t++)
	    	++num[M->data[t].j];
    	cpot[1]=1;

    	//求第col列中第一個非零元在b.data中的序號
    	for(col=2;col<=M->nu;col++)   //表示這個列的會增加
	    	cpot[col]=cpot[col-1]+num[col-1]; 

    	for(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]++;
		}
	}
	return OK;
}