三元组表示稀疏矩阵的转置(一般算法和快速算法)(3)

2019-08-29 00:44

图5——11

用户输入1,再次出现如图5——1(主菜单)所示,提示继续输入,继续执行稀疏矩阵的转置操作。输入0则结束操作。

六、源程序清单

#include #include #include #include #define OK 1

#define ERROR 0

#define OVERFLOW 0 #define MAXSIZE 100 #define MAXRC 100 typedef int ElemType; typedef struct { int i,j; ElemType e; }Triple;

typedef struct {

Triple data[MAXSIZE+1]; //非零元三元组

int rpos[MAXRC+1]; //各行第一个非零元的位置表 int mu,nu,tu; //矩阵的行数、列数和非零元个数

}RLSMatrix;

CreateSMatrix(RLSMatrix &M) //创建稀疏矩阵M {

int i,m,n; ElemType e;

int k,j;

printf(\输入矩阵的行数、列数、非零元的个数:\scanf(\M.data[0].i=0; for(i=1;i<=M.tu;i++) { j=0;

11

do {

j++;

if(j>3) //控制跳出死循环 {

printf(\本次输入失败!\return ERROR;

}

printf(\按行序输入第%d个非零元素所在的行(1~%d)列(1~%d)值:scanf(\k=0;

if(m<1||m>M.mu||n<1||n>M.nu) //行或列超出范围 k=1; if(m

\

}while(k); M.data[i].i=m; M.data[i].j=n; M.data[i].e=e;

} //end for

printf(\ return(OK); }

void DestroySMatrix(RLSMatrix &M) //销毁稀疏矩阵M {

M.mu=0;

M.nu=0; M.tu=0; }

void PrinRLSMatrix(RLSMatrix M) //遍历稀疏矩阵 M {

int i;

printf(\稀疏矩阵对应的三元组表为:\\n\\n\printf(\行 列 元素值、\\n\\n\for(i=1;i<=M.tu;i++)

printf(\

printf(\}

void print(RLSMatrix A) //打印矩阵函数,以通常形式输出矩阵 {

int k=1,a,b;

printf(\稀疏矩阵的通常形式为:\\n\

int M[MAXSIZE][MAXSIZE];

12

for(a=0;a

for(a=0;a

printf(\ | \

for(b=0;b

M[A.data[k].i-1][A.data[k].j-1]=A.data[k].e; k++;

for(b=0;b

while(k<=A.tu)

}

}

void showtip() //菜单 {

printf(\ ********************请选择要执行的操作

&

1

********************\\n\\n\ printf(\

采用一般算法实现

&\\n\ printf(\ & 2 采用快速转置的算法实现 &\\n\ printf(\ & 3 同时采用两种算法,先显示一般算法,再显示快速算法 &\\n\ printf(\

**********************************************************\\n\\n\}

////头文件结束

TransposeSMatrix(RLSMatrix M,RLSMatrix &T) //求稀疏矩阵M的转置矩阵T(一般算法) {

int p,q,col; 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)

13

{ 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; }

FastTransposeSMatrix(RLSMatrix M,RLSMatrix &T) { int p,q,t,col,*num,*cpot;

num=(int*)malloc((M.nu+1)*sizeof(int)); cpot=(int*)malloc((M.nu+1)*sizeof(int)); T.mu=M.nu; T.nu=M.mu; T.tu=M.tu; if(T.tu) { 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]; printf(\辅助数组的值为:\\n\ printf(\列号:\ for(t=1;t<=M.nu;++t) printf(\ printf(\ printf(\

for(t=1;t<=M.nu;++t) printf(\ printf(\ printf(\ for(t=1;t<=M.nu;++t) printf(\ printf(\ for(p=1;p<=M.tu;++p) { col=M.data[p].j; q=cpot[col];

T.data[q].i=M.data[p].j;

14

//快速转置算法

} {

}

}

T.data[q].j=M.data[p].i; T.data[q].e=M.data[p].e; ++cpot[col];

free(num); free(cpot); return OK;

void main()

int result; int j;

RLSMatrix A,B;

//************************************************ COORD Co={0,0};DWORD Write; SetConsoleTitle(\稀疏矩阵的转置\\n\

HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);

SetConsoleTextAttribute(hOut,FOREGROUND_RED|FOREGROUND_BLUE|FOREGROFillConsoleOutputAttribute(hOut,FOREGROUND_RED|FOREGROUND_BLUE|FOREGR

UND_INTENSITY);

OUND_INTENSITY,100000000,Co,&Write); ///windows的API函数,用来设置控制台标题

do {

showtip(); //调用菜单函数 int i;

scanf(\ switch(i)

{

case 1: printf(\创建矩阵A:\ if((result=CreateSMatrix(A))==0)

exit(ERROR); PrinRLSMatrix(A);

printf(\求A的转置矩阵B(一般算法):\\n\TransposeSMatrix(A,B); PrinRLSMatrix(B); print(B);

DestroySMatrix(B);

printf(\

case 2: printf(\创建矩阵A:\

15


三元组表示稀疏矩阵的转置(一般算法和快速算法)(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:企业并购目标企业价值评估方法研究 —以吉利并购沃尔沃公司为例

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: