数据结构三元组完成版

#include

#include

typedef int ElemType;

// 稀疏矩阵的三元组顺序表存储表示

#define MAXSIZE 100 // 非零元个数的最大值

typedef struct

{

int i,j; // 行下标,列下标

ElemType e; // 非零元素值

}Triple;

typedef struct

{

Triple data[MAXSIZE+1]; // 非零元三元组表,data[0]未用

int mu,nu,tu; // 矩阵的行数、列数和非零元个数

}TSMatrix;

// 创建稀疏矩阵M

int CreateSMatrix(TSMatrix *M)

{

int i,m,n;

ElemType e;

int k;

printf("请输入矩阵的行数,列数,非零元素个数:(逗号)\n");

scanf("%d,%d,%d",&(*M).mu,&(*M).nu,&(*M).tu);

(*M).data[0].i=0; // 为以下比较顺序做准备

for(i = 1; i

{

do

{

printf("请按行序顺序输入第%d个非零元素所在的行(1~%d)," "列(1~%d),元素值:(逗号)\n", i,(*M).mu,(*M).nu);

scanf("%d,%d,%d",&m,&n,&e);

k=0;

// 行或列超出范围

if(m (*M).mu || n (*M).nu)

k=1;

if(m

&& n

k=1;

}while(k);

(*M).data[i].i = m; //行下标

(*M).data[i].j = n; //列下标

(*M).data[i].e = e; //该下标所对应的值

}

return 1;

}

// 销毁稀疏矩阵M,所有元素置空

void DestroySMatrix(TSMatrix *M)

{

(*M).mu=0;

(*M).nu=0;

(*M).tu=0;

}

// 输出稀疏矩阵M

void PrintSMatrix(TSMatrix M)

{

int i;

printf("\n%d行%d列%d个非零元素。\n",M.mu,M.nu,M.tu);

printf("%4s%4s%8s\n", "行", "列", "元素值");

for(i=1;i

printf("%4d%4d%8d\n",M.data[i].i,M.data[i].j,M.data[i].e);

}

// 由稀疏矩阵M复制得到T

int CopySMatrix(TSMatrix M,TSMatrix *T)

{

(*T)=M;

return 1;

}

// AddSMatrix函数要用到

int comp(int c1,int c2)

{

int i;

if(c1

i=1;

else if(c1==c2)

i=0;

else

i=-1;

return i;

}

// 求稀疏矩阵的和Q=M+N

int AddSMatrix(TSMatrix M,TSMatrix N,TSMatrix *Q)

{

Triple *Mp,*Me,*Np,*Ne,*Qh,*Qe;

if(M.mu!=N.mu)

return 0;

if(M.nu!=N.nu)

return 0;

(*Q).mu=M.mu;

(*Q).nu=M.nu;

Mp=&M.data[1]; // Mp的初值指向矩阵M的非零元素首地址 Np=&N.data[1]; // Np的初值指向矩阵N的非零元素首地址

Me=&M.data[M.tu]; // Me指向矩阵M的非零元素尾地址

Ne=&N.data[N.tu]; // Ne指向矩阵N的非零元素尾地址

Qh=Qe=(*Q).data; // Qh、Qe的初值指向矩阵Q的非零元素首地址的前一地址 while(Mp

{

Qe++;

switch(comp(Mp->i,Np->i))

{

case 1:

*Qe=*Mp;

Mp++;

break;

case 0:

// M、N矩阵当前非零元素的行相等,继续比较列

switch(comp(Mp->j,Np->j))

{

case 1:

*Qe=*Mp;

Mp++;

break;

case 0:

*Qe=*Mp;

Qe->e+=Np->e;

if(!Qe->e) // 元素值为0,不存入压缩矩阵

Qe--;

Mp++;

Np++;

break;

case -1:

*Qe=*Np;

Np++;

}

break;

case -1:

*Qe=*Np;

Np++;

}

}

if(Mp>Me) // 矩阵M的元素全部处理完毕

while(Np

{

Qe++;

*Qe=*Np;

Np++;

}

if(Np>Ne) // 矩阵N的元素全部处理完毕

while(Mp

{

Qe++;

*Qe=*Mp;

Mp++;

}

(*Q).tu=Qe-Qh; // 矩阵Q的非零元素个数

return 1;

}

// 求稀疏矩阵的乘积Q=M*N

int MultSMatrix(TSMatrix M,TSMatrix N,TSMatrix *Q)

{

int i,j,h=M.mu,l=N.nu,Qn=0;

// h,l分别为矩阵Q的行、列值,Qn为矩阵Q的非零元素个数,初值为0 ElemType *Qe;

if(M.nu!=N.mu)

return 0;

(*Q).mu=M.mu;

(*Q).nu=N.nu;

Qe=(ElemType *)malloc(h*l*sizeof(ElemType)); // Qe为矩阵Q的临时数组 // 矩阵Q的第i行j列的元素值存于*(Qe+(i-1)*l+j-1)中,初值为0 for(i=0;i

*(Qe+i)=0; // 赋初值0

for(i=1;i

if(M.data[i].j==N.data[j].i)

*(Qe+(M.data[i].i-1)*l+N.data[j].j-1) += M.data[i].e * N.data[j].e;

for(i=1;i

for(j=1;j

if(*(Qe+(i-1)*l+j-1)!=0)

{

Qn++;

(*Q).data[Qn].e=*(Qe+(i-1)*l+j-1); (*Q).data[Qn].i=i;

(*Q).data[Qn].j=j;

}

free(Qe);

(*Q).tu=Qn;

return 1;

}

// 按位查找法

// 求稀疏矩阵M的转置矩阵T。

int TransposeSMatrix(TSMatrix M,TSMatrix *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

{

(*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 1;

}

int main()

{

TSMatrix A,B,C,D,E;

printf("创建矩阵A: "); CreateSMatrix(&A); PrintSMatrix(A);

printf("创建矩阵B: "); CreateSMatrix(&B); PrintSMatrix(B);

printf("矩阵C(A+B): "); AddSMatrix(A,B,&C); PrintSMatrix(C);

printf("矩阵D(A*B)"); MultSMatrix(A,B,&D); PrintSMatrix(D);

printf("矩阵的转置(A):"); TransposeSMatrix(A,&E); PrintSMatrix(E); return 0;}

#include

#include

typedef int ElemType;

// 稀疏矩阵的三元组顺序表存储表示

#define MAXSIZE 100 // 非零元个数的最大值

typedef struct

{

int i,j; // 行下标,列下标

ElemType e; // 非零元素值

}Triple;

typedef struct

{

Triple data[MAXSIZE+1]; // 非零元三元组表,data[0]未用

int mu,nu,tu; // 矩阵的行数、列数和非零元个数

}TSMatrix;

// 创建稀疏矩阵M

int CreateSMatrix(TSMatrix *M)

{

int i,m,n;

ElemType e;

int k;

printf("请输入矩阵的行数,列数,非零元素个数:(逗号)\n");

scanf("%d,%d,%d",&(*M).mu,&(*M).nu,&(*M).tu);

(*M).data[0].i=0; // 为以下比较顺序做准备

for(i = 1; i

{

do

{

printf("请按行序顺序输入第%d个非零元素所在的行(1~%d)," "列(1~%d),元素值:(逗号)\n", i,(*M).mu,(*M).nu);

scanf("%d,%d,%d",&m,&n,&e);

k=0;

// 行或列超出范围

if(m (*M).mu || n (*M).nu)

k=1;

if(m

&& n

k=1;

}while(k);

(*M).data[i].i = m; //行下标

(*M).data[i].j = n; //列下标

(*M).data[i].e = e; //该下标所对应的值

}

return 1;

}

// 销毁稀疏矩阵M,所有元素置空

void DestroySMatrix(TSMatrix *M)

{

(*M).mu=0;

(*M).nu=0;

(*M).tu=0;

}

// 输出稀疏矩阵M

void PrintSMatrix(TSMatrix M)

{

int i;

printf("\n%d行%d列%d个非零元素。\n",M.mu,M.nu,M.tu);

printf("%4s%4s%8s\n", "行", "列", "元素值");

for(i=1;i

printf("%4d%4d%8d\n",M.data[i].i,M.data[i].j,M.data[i].e);

}

// 由稀疏矩阵M复制得到T

int CopySMatrix(TSMatrix M,TSMatrix *T)

{

(*T)=M;

return 1;

}

// AddSMatrix函数要用到

int comp(int c1,int c2)

{

int i;

if(c1

i=1;

else if(c1==c2)

i=0;

else

i=-1;

return i;

}

// 求稀疏矩阵的和Q=M+N

int AddSMatrix(TSMatrix M,TSMatrix N,TSMatrix *Q)

{

Triple *Mp,*Me,*Np,*Ne,*Qh,*Qe;

if(M.mu!=N.mu)

return 0;

if(M.nu!=N.nu)

return 0;

(*Q).mu=M.mu;

(*Q).nu=M.nu;

Mp=&M.data[1]; // Mp的初值指向矩阵M的非零元素首地址 Np=&N.data[1]; // Np的初值指向矩阵N的非零元素首地址

Me=&M.data[M.tu]; // Me指向矩阵M的非零元素尾地址

Ne=&N.data[N.tu]; // Ne指向矩阵N的非零元素尾地址

Qh=Qe=(*Q).data; // Qh、Qe的初值指向矩阵Q的非零元素首地址的前一地址 while(Mp

{

Qe++;

switch(comp(Mp->i,Np->i))

{

case 1:

*Qe=*Mp;

Mp++;

break;

case 0:

// M、N矩阵当前非零元素的行相等,继续比较列

switch(comp(Mp->j,Np->j))

{

case 1:

*Qe=*Mp;

Mp++;

break;

case 0:

*Qe=*Mp;

Qe->e+=Np->e;

if(!Qe->e) // 元素值为0,不存入压缩矩阵

Qe--;

Mp++;

Np++;

break;

case -1:

*Qe=*Np;

Np++;

}

break;

case -1:

*Qe=*Np;

Np++;

}

}

if(Mp>Me) // 矩阵M的元素全部处理完毕

while(Np

{

Qe++;

*Qe=*Np;

Np++;

}

if(Np>Ne) // 矩阵N的元素全部处理完毕

while(Mp

{

Qe++;

*Qe=*Mp;

Mp++;

}

(*Q).tu=Qe-Qh; // 矩阵Q的非零元素个数

return 1;

}

// 求稀疏矩阵的乘积Q=M*N

int MultSMatrix(TSMatrix M,TSMatrix N,TSMatrix *Q)

{

int i,j,h=M.mu,l=N.nu,Qn=0;

// h,l分别为矩阵Q的行、列值,Qn为矩阵Q的非零元素个数,初值为0 ElemType *Qe;

if(M.nu!=N.mu)

return 0;

(*Q).mu=M.mu;

(*Q).nu=N.nu;

Qe=(ElemType *)malloc(h*l*sizeof(ElemType)); // Qe为矩阵Q的临时数组 // 矩阵Q的第i行j列的元素值存于*(Qe+(i-1)*l+j-1)中,初值为0 for(i=0;i

*(Qe+i)=0; // 赋初值0

for(i=1;i

if(M.data[i].j==N.data[j].i)

*(Qe+(M.data[i].i-1)*l+N.data[j].j-1) += M.data[i].e * N.data[j].e;

for(i=1;i

for(j=1;j

if(*(Qe+(i-1)*l+j-1)!=0)

{

Qn++;

(*Q).data[Qn].e=*(Qe+(i-1)*l+j-1); (*Q).data[Qn].i=i;

(*Q).data[Qn].j=j;

}

free(Qe);

(*Q).tu=Qn;

return 1;

}

// 按位查找法

// 求稀疏矩阵M的转置矩阵T。

int TransposeSMatrix(TSMatrix M,TSMatrix *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

{

(*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 1;

}

int main()

{

TSMatrix A,B,C,D,E;

printf("创建矩阵A: "); CreateSMatrix(&A); PrintSMatrix(A);

printf("创建矩阵B: "); CreateSMatrix(&B); PrintSMatrix(B);

printf("矩阵C(A+B): "); AddSMatrix(A,B,&C); PrintSMatrix(C);

printf("矩阵D(A*B)"); MultSMatrix(A,B,&D); PrintSMatrix(D);

printf("矩阵的转置(A):"); TransposeSMatrix(A,&E); PrintSMatrix(E); return 0;}


相关文章

  • 北京:三元桥换新记
  • 2015 年10 月27 日,北京,三元桥( 跨京顺路桥) 大修工程正式启动 2015年11月15日18时,三元桥完成换梁"手术". 一个每天骑车经过三元桥上下班的网友,事后用一个词来形容这次施工:神不知鬼不觉.这座地处 ...查看


  • 锂电池正极材料行业调研报告
  • 锂电池正极材料行业调研报告 二〇一六年七月 目 录 一.锂电池正极材料技术发展现状及趋势 .............................. 2 (一)锂电池正极材料主要技术路线.......................... ...查看


  • 三元乙丙橡胶防水卷材施工方案
  • 三元乙丙橡胶防水卷材施工方案 (一) 基层处理 1. 砂浆或混凝土找平层应抹平压光,表面应坚实并充分干燥,不得有凹凸.松动.鼓包.起皮.裂缝.麻面等现象,用2M直尺检查基层表面平整度,偏差不得超过5MM. 2. 屋面排水坡度应符合国家标准& ...查看


  • 数据结构课程设计(稀疏矩阵运算器)
  • *****大学 数据结构课程设计说明书 题 目:稀疏矩阵运算器学生姓名:学 号:专 业:班 级:指导教师: 2013 年 7 月 24日 稀疏矩阵运算器 摘 要 摘要:设计一稀疏矩阵运算器.实现两个矩阵的相加.相减和相乘的功能.用" ...查看


  • 手性硫叶立德在不对称三元环化合物合成中的应用
  • 第33 卷第5 期2015年9月佛山科学技术学院学报(自然科学版) Journal of Foshan University (Natural Sciences Edition)Vol. 33 No. 5 Sep. 2015 文章编号:10 ...查看


  • 养猪分析的前景
  • 养猪企划书 鉴于了解新闻,国家的政治动态,以及现在社会对于养猪业的投资趋之若鹜的现象,生猪的价格的下降的趋势一直存在.从2011年9月开始,猪肉的价格下跌,一直到春节的时候在有所回升,但是现在由于玉米的价格上涨,间接导致了,饲料的成本的增加 ...查看


  • 2014年三明市三元区属事业单位面试名单
  • 2014年三明市三元区属事业单位面试名单 2014年三明市三元区属事业单位面试名单将在三元区政府门户网公布,三明华图教育网也将在第一时间为考生提供2014年三明市三元区属事业单位招聘面试名单.面试时间以及面试公告等相关考试信息,敬请关注.本 ...查看


  • "十三五"重点项目-三元丁橡胶防水卷材项目申请报告
  • "十三五"重点项目-三元丁橡胶防 水卷材项目申请报告 编制单位: 根据国家发改委规定,凡是被纳入<政府核准的投资项目目录>项目投资申报时必须编写项目申请报告.项目申请报告是针对企业固定资产投资核准制而规定的一 ...查看


  • 数据结构----稀疏矩阵运算器课程设计
  • 内蒙古科技大学 数据结构课程设计说明书 题 目:稀疏矩阵运算器设计 学生姓名: 学 号: 专 业:计算机科学与技术 班 级:计09-1班 指导教师:刘 月 峰 2011 年 6 月 24 日 稀疏矩阵运算器设计 摘 要 摘要:设计一稀疏矩阵 ...查看


热门内容