第五章 陣列和廣義表(3)三元組矩陣轉換
阿新 • • 發佈:2019-02-03
#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; }