稀疏矩阵快速转置

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

题目:假设稀疏矩阵A采用三元组表表示,编写程序实现该矩阵的快速转置

要求:输入一个稀疏矩阵A,由程序将其转换成三元组表存储;转置后的三元组表,由程序将其转换成矩阵形式后输出。

一、需求分析

1.用户可以根据自己的需求输入任意一个稀疏矩阵,通过程序将其转换成三元组存储方式;

2.并且能够完成矩阵的转置功能,要求需要使用的方法是快速转置的方法。

3.最后要够显示原矩阵和转置后的矩阵让用户能进行比较。

4.程序执行的命令包括:

(1)构造稀疏矩阵M (2)求转转矩阵T (3)显示(打印)矩阵

二、概要设计

⒈为实现上述算法,需要线性表的抽象数据类型:

ADT SparseMatrix {

数据对象:D={a

ij :|a

ij

∈TermSet,i=1…m,m≥0,j=1…n,n≥0 m和n分别成为矩阵的行数和列数 }

数据关系:R={Row,Col}

Row ={

i,j ,a

i,j+1

>|1≤i≤m,1≤j≤n-1 }

Col ={

i,j ,a

i+1,j

>|1≤i≤m-1,1≤j≤n }

基本操作:

CreateSMtrix(& M)

操作结果:创建稀疏矩阵M。

DestroySMaix(&M)

初始条件:稀疏矩阵M已存在。

操作结果:销毁稀疏矩阵M。

PrintSMatrix(L)

初始条件:稀疏矩阵M已经存在。

操作结果:输出稀疏矩阵M。

CopySMatrix(M,&T)

初始条件:稀疏矩阵M已经存在。

操作结果:由稀疏矩阵M复制得到T。

TransposeSMatrix(M,&T)

初始条件:稀疏矩阵M已经存在。

操作结果:求稀疏矩阵M的转转矩阵T。

}ADT SparseMatrix

2. 本程序有三个模块:

⑴主程序模块

main(){

初始化;

{

接受命令;

显示结果;

⑵矩阵压缩存储单元模块:实现链表抽象数据类型操作,即函数的定义模块;

三、详细设计

⒈元素类型,结点类型

typedef struct {

int i,j;

int e;

}Triple;

typedef struct{

Triple data[MAXSIZE+1];

int mu,nu,tu;

} Tsmatrix;

2.对抽象数据类型中的部分基本操作的伪码算法如下:

Tsmatrix * creatarray(Tsmatrix *M)

{ int m,n,p=1;

int c;

printf("please input the array A:\n");

for(m=1;m<=a;m++)

for(n=1;n<=b;n++)

{ scanf("%d",&c);

if(c!=0)

{ M->data[p].e=c;

M->data[p].i=m;

M->data[p].j=n;

p++;

}

}

M->tu=p; M->mu=a; M->nu=b;

printf("yuan lai san yuan zu de biao shi wei :\n\n");

for(m=1;m<=M->tu;m++)

printf("%3d%3d%3d\t",M->data[m].i,M->data[m].j,M->data[m].e);

printf("\n");

return M;

}

/*三元组快速转置*/

Tsmatrix * fasttrans(Tsmatrix *M,Tsmatrix *T)

{ int p,col,q,t,m;

int num[100];

int cpot[100];

T->mu=M->nu; T->nu=M->mu; T->tu=M->tu;

if(T->tu!=0)

{

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

for(t=1;t<=M->tu;t++) ++num[M->data[t].j];

cpot[1]=1;

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

}

}

printf("\n\nzhuan zhi hou de san yuan zu biao shi wei :\n\n");

for(m=1;m<=T->tu;m++)

printf("%3d%3d%3d\t",T->data[m].i,T->data[m].j,T->data[m].e);

printf("\n");

return T;

}

/*输出三元组函数*/

void print(Tsmatrix *T,int x,int y)

{ int m,n,p=1;

int d;

for(m=1;m<=x;m++)

{ printf("\n");

for(n=1;n<=y;n++)

{ if(T->data[p].i==m&&T->data[p].j==n)

{ d=T->data[p].e;

p++;

}

else d=0;

printf("%6d",d);

}

}

}

}3.主函数和其他函数的伪码算法

void main()

{ Tsmatrix *M,*T;

M=(Tsmatrix *)malloc(sizeof(Tsmatrix));

T=(Tsmatrix *)malloc(sizeof(Tsmatrix));

printf("please input array's row and col:\n");

scanf("%d%d",&a,&b); /*输入行列数*/

M=creatarray(M); /*创建稀疏矩阵*/

printf("you had creat the array:\n");

print(M,a,b); /*输出创建好的三元组*/

T=fasttrans(M,T); /*将三元组转置*/

printf("the trans array is:\n");

相关文档
最新文档