您的位置:首页 > 其它

第五章 数组和广义表(3)三元组矩阵转换

2018-02-08 13:46 537 查看
#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;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐