稀疏矩阵的十字链表加法

稀疏矩阵的十字链表加法
稀疏矩阵的十字链表加法

目录

前言 (1)

正文 (1)

1.课程设计的目的和任务 (1)

2.课程设计报告的要求 (1)

3.课程设计的内容 (2)

4.稀疏矩阵的十字链表存储 (2)

5.稀疏矩阵的加法思想 (4)

6.代码实现 (5)

7.算法实现 (5)

结论 (8)

参考文献 (9)

附录 (10)

前言

采用三元组顺序表存储稀疏矩阵,对于矩阵的加法、乘法等操作,非零元素的插入和删除将会产生大量的数据移动,这时顺序存储方法就十分不便。稀疏矩阵的链接存储结构称为十字链表,它具备链接存储的特点,因此,在非零元素的个数及位置都会发生变化的情况下,采用链式存储结构表示三元组的线性更为恰当。

正文

1.课程设计的目的和任务

(1) 使我我们进一步理解和掌握所学的程序的基本结构。

(2) 使我们初步掌握软件开发过程的各个方法和技能。

(3) 使我们参考有关资料,了解更多的程序设计知识。

(4) 使我们能进行一般软件开发,培养我们的能力并提高我们的知识。

2.课程设计报告的要求

(1)课程设计目的和任务,为了达到什么要求

(2)课程设计报告要求

(3)课程设计的内容,都包含了什么东西

(4)稀疏矩阵和十字链表的基本概念,稀疏矩阵是怎么用十字链表存储

(5)十字链表矩阵的加法

(6)代码实现

(7)算法检测

3.课程设计的内容

(1)根据所学知识并自主查找相关资料 (2)进行算法设计与分析

(3)代码实现,组建并运行结果查看是否正确 (4)书写课程设计说明书

4.稀疏矩阵的十字链表存储

稀疏矩阵是零元素居多的矩阵,对于稀疏矩阵,人们无法给出确切的概念,只要非零元素的个数远远小于矩阵元素的总数,就可认为该矩阵是稀疏的。

十字链表有一个头指针hm ,它指向的结点有五个域,如图1所示。row 域存放总行数m ,col 域存放总列数n ,down 和right 两个指针域空闲不用,next 指针指向第一个行列表头结点。

c o l

r o w

图1 总表点结点

有S 个行列表头结点h[1],h[2],......h[s]。结点结构与总表头结点相同。Row 和col 域置0,next 指向下一行列表头结点,right 指向本行第一个非零元素结点,down 指向本列第一个非零元素结点如图2所示。当最后一个行列表头结点的next 域指向总表头结点的hm 时,就形成循环链表,见图4的第一行。

Next

down

right

图2 行列表头结点

Next

down

right

图3 非零元素结点

????

???

?

????????--=3000

00000002

01007003A 图4 稀疏矩阵

非零元素结点结构也有五个域,与其他结点域结构相似,只有next 域为一变体域,可为val 域存放非零元素的值,row 和col 存放行下标值和列下标值,right 指向本行的下一个非零元素结点,down 指向本列的下一个非零元素结点。稀疏矩阵中同一行的非零元素通过向右域right ,链接成一个带头结点的循环链表。同一列的非零元素也通过向下域down 。链接成一个带头结点的循环链表。因此,每一个非零元素即是第i 行循环链表中的一个结点,又是第j 列循环链表中的一个结点。这好比处于一个十字交叉路口上,故称这样的链表为十

字链表。例如,对于如图4所示的5行4列的稀疏矩阵A的十字链表如图5所示。

如图5可见,每一列链表的表头结点只需要用一个链域,指向该列中第一个非零元素,而每一行链表的表头结点只需right链域,指向该行中第一个非零元素,恰好他们的row和col域又同时为0,故这两组的表头结点可以合用(即第i行链表和第j列链表共用一个表头结点)这些表头结点本身又可以通过val域相链接(注意:val域在表头结点中为next域,是指向下一个表头结点的链域),加上附加结点(由指针hm指示),又组成一个带表头结点的循环链。Hm所指结点为整个十字链表的表头结点,其row和col域的值分别为稀疏矩阵的行数和列数,hm为头指针。由此,只要给定hm指针值,便可取得整个稀疏矩阵的全部信息。

图5 稀疏矩阵A的十字链表

5.稀疏矩阵的加法思想

如果运用带行指针向量和带列指针向量的存储结构进行系数矩阵的加法运算,设M和N是两个加法矩阵,Q是和矩阵,也就是结果矩阵。M和N矩阵可以相加的前提条件是:M 和N矩阵是一样的,也就是说行数和列数的个数相同,M和N相加的结果矩阵就是一个一样大小的矩阵。结果矩阵中每个行单链表也还是需要列号有序,它是对M和N中对应行单链表的按列号有序的合并结果。当M和N中相应的行单链表的两个结点分别是一样的行号

和列号时,如果他们的元素之和为0,就不在结果矩阵中建立结点,只有当元素的和不为0或者列号不一样时,才需要在结果矩阵中建立结点。如果,M矩阵扫描完,N矩阵还没有扫描完,这个时候,直接就将N矩阵中的剩余的结点插入结果矩阵中。

6.代码实现

矩阵中的元素在最后运行的时候由用户自己定义,根据用户输入的稀疏矩阵的行数、列数和非零元个数。知道稀疏矩阵多少行、多少列以及有多少个非零元,然后依据非零元个数,输入非零元,仍然需要用户自己输入行号、列号以及非零值。

如果输入行数、列数和非零元个数为:

5 4 3

就表示这是一个5行4列3个非零元的稀疏矩阵

用户自己输入行号、列号以及非零值,如:

2 3 5

3 3 3

5 2 1

表示第一个非零元在第2行,第3列,值为5;第二个非零元在第3行,第3列,值为3;第三个非零元在第5行,第2列,值为1。

所以此稀疏矩阵为:

00 0 0

0 0 5 0

00 3 0

0 0 0 0

0 1 0 0

再用同样的方法输入一个一样的5行4列的稀疏矩阵,设定行号、列号以及非零元值,利用稀疏矩阵的加法思想,将两个稀疏矩阵加起来得到结果矩阵。

7.算法实现

运行开始界面,界面显示输入行数、列数和非零元素个数

输入:3 3 3

说明这个稀疏矩阵是三行、三列、三个非零元素,然后回车,界面再显示请输入一个非零元三元组

输入三元组:1 1 1

说明在第一行、第一列的非零值是1,回车,界面显示输入一个非零元三元组

按照上面的程序再依次输入:2 2 2

3 1 5

矩阵A就完成了,然后界面得到稀疏矩阵A

然后界面提示请输入行数、列数和非零元个数依照矩阵A的程序模式输入:3 3 4

1 1 2

2 1 1

3 1 1

3 3 3

矩阵B也就完成了,然后界面得到稀疏矩阵B

同时界面上也显示A+B=得到的结果矩阵

结论

M和N矩阵可以相加的前提条件是:M和N矩阵是一样的,也就是说行数和列数的个数相同,M和N相加的结果矩阵就是一个一样大小的矩阵。结果矩阵中每个行单链表也还是需要列号有序,它是对M和N中对应行单链表的按列号有序的合并结果。当M和N中相应的行单链表的两个结点分别是一样的行号和列号时,如果他们的元素之和为0,就不在结果矩阵中建立结点,只有当元素的和不为0或者列号不一样时,才需要在结果矩阵中建立结点。

参考文献

[1]谭浩强编著.C++课程设计.北京:清华大学社,2004

[2]S.B.Lippman,https://www.360docs.net/doc/139422706.html,joie著.潘爱民译.C++Primer(3rd Edition)中文版.北京:中国电力出版社,2002

[3]H.M.Deitel,Paul James Deitel著.薛万鹏译.C++程序设计教程.北京:机械工业出版社,2000

[4]Stephen R.Savis著.C++ For Dummies 4th edition,IDG Books Worldwide,Inc.,2002

[5]Harvey M.Deitel .Jack W.Davidson著.邱仲潘译.C++大学教程(第二版).北京:电子工业出版社,2002

[6]James P.Cohoon.Jack W.Davidson著.刘瑞挺等译.C++程序设计(第三版).北京:电子工业出版社

[7]Decoder编著.C/C++程序设计.北京:中国铁道出版社,2002

[8]Brian Overland著.董梁等译.C++语言命令译解(第二版).北京:机械工业出版社,2002

[9] H.M.Deitel,Paul James Deitel著.薛万鹏译.C/C++程序设计大全.北京:机械工业出版社.1997

[10]Al Strevens,Clayton Walnum著.林丽闽等译.标准C++宝典.北京:电子工业出版社.2001

[11]Michael J.Young著.Mastering Visual C++6.0 Sybex Inc.1999

[12]Leen Ammeraal著.刘瑞挺等译.C++程序设计教程(第三版).北京:zhongguo 铁道出版社,2003

[13] 吕凤翥著. C++语言程序设计.北方交通大学出版社,2003

[14] 袁启昌著.C++语言程序设计.清华大学出版社,2004

[15] 刘振安,刘燕君,孙忱C++语言课程设计.机械工业出版社,2007

[16] 杨进才,沈显君,刘蓉编.C++语言程序设计教程.清华大学出版社,2006

[17] 宋振会著. C++语言编程基础教程.清华大学出版社,2005

附录

#include

using namespace std;

templateclass MatrixNode;

templateclass LinkMatrix;

templateistream &operator>>(istream &,LinkMatrix&); templateostream &operator<<(ostream &,LinkMatrix&); template

Type>LinkMatrix

operator

+(const

LinkMatrix

&a,const

LinkMatrix &b);

templateclass MatrixNode

{

friend class LinkMatrix;

friend istream&operator>>(istream&,LinkMatrix&);

friend ostream&operator<<(ostream&out, LinkMatrix&);

friend LinkMatrix operator +(const LinkMatrix &a,const Link Matrix

&b);

private:

int row,col;

MatrixNode*right,*down;

union{

Type data;

MatrixNode*next;

};

};

templateclass LinkMatrix

{

private:

MatrixNode *head;

void InsertInCol(MatrixNode*p);

void DeleteInCol(MatrixNode*p);

public:

friend istream&operator>>(istream&in,LinkMatrix&);

friend ostream&operator<<(ostream&out,LinkMatrix&);

MatrixNode* Head(int i);

LinkMatrix&operator +=(const LinkMatrix &a);

friend LinkMatrix operator +(const LinkMatrix &a,const LinkMa trix

&b);

};

template

istream&operator>>(istream&in,LinkMatrix&a)

{

int m,n,terms,s;

MatrixNode**cp,*p,*q;

cout<<"输入矩阵的行数、列数、和非零元素个数"<

in>>m>>n>>terms;

if(n>m)s=n;else s=m;

a.head=new MatrixNode;

a.head->row=m;

a.head->col=n;

a.head->right=a.head->down=NULL;

cp=new MatrixNode*[s+1];

cp[0]=a.head;

int i;

for(i=1;i<=s;i++)

{

p=new MatrixNode;

p->row=p->col=0;

p->right=p->down=p;

cp[i]=p;cp[i-1]->next=p;

}

cp[s]->next=a.head;

for(i=1;i<=terms;i++)

{

cout<<"输入一个非零元三元组(row,col,value)"<

p=new MatrixNode;

in>>p->row>>p->col>>p->data;

q=cp[p->row];

while((q->right!=cp[p->row]&&(q->right->colcol)))q=q->right;

p->right=q->right;

q->right=p;

q=cp[p->col];

while((q->down!=cp[p->row]&&(q->down->colcol)))q=q->down;

p->down=q->down;

q->down=p;

}

delete[]cp;

return in;

}

template MatrixNode* LinkMatrix::Head(int i)

{

MatrixNode*a;

a=head->next;

for(int j=1;j

{

a=a->next;

}

return a;

}

templatevoid LinkMatrix::InsertInCol(MatrixNode*p) {

MatrixNode*pre,*ch=Head(p->col);

pre=ch;

while(pre->down!=ch&&pre->down->rowrow)pre=pre->down;

p->down=pre->down;

pre->down=p;

}

templatevoid LinkMatrix::DeleteInCol(MatrixNode*p) {

MatrixNode*pre,*ch=Head(p->col);

pre=ch;

while(pre->down!=ch&&pre->down!=p)pre=pre->down;

if(pre->down==p)

{

pre->down=p->down;

delete p;

}

//else throw invalid_arguement("No such a Node to be deleted in Delet eInCol()");

}

template //重载符合赋值运算符+=

LinkMatrix&LinkMatrix::operator +=(const LinkMatrix &a) {

MatrixNode *pre,*pa,*h,*ah,*p,*tmp;

if(head->col !=a.head->col||head->row !=a.head->row)//非同型矩阵不可相加cout<<"The two matrice aren't isomorphic!";

//throw domain_error("The two matrice aren't isomorphic!");

h=head->next;ah=a.head->next; //h、ah指向当前处理行的头结点

while(h !=head){ //逐一处理各行

pre=h; p=h->right; //p指向被加矩阵的当前结点,pre指向其前驱

pa=ah->right; //pa分别指向加矩阵的当前结点

while(pa !=ah) { //处理当前行

if(p !=h&&(p->colcol)){ //若被加矩阵的列标更小,则比较下一个

pre=p; p=p->right;

}

else if(p==h||p->col>pa->col){ //若加矩阵的列标更小,则插入

tmp=new MatrixNode(*pa)

pre->right=tmp; //在行链表中插入pa复制结点tmp

tmp->right=p;

InsertInCol(tmp); //在列表中插入tmp

pre=tmp; //当前指针p的前驱变为tmp

pa=pa->right;

}

else { //列标相同,则做加法

p->data +=pa->data;

if(!p->data) { //和为0,则删除之(行、列都要删除)

tmp=p;p=p->right;pre->right=p;//在行链表中将tmp摘下

DeleteInCol(tmp); //在列链表中将tmp删除

}

pre=p;p=p->right;pa=pa->right;

}

}

h=h->next; ah=ah->next; //处理下一行

}

return *this;

}

template //重载加法运算符+

LinkMatrix operator +(const LinkMatrix &a,const LinkMatrix &b){

LinkMatrix c(a); //复制构造函数得到被加矩阵A的一个副本放在矩阵C中

c+=b;return c;

}

template

ostream & operator<<(ostream & out ,LinkMatrix& a) {

for(int i=1;i<=a.head->row;i++)

{

MatrixNode*b=a.Head(i);

b=b->right;

for(int j=1;j<=a.head->col;j++)

{

if(b->row==i&&b->col==j)

{

cout<data<<' ';

b=b->right;

}

else

{

cout<<'0'<<' ';

}

}

cout<

}

return out;

}

int main()

{

LinkMatrixa,b,c;

cin>>a;

cout<<"A矩阵为:\n"<

cin>>b;

cout<<"B矩阵为:\n"<

c=a+b;

cout<<"A+B=\n"<

system("pause");

return 0;

}

实现稀疏矩阵(采用三元组表示)的基本运算实验报告

实现稀疏矩阵(采用三元组表示)的基本运算实验报告 一实验题目: 实现稀疏矩阵(采用三元组表示)的基本运算二实验要求: (1)生成如下两个稀疏矩阵的三元组a 和b;(上机实验指导P92 )(2)输出a 转置矩阵的三元组; (3)输出a + b 的三元组; (4)输出a * b 的三元组; 三实验内容: 3.1 稀疏矩阵的抽象数据类型: ADT SparseMatrix { 数据对象:D={aij| i = 1,2,3,….,m; j =1,2,3,……,n; ai,j∈ElemSet,m和n分别称为矩阵的行数和列数 } 数据关系 : R={ Row , Col } Row ={ | 1≤ i≤m , 1≤ j≤ n-1} Col ={| 1≤i≤m-1,1≤j≤n} 基本操作: CreateSMatrix(&M)

操作结果:创建稀疏矩阵M PrintSMatrix(M) 初始条件:稀疏矩阵M已经存在 操作结果:打印矩阵M DestroySMatrix(&M) 初始条件:稀疏矩阵M已经存在 操作结果:销毁矩阵M CopySMatrix(M, &T) 初始条件:稀疏矩阵M已经存在 操作结果:复制矩阵M到T AddSMatrix(M, N, &Q) 初始条件:稀疏矩阵M、N已经存在 操作结果:求矩阵的和Q=M+N SubSMatrix(M, N, &Q) 初始条件:稀疏矩阵M、N已经存在 操作结果:求矩阵的差Q=M-N TransposeSMatrix(M, & T) 初始条件:稀疏矩阵M已经存在

操作结果:求矩阵M的转置T MultSMatrix(M, N, &Q) 初始条件:稀疏矩阵M已经存在 操作结果:求矩阵的积Q=M*N }ADT SparseMatrix 3.2存储结构的定义 #define N 4 typedef int ElemType; #define MaxSize 100 //矩阵中非零元素最多个数typedef struct { int r; //行号 int c; //列号 ElemType d; //元素值 } TupNode; //三元组定义 typedef struct { int rows; //行数值 int cols; //列数值 int nums; //非零元素个数

采用十字链表表示稀疏矩阵,并实现矩阵的加法运算

课程设计 所抽题目:采用十字链表表示稀疏矩阵,并实现矩阵的加法运算。 要求:要检查有关运算的条件,并对错误的条件产生 报警。 问题分析和建立模型:本题目主要是运用所学知识,用十字链表的方法去表示稀疏矩阵,并使之可以在两矩阵间进行相加。而后,若有错误,则对错误进行警报。 框架搭建: 1选择File|New菜单项,弹出New对话框,选择Files标签,选中C++ Source File项,在File编辑器中输入项目名称“十字链表表示稀疏矩阵实现加法”,在Location编辑框中输入项目所在目录,按下OK 按钮即可。 2在操作界面中输入,程序代码。 (1)结构体和共用体的定义 #include #include #define smax 45 typedef int datatype; typedef struct lnode (2)建立稀疏矩阵的函数,返回十字链表头指针 int i,j; struct lnode *cptr,*rptr; union {

struct lnode *next; datatype v; }uval; }link; int flag=0; 建立十字链表头结点 head=(link *)malloc(sizeof(link)); 建立头结点循环链表 for(i=1;i<=s;i++) (3)插入结点函数 p=(link *)malloc(sizeof(link)); p->i=0;p->j=0; p->rptr=p;p->cptr=p; cp[i]=p; cp[i-1]->uval.next=p; } cp[s]->uval.next=head; for(k=1;k<=t;k++) { printf("\t 第%d个元素(行号i 列号j 值v,数字间用空格分隔):",k); scanf("%d%d%d",&i,&j,&v); p=(link *)malloc(sizeof(link)); p->i=i;p->j=j;p->uval.v=v; q=cp[i]; while((q->rptr!=cp[i])&&(q->rptr->jrptr; p->rptr=q->rptr; q->rptr=p; q=cp[j]; while((q->cptr!=cp[j])&&(q->cptr->icptr; p->cptr=q->cptr; q->cptr=p; } return head; (4)输出十字链表的函数 link *p,*q; p=(link *)malloc(sizeof(link)); p->i=i;p->j=j;p->uval.v=v; q=cp[i];

矩阵转置及相加实验报告

一、实验内容和要求 1、稀疏矩阵A,B均采用三元组表示,验证实现矩阵A快速转置算法,设计并验证A,B相 加得到矩阵C的算法。 (1)从键盘输入矩阵的行数和列数,随机生成稀疏矩阵。 (2)设计算法将随机生成的稀疏矩阵转换成三元组顺序表示形式存储。 (3)设计算法将快速转置得到的与相加得到的三元组顺序表分别转换成矩阵形式。 (4)输出随机生成的稀疏矩阵A,B及其三元组顺序表、快速转置得到的与相加得到的三元组顺序表及其矩阵形式。 二、实验过程及结果 一、需求分析 1、将随机生成的数定义为int型(为方便起见设定范围为-20至20(不含0),可 修改),三元组存储的元素分别为非零元的行下标、列下标及该位置的元素值,零元不进行存储。实际上在生成稀疏矩阵时是随机选取一些位置生成非零元然后存入三元组中。 2、从键盘输入矩阵的行数和列数后应能输出三元组顺序表及相应矩阵(按行和列 排列形式输出)。 3、程序能实现的功能包括: ①随机产生稀疏矩阵;②输出阵列形式的矩阵;③输出三元组顺序 表;④将矩阵快速转置;⑤将两个稀疏矩阵相加生成新的矩阵。 二、概要设计 1、稀疏矩阵的抽象数据类型定义: ADT TSMatrix{ 数据对象:D={ aij|i=1,2,…,m,j=1,2,…,n; Ai,j∈ElemSet,m和n分别称为矩阵的行数和列数}数据关系:R={Row,Col} Row={|1≤i≤m, 1≤j≤n-1} Col ={|1≤i≤m-1, 1≤j≤n} 基本操作: CreateTSMatrix(&M) 操作结果:创建矩阵M PrintTSMatrix(M) 初始条件:矩阵M已存在 操作结果:输出矩阵M中三元组形式的非零元素 PrintTSMatrix1(M) 初始条件:矩阵M已存在 操作结果:以阵列形式输出矩阵 UnZore(M, row, col) 初始条件:矩阵M已存在 操作结果:若位置(row,col)处存在非零元素,则返回该元素存储在矩阵中的序号

稀疏矩阵的十字链表加法

目录 前言 (1) 正文 (1) 1.课程设计的目的和任务 (1) 2.课程设计报告的要求 (1) 3.课程设计的内容 (2) 4.稀疏矩阵的十字链表存储 (2) 5.稀疏矩阵的加法思想 (4) 6.代码实现 (5) 7.算法实现 (5) 结论 (8) 参考文献 (9) 附录 (10)

前言 采用三元组顺序表存储稀疏矩阵,对于矩阵的加法、乘法等操作,非零元素的插入和删除将会产生大量的数据移动,这时顺序存储方法就十分不便。稀疏矩阵的链接存储结构称为十字链表,它具备链接存储的特点,因此,在非零元素的个数及位置都会发生变化的情况下,采用链式存储结构表示三元组的线性更为恰当。 正文 1.课程设计的目的和任务 (1) 使我我们进一步理解和掌握所学的程序的基本结构。 (2) 使我们初步掌握软件开发过程的各个方法和技能。 (3) 使我们参考有关资料,了解更多的程序设计知识。 (4) 使我们能进行一般软件开发,培养我们的能力并提高我们的知识。 2.课程设计报告的要求 (1)课程设计目的和任务,为了达到什么要求 (2)课程设计报告要求 (3)课程设计的内容,都包含了什么东西 (4)稀疏矩阵和十字链表的基本概念,稀疏矩阵是怎么用十字链表存储 (5)十字链表矩阵的加法 (6)代码实现 (7)算法检测

3.课程设计的内容 (1)根据所学知识并自主查找相关资料 (2)进行算法设计与分析 (3)代码实现,组建并运行结果查看是否正确 (4)书写课程设计说明书 4.稀疏矩阵的十字链表存储 稀疏矩阵是零元素居多的矩阵,对于稀疏矩阵,人们无法给出确切的概念,只要非零元素的个数远远小于矩阵元素的总数,就可认为该矩阵是稀疏的。 十字链表有一个头指针hm ,它指向的结点有五个域,如图1所示。row 域存放总行数m ,col 域存放总列数n ,down 和right 两个指针域空闲不用,next 指针指向第一个行列表头结点。 c o l r o w 图1 总表点结点 有S 个行列表头结点h[1],h[2],......h[s]。结点结构与总表头结点相同。Row 和col 域置0,next 指向下一行列表头结点,right 指向本行第一个非零元素结点,down 指向本列第一个非零元素结点如图2所示。当最后一个行列表头结点的next 域指向总表头结点的hm 时,就形成循环链表,见图4的第一行。

数据结构实验报告稀疏矩阵运算

教学单位计算机科学与技术 学生学号 5 数据结构 课程设计报告书 题目稀疏矩阵运算器 学生豹 专业名称软件工程 指导教师志敏

实验目的:深入研究数组的存储表示和实现技术,熟悉广义表存储结构的特性。 需要分析:稀疏矩阵是指那些多数元素为零的矩阵。利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。实现一个能进行稀疏矩阵基本运算的运算器。要求以带“行逻辑信息”的三元组顺序表存储稀疏矩阵,实现两矩阵的相加、相减、相乘等运算。输入以三元组表示,输出以通常的阵列形式列出。 软件平台:Windows 2000,Visual C++ 6.0或WINTC 概要设计:ADT Array { 数据对象: D = {aij | 0≤i≤b1-1, 0 ≤j≤b2-1} 数据关系: R = { ROW, COL } ROW = {| 0≤i≤b1-2, 0≤j≤b2-1} COL = {| 0≤i≤b1-1, 0≤ j≤b2-2} 基本操作: CreateSMatrix(&M); //操作结果:创建稀疏矩阵M. Print SMatrix(M); //初始化条件: 稀疏矩阵M存在. //操作结果:输出稀疏矩阵M. AddSMatrix(M,N,&Q); //初始化条件: 稀疏矩阵M与N的行数和列数对应相等. //操作结果:求稀疏矩阵的和Q=M+N. SubSMatrix(M,N,&Q); //初始化条件: 稀疏矩阵M与N的行数和列数对应相等. //操作结果:求稀疏矩阵的差Q=M-N. MultSMatrix(M,N,&Q); //初始化条件: 稀疏矩阵M的列数等于N的行数. //操作结果:求稀疏矩阵的乘积Q=M*N. } ADT Array

数据结构稀疏矩阵基本运算实验报告

课程设计 课程:数据结构 题目:稀疏矩阵4 三元组单链表结构体(行数、列数、头) 矩阵运算重载运算符优 班级: 姓名: 学号: 设计时间:2010年1月17日——2010年5月XX日 成绩: 指导教师:楼建华

一、题目 二、概要设计 1.存储结构 typedef struct{ int row,col;//行,列 datatype v;//非0数值 }Node; typedef struct{ Node data[max];//稀疏矩阵 int m,n,t;//m 行,n 列,t 非0数个数 … … 2.基本操作 ⑴istream& operator >>(istream& input,Matrix *A)//输入 ⑵ostream& operator <<(ostream& output,Matrix *A){//输出 ⑶Matrix operator ~(Matrix a,Matrix b)//转置 ⑷Matrix operator +(Matrix a,Matrix b)//加法 ⑸Matrix operator -(Matrix a,Matrix b)//减法 ⑹Matrix operator *(Matrix a,Matrix b)//乘法 ⑺Matrix operator !(Matrix a,Matrix b)//求逆 三、详细设计 (1)存储要点 position[col]=position[col-1]+num[col-1]; 三元组表(row ,col ,v) 稀疏矩阵((行数m ,列数n ,非零元素个数t ),三元组,...,三元组) 1 2 3 4 max-1

数据结构课程设计之稀疏矩阵实现与应用1

数据结构课程设计报告 题目:十字链表成为存储结构,实现稀疏矩阵的求和运算 学生姓名:张旋 班级:软件三班学号:201213040304 指导教师: 吴小平

一、需求分析 1.问题描述: 要求:十字链表下的稀疏矩阵的加、转、乘的实现。 2.基本功能 实现十字链表下的转置,乘法,加法运算。 3.输入输出 (1)设计函数建立稀疏矩阵,初始化值。 (2)设计函数输出稀疏矩阵的值。 (3)构造函数进行两个稀疏矩阵相加,输出最终的稀疏矩阵。 (4)构造函数进行两个稀疏矩阵的相乘,输出最终的稀疏矩阵。 (5)构造函数进行稀疏矩阵的转置,并输出结果。 (6)退出系统。 二、概要设计 1.设计思路: 本实验要求在三元组,十字链表下实现稀疏矩阵的加、转、乘。首先要进行矩阵的初始化操作,定义三元组和十字链表的元素对象。写出转置,加法,乘法的操作函数。通过主函数调用实现在一个程序下进行矩阵的运算操作。 2.数据结构设计: 抽象数据类型稀疏矩阵的定义如下: ADT SparseMatrix{ 数据对象:D={aij | i=1,2,…,m; j=1,2,..,n; aij∈Elemset, m和n分别称为矩阵的行数和列数。} 数据关系:R={Row,Col} Row={ | 1<=i<=m, 1<=j<=n-1} Col= { | 1<=i<=m-1, 1<=j<=n} 基本操作: CreateSMatrix(&M); 操作结果:创建稀疏矩阵M。 DestroySMatrix(&M); 初始条件:稀疏矩阵M存在。操作结果:销毁稀疏矩阵M。 PrintSMatrix(M); 初始条件:稀疏矩阵M存在。操作结果:输出稀疏矩阵M。 AddSMatrix(M,N,&Q); 初始条件:稀疏矩阵M与N的行数和列数对应相等操作结果:求稀疏矩阵的和Q=M+N。 MultSMatrix(M,N,&Q); 初始条件:稀疏矩阵M的列数等于N的行数。操作结果:求稀疏矩阵乘积Q=M*N。 TransposeSMatrix(M,&T); 初始条件:稀疏矩阵M存在。操作结果:求稀疏矩阵M的转置矩阵T。 }ADT SparseMatrix 3.软件结构设计:

稀疏矩阵的相加

稀疏矩阵的相加 题目: 稀疏矩阵的相加 1、问题描述 稀疏矩阵是指那些多数元素为零的矩阵。利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。实现一个能进行稀疏矩阵基本运算的运算器。 以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现两个矩阵相加运算。稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则以通常的阵列形式列出。 2、设计 2.1. 存储结构设计 稀疏矩阵的行逻辑连接的顺序表存储结构表示如下: #define MAXSIZE 20 /* 非零元个数最大值*/ 最大值*/#defi ne MAXRC 10 /* 各行第一个非零元总数 typedef struct{ , 列下标*/ int i,j; /* 行下标 int e; /* 非零元值*/ }Triple; typedef struct { /* 行逻辑链接的顺序表*/ Triple data[MAXSIZE+1]; /* 非零元三元组表,data[0] 未用*/ int rpos[MAXRC+1]; /* 各行第一个非零元的位置表*/ int mu,nu,tu; /* 阵的行数、列数和非零元个数*/ }TSMatrix; 2.2. 主要算法设计

对 2 个矩阵相加的算法如下: bool AddSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q) /* 求稀疏矩阵的和Q=M+N*/ { int p=1,q=1,k=1; if(M.tu==0&&N.tu==0) /* 为空矩阵的情况*/ { cout<<" 该矩阵为空矩阵"<N.data[q].i) /*M 的行值比N 的大取N 的值*/ { Q.data[k].i=N.data[q].i; Q.data[k].j=N.data[q].j; Q.data[k].e=N.data[q].e; k++;

数据结构三元组表存储结构实现稀疏矩阵应用课程方案实验报告

高二《数系的扩充与复数的概念》说课稿 高二《数系的扩充与复数的概念》说稿 《数系的扩充与复数的概念》是北师大版普通高中程标准数学实验教材选修1-2第四第一节的内容,大纲时安排一时。主要包括数系概念的发展简介,数系的扩充,复数相关概念、分类、相等条,代数表示和几何意义。 复数的引入是中学阶段数系的又一次扩充,引入复数以后,这不仅可以使学生对于数的概念有一个初步的、完整的认识,也为进一步学习数学打下了基础。通过本节学习,要使学生在问题情境中了解数系扩充的过程以及引入复数的必要性,学习复数的一些基本知识,体会人类理性思维在数系扩充中的作用。 在学习了这节以后,学生首先能知道数系是怎么扩充的,并且这种扩充是必要的,虚数单位公开《数系的扩充与复数的概念》说稿在数系扩充过程中的作用,而复数就是一个实数加上一个实数乘以公开《数系的扩充与复数的概念》说稿。学生能清楚的知道一个复数什么时候是虚数,什么时候是纯虚数,两个复数相等的充要条是什么。让学生在经历一系列的活动后,完成对知识的探索,变被动地“接受问题”为主动地“发现问题”,加强学生对知识应用的灵活性,深化学生对复数的认识,从而提高分析问题和解决问题的能力。 教学目标为:1.在问题情境中了解数系的扩充过程。体会实际需求与数学内部的矛盾(数的运算规则、方程求根)在数系扩充过程中的

作用,感受人类理性思维的作用以及数与现实世界的联系。. 2.理解复数的有关概念、数系间的关系、和几何表示。 3.掌握复数的分类和复数相等的条。 4体会类比、转化、数形结合思想在数学发现和解决数学问题中的作用。 教学重点为认识i的意义、复数的有关概念以及复数相等的条. 教学难点为复数相关概念的理解和复数的几何意义的理解 复数的概念是整个复数内容的基础,复数的有关概念都是围绕复数的代数表示形式展开的。虚数单位、实部、虚部的命名,复数想等的充要条,以及虚数、纯虚数等概念的理解,都应促进对复数实质的理解,即复数实际上是一有序实数对。类比实数可以用数轴表示,把复数在直角坐标系中表示出,就得到了复数的几何表示,这就把数和形有机的结合了起。 在学习本节的过程中,复数的概念如果单纯地讲解或介绍会显得较为枯燥无味,学生不易接受,教学时,采用讲解已学过的数集的扩充的历史,让学生体会到数系的扩充是生产实践的需要,也是数学学科自身发展的需要;介绍数的概念的发展过程,使学生对数的形成、发展的历史和规律,各种数集中之间的关系有着比较清晰、完整的认识从而让学生积极主动地建构虚数的概念、复数的概念、复数的分类。由于学生对数系扩充的知识不熟悉,对了解实数系扩充到复数系的过程有困难,也就是对虚数单位公开《数系的扩充与复数的概念》说稿的引入难以理解。另外虚数单位公开《数系的扩充与复数的概念》说

实现稀疏矩阵(采用三元组表示)的基本运算实验分析报告

实现稀疏矩阵(采用三元组表示)的基本运算实验报告

————————————————————————————————作者:————————————————————————————————日期: 2

实现稀疏矩阵(采用三元组表示)的基本运算实验报告 一实验题目: 实现稀疏矩阵(采用三元组表示)的基本运算二实验要求: (1)生成如下两个稀疏矩阵的三元组 a 和 b;(上机实验指导 P92 )(2)输出 a 转置矩阵的三元组; (3)输出a + b 的三元组; (4)输出 a * b 的三元组; 三实验内容: 3.1 稀疏矩阵的抽象数据类型: ADT SparseMatrix { 数据对象:D={aij| i = 1,2,3,….,m; j =1,2,3,……,n; ai,j∈ElemSet,m和n分别称为矩阵的行数和列数 } 数据关系 : R={ Row , Col } Row ={ | 1≤ i≤m , 1≤ j≤ n-1} Col ={| 1≤i≤m-1,1≤j≤n} 基本操作: CreateSMatrix(&M) 操作结果:创建稀疏矩阵M PrintSMatrix(M) 初始条件:稀疏矩阵M已经存在 操作结果:打印矩阵M DestroySMatrix(&M) 初始条件:稀疏矩阵M已经存在 操作结果:销毁矩阵M CopySMatrix(M, &T) 初始条件:稀疏矩阵M已经存在 操作结果:复制矩阵M到T AddSMatrix(M, N, &Q) 初始条件:稀疏矩阵M、N已经存在 操作结果:求矩阵的和Q=M+N SubSMatrix(M, N, &Q) 3

稀疏矩阵的运算(完美版)

专业课程设计I报告(2011 / 2012 学年第二学期) 题目稀疏矩阵的转换 专业软件工程 学生姓名张鹏宇 班级学号 09003018 指导教师张卫丰 指导单位计算机学院软件工程系 日期 2012年6月18号

指导教师成绩评定表

附件: 稀疏矩阵的转换 一、课题内容和要求 1.问题描述 设计程序用十字链表实现稀疏矩阵的加、减、乘、转置。 2.需求分析 (1)设计函数建立稀疏矩阵,初始化值。 (2)设计函数输出稀疏矩阵的值。 (3)构造函数进行两个稀疏矩阵相加,输出最终的稀疏矩阵。 (4)构造函数进行两个稀疏矩阵相减,输出最终的稀疏矩阵。 (5)构造函数进行两个稀疏矩阵的相乘,输出最终的稀疏矩阵。 (6)构造函数进行稀疏矩阵的转置,并输出结果。 (7)退出系统。 二、设计思路分析 (1)设计函数建立稀疏矩阵,初始化值。 (2)设计函数输出稀疏矩阵的值。 (3)构造函数进行两个稀疏矩阵相加,输出最终的稀疏矩阵。 (4)构造函数进行两个稀疏矩阵相减,输出最终的稀疏矩阵。 (5)构造函数进行两个稀疏矩阵的相乘,输出最终的稀疏矩阵。 (6)构造函数进行稀疏矩阵的转置,并输出结果。 (7)退出系统。 三、概要设计 为了实现以上功能,可以从3个方面着手设计。 1.主界面设计 为了实现对稀疏矩阵的多种算法功能的管理,首先设计一个含有多个菜单项的主

控菜单子程序以链接系统的各项子功能,方便用户交互式使用本系统。本系统主控菜单运行界面如图所示。 2.存储结构设计 本系统采用单链表结构存储稀疏矩阵的具体信息。其中:全部结点的信息用头结点为指针数组的单链表存储。 3.系统功能设计 本系统除了要完成稀疏矩阵的初始化功能外还设置了4个子功能菜单。稀疏矩阵的初始化由函数i typedef int ElemType 实现。建立稀疏矩阵用void Creat()实现,依据读入的行数和列数以及非零元素的个数,分别设定每个非零元素的信息。4个子功能的设计描述如下。 (1)稀疏矩阵的加法: 此功能由函数void Xiangjia( )实现,当用户选择该功能,系统即提示用户初始化要进行加法的两个矩阵的信息。然后进行加法,最后输出结果。 (2)稀疏矩阵的乘法: 此功能由函数void Xiangcheng( )实现。当用户选择该功能,系统提示输

稀疏矩阵 引用 十字链表 运算

稀疏矩阵应用 摘要本课程设计主要实现在三元组存储结构与十字链表存储结构下输入稀疏矩阵,并对稀疏矩阵进行转置,相加,相乘操作,最后输出运算后的结果。在程序设计中,考虑到方法的难易程度,采用了先用三元组实现稀疏矩阵的输入,输出,及其转置,相加,相乘操作的方法,再在十字链表下实现。程序通过调试运行,结果与预期一样,初步实现了设计目标。 关键词程序设计;稀疏矩阵;三元组;十字链表 1 引言 ?课程设计任务 本课程设计主要实现在三元组存储结构与十字链表存储结构下输入稀疏矩阵,并对稀疏矩阵进行转置,相加,相乘操作,最后输出运算后的结果。稀疏矩阵采用三元组和十字链表表示,并在两种不同的存储结构下,求两个具有相同行列数的稀疏矩阵A和B的相加矩阵C,并输出C;求出A的转置矩阵D,输出D;求两个稀疏矩阵A和B的相乘矩阵E,并输出E。 ?课程设计性质 数据结构课程设计是重要地实践性教学环节。在进行了程序设计语言课和《数据结构》课程教学的基础上,设计实现相关的数据结构经典问题,有助于加深对数据结构课程的认识。本课程设计是数据结构中的一个关于稀疏矩阵的算法的实现,包括在三元组和十字链表下存储稀疏矩阵,并对输入的稀疏矩阵进行转置,相加,相乘等操作,最后把运算结果输出。此课程设计要求对数组存储结构和链表存储结构非常熟悉,并能熟练使用它们。

1.3课程设计目的 其目的是让我们在学习完C、数据结构等课程基础上,掌握多维数组的逻辑结构和存储结构、掌握稀疏矩阵的压缩存储及转置,相加,相乘等基本操作,并用不同的方法输出结果,进一步掌握设计、实现较大系统的完整过程,包括系统分析、编码设计、系统集成、以及调试分析,熟练掌握数据结构的选择、设计、实现以及操作方法,为进一步的应用开发打好基础。 需求分析 2.1设计函数建立稀疏矩阵及初始化值和输出稀疏矩阵的值 本模块要求设计函数建立稀疏矩阵并初始化,包括在三元组结构下和十字链表结构下。首先要定义两种不同的结构体类型,在创建稀疏矩阵时,需要设计两个不同的函数分别在三元组和十字链表下创建稀疏矩阵,在输入出现错误时,能够对错误进行判别处理,初始化稀疏矩阵都为空值,特别注意在十字链表下,对变量进行动态的地址分配。在设计输出稀疏矩阵的值的函数时,也要针对两种不同的情况,分别编制函数,才能准确的输出稀疏矩阵。在对稀疏矩阵进行初始化及输出值时,均只输出非零元素的值和它所在的所在行及所在列。 2.2构造函数进行稀疏矩阵的转置并输出结果 本模块要求设计函数进行稀疏矩阵的转置并输出转置后的结果,由于对稀疏函数的转置只对一个矩阵进行操作,所以实现起来难度不是很大,函数也比较容易编写。在编写函数时,要先定义一个相应的结构体变量用于存放转置后的矩阵,最后把此矩阵输出。 2.3构造函数进行两个稀疏矩阵相加及相乘并输出最终的稀疏矩阵 本模块要求设计相加和相乘函数对两个矩阵进行运算,并输出最终的稀疏矩阵,在进行运算前,要对两个矩阵进行检查,看是不是相同类型的矩阵,因为两个矩阵

稀疏矩阵(实验报告)

《数据结构课程设计》实验报告 一、实验目的: 理解稀疏矩阵的加法运算,掌握稀疏矩阵的存储方法,即顺序存储的方式,利用顺序存储的特点——每一个元素都有一个直接前驱和一个直接后继,完成相关的操作。 二、内容与设计思想: 1、设计思想 1)主界面的设计 定义两个矩阵a= 0 0 3 0 0 0 0 0 b= 0 2 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 7 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 定义两个数组A和B,用于存储矩阵a和矩阵b的值;定义一个数组C,用于存放数组A 和数组B相加后的结果。 2)实现方式 稀疏矩阵的存储比较浪费空间,所以我们可以定义两个数组A、B,采用压缩存储的方式来对上面的两个矩阵进行存储。具体的方法是,将非零元素的值和它所在的行号、列号作为一个结点存放在一起,这就唯一确定一个非零元素的三元组(i、j、v)。将表示稀疏矩阵的非零元素的三元组按行优先的顺序排列,则得到一个其结点均为三元组的线性表。即:以一维数组顺序存放非零元素的行号、列号和数值,行号-1作为结束标志。例如,上面的矩阵a,利用数组A存储后内容为: A[0]=0,A[1]=2, A[2]=3, A[3]=1, A[4]=6, A[5]=5, A[6]=3, A[7]=4, A[8]=7, A[9]=5, A[10]=1, A[11]=9, A[12]=-1 同理,用数组B存储矩阵b的值。 2、主要数据结构 稀疏矩阵的转存算法: void CreateMatrix(int A[m][n],int B[50]) { int i,j,k=0; for(i=0;i

稀疏矩阵的运算(完美版)

专业课程设计I报告( 2011 / 2012 学年第二学期) 题目稀疏矩阵的转换 专业软件工程 学生姓名张鹏宇 班级学号 09003018 指导教师张卫丰 指导单位计算机学院软件工程系 日期 2012年6月18号

指导教师成绩评定表

附件: 稀疏矩阵的转换 一、课题内容和要求 1.问题描述 设计程序用十字链表实现稀疏矩阵的加、减、乘、转置。 2.需求分析 (1)设计函数建立稀疏矩阵,初始化值。 (2)设计函数输出稀疏矩阵的值。 (3)构造函数进行两个稀疏矩阵相加,输出最终的稀疏矩阵。 (4)构造函数进行两个稀疏矩阵相减,输出最终的稀疏矩阵。 (5)构造函数进行两个稀疏矩阵的相乘,输出最终的稀疏矩阵。 (6)构造函数进行稀疏矩阵的转置,并输出结果。 (7)退出系统。 二、设计思路分析 (1)设计函数建立稀疏矩阵,初始化值。 (2)设计函数输出稀疏矩阵的值。 (3)构造函数进行两个稀疏矩阵相加,输出最终的稀疏矩阵。 (4)构造函数进行两个稀疏矩阵相减,输出最终的稀疏矩阵。 (5)构造函数进行两个稀疏矩阵的相乘,输出最终的稀疏矩阵。 (6)构造函数进行稀疏矩阵的转置,并输出结果。 (7)退出系统。 三、概要设计 为了实现以上功能,可以从3个方面着手设计。 1.主界面设计 为了实现对稀疏矩阵的多种算法功能的管理,首先设计一个含有多个菜单项的主控菜单子程序以链接系统的各项子功能,方便用户交互式使用本系统。本系统主控菜单运行界面如图所示。

2.存储结构设计 本系统采用单链表结构存储稀疏矩阵的具体信息。其中:全部结点的信息用头结点为指针数组的单链表存储。 3.系统功能设计 本系统除了要完成稀疏矩阵的初始化功能外还设置了4个子功能菜单。稀疏矩阵的初始化由函数i typedef int ElemType 实现。建立稀疏矩阵用void Creat()实现,依据读入的行数和列数以及非零元素的个数,分别设定每个非零元素的信息。4个子功能的设计描述如下。 (1)稀疏矩阵的加法: 此功能由函数void Xiangjia( )实现,当用户选择该功能,系统即提示用户初始化要进行加法的两个矩阵的信息。然后进行加法,最后输出结果。 (2)稀疏矩阵的乘法: 此功能由函数void Xiangcheng( )实现。当用户选择该功能,系统提示输入要进行相乘的两个矩阵的详细信息。然后进行相乘,最后得到结果。 (3)稀疏矩阵的转置: 此功能由函数void Zhuanzhi( )实现。当用户选择该功能,系统提示用户初始

数据结构实验报告(实验五 稀疏矩阵运算器)

韶关学院 学生实验报告册 实验课程名称:数据结构与算法 实验项目名称:实验五数组及其应用 稀疏矩阵运算器 实验类型(打√):(基础、综合、设计√) 院系:信息工程学院计算机系专业:***** 姓名:*** 学号:***** 指导老师:陈正铭 韶关学院教务处编制

一、实验预习报告内容

二、实验原始(数据)记录 实验时间:2007 年 5 月30日(星期三第7,8 节)实验同组人:

三、实验报告内容 2007年 5 月30 日

注:1、如有个别实验的实验报告内容多,实验报告册页面不够写,或有识图,画图要求的,学生应根据实验指导老师要求另附相同规格的纸张并粘贴在相应的“实验报告册”中。 2、实验报告册属教学运行材料,院系(中心)应按有关规定归档保管。

【源程序】 #include #include #include #define maxsize 100 #define maxrow 100 #define OK 1 #define ERROR -1 typedef struct{ int row; //行数 int col; //列数 int v; //非零元素值 }triplenode; typedef struct{ triplenode data[maxsize+1]; //非零元三元组 int rowtab[maxrow+1]; //各行第一个非零元的位置表 int mu,nu,tu; //矩阵的行数、列数和非零元个数}rtripletable; void creat(rtripletable &A) //创建稀疏矩阵 { int k=1,sum=1,loop,p,t; int num[maxrow+1]; cout<<"请输入矩阵的行数和列数:"<>A.mu; cout<<"列数:";cin>>A.nu; cout<<"非零元素个数:";cin>>A.tu; cout<<"请按行,列和值的形式输入该矩阵的非零元.并以全零为结束标记!"<>A.data[loop].row>>A.data[loop].col>>A.d ata[loop].v; //输入三元组的行数,列数和非零元素值 } for(p=1;p<=A.mu;p++) num[p]=0; //A三元组每一列的非零元素个数 for(t=1;t<=A.tu;t++) ++num[A.data[t].row]; //求A中每一列含非零元个数 A.rowtab[1]=1; //求第p列中第一个非零元在A.data中的序号for(t=2;t<=A.mu;t++) A.rowtab[t]=A.rowtab[t-1]+num[t-1]; return; } void print(rtripletable A) //输出稀疏矩阵 { int result[maxrow+1][maxrow+1]; //定义一个二维数组 int loop1,loop2; for(loop1=1;loop1<=A.mu;loop1++) for(loop2=1;loop2<=A.nu;loop2++) result[loop1][loop2]=0; //初始化为0 for(loop1=1;loop1<=A.tu;loop1++) result[A.data[loop1].row][A.data[loop1].col]=A.dat a[loop1].v; for(loop1=1;loop1<=A.mu;loop1++) { cout<<"|"; for(loop2=1;loop2<=A.nu;loop2++) cout<

稀疏矩阵应用.

稀疏矩阵应用 ●课题简介 1.1课题及要求 稀疏矩阵应用(限1 人完成) 设计要求:实现三元组,十字链表下的稀疏矩阵的加、转、乘的实现。 (1)稀疏矩阵的存储 (2)稀疏矩阵加法 (3)矩阵乘法 (4)矩阵转置 1.2课程任务分析 本课程设计主要实现在三元组存储结构与十字链表存储结构下输入稀疏矩阵,并对稀疏矩阵进行转置,相加,相乘操作,最后输出运算后的结果。稀疏矩阵采用三元组和十字链表表示,并在两种不同的存储结构下,求两个具有相同行列数的稀疏矩阵A和B的相加矩阵C,并输出C;求出A的转置矩阵D,输出D;求两个稀疏矩阵A和B的相乘矩阵E,并输出E。 1.3课程的意义 其意义是让我们在学习完C、数据结构等课程基础上,掌握多维数组的逻辑结构和存储结构、掌握稀疏矩阵的压缩存储及转置,相加,相乘等基本操作,并用不同的方法输出结果,进一步掌握设计、实现较大系统的完整过程,包括系统分析、编码设计、系统集成、以及调试分析,熟练掌握数据结构的选择、设计、实现以及操作方法,为进一步的应用开发打好基础。 ●程序分析 2.1设计函数建立稀疏矩阵及初始化值和输出稀疏矩阵的值 本模块要求设计函数建立稀疏矩阵并初始化,包括在三元组结构下和十字链表结构下。首先要定义两种不同的结构体类型,在创建稀疏矩阵时,需要设计两个不同的函数分别在三元组和十字链表下创建稀疏矩阵,在输入出现错误时,能够对错误进行判别处理,初始化稀疏矩阵都为空值,特别注意在十字链表下,对变量进行动态的地址分配。在设计输出稀疏矩阵的值的函数时,也要针对两种不同的情况,分别编制函数,才能准确的输出稀疏矩阵。在对稀疏矩阵进行初始化及输出值时,均只输出非零元素的值和它所在的所在行及所在列。 2.2构造函数进行稀疏矩阵的转置并输出结果 本模块要求设计函数进行稀疏矩阵的转置并输出转置后的结果,由于对稀疏函数的转置只对一个矩阵进行操作,所以实现起来难度不是很大,函数也比较容易编写。在编写函数时,要先定义一个相应的结构体变量用于存放转置后的矩阵,最后把此矩阵输出。

稀疏矩阵乘法的运算

课程设计任务书 学生姓名:专业班级: 指导教师:夏红霞工作单位:计算机科学与技术学院题目: 稀疏矩阵乘法的运算 课程设计要求: 1、熟练掌握基本的数据结构; 2、熟练掌握各种算法; 3、运用高级语言编写质量高、风格好的应用程序。 课程设计任务: 1、系统应具备的功能: (1)设计稀疏矩阵的存储结构 (2)建立稀疏矩阵 (3)实现稀疏矩阵的乘法 2、数据结构设计; 3、主要算法设计; 4、编程及上机实现; 5、撰写课程设计报告,包括: (1)设计题目; (2)摘要和关键字; (3)正文,包括引言、需求分析、数据结构设计、算法设计、程序实现及测试、不足之处、设计体会等; (4)结束语; (5)参考文献。 时间安排:2010年7月5日-9日(第19周) 7月5日查阅资料 7月6日系统设计,数据结构设计,算法设计 7月7日 -8日编程并上机调试 7月9日撰写报告 7月10日验收程序,提交设计报告书。 指导教师签名: 2010年7月4日系主任(或责任教师)签名: 2010年7月4日

目录 1.摘要 (1) 2.关键字 (1) 3.引言 (1) 4. 问题描述 (1) 5. 系统设计 (1) 6. 数据结构 (3) 7. 算法描述 (3) 8. 测试结果与分析 (4) 9. 源代码 (12) 10. 总结 (29) 11.参考文献 (29)

稀疏矩阵乘法的运算 1.摘要:在一些数值计算中,一些二维矩阵的乘法运算很常见,我们经常采用线性代数中的知识进行运算,然而对一些含有非零元很少的二维矩阵也采用相同的方法时,就会发现那样的方法不仅需要很多的空间来存储0,造成空间复杂度比较大,而且算法的时间复杂度也较大。因此需要采取其他的方法来解决这个问题,由于0在乘法中其结果总是0,所以可以考虑采用三元组的方式去存储稀疏矩阵中的非零元,这样在计算过程中不仅需要的内存空间减少了,而且运算的速率也提高了。 2.关键字:稀疏矩阵乘法二维矩阵算法复杂度 3.引言:随着科学技术的发展,人们对矩阵的运算的几率越来越大,特别是高新科技研究中对矩阵的运算更是常见。但是如何高效的并占内存少的进行矩阵运算就是一个急需解决的问题。本文主要对稀疏矩阵的存储以及稀疏矩阵的乘法运算进行了研究和探讨。 4.问题描述:在一些数值计算中,一些二维矩阵的乘法运算很常见,我们经常采用线性代数中的知识进行运算,然而对一些含有非零元很少的二维矩阵也采用相同的方法时,就会发现那样的方法不仅需要很多的空间来存储0,造成空间复杂度比较大,而且算法的时间复杂度也较大。为了减少空间和时间复杂度,可以根据给定的二维数组的数据设计稀疏矩阵的存储结构,然后根据设计的稀疏矩阵存储结构建立一个稀疏矩阵,最后获得两个二维数组得到他们各自的稀疏矩阵,计算这两个稀疏矩阵的乘积。 5.系统设计: 5.1 设计目标:通过一定的数据结构,存储含有少量数据的矩阵,把他们存入一个稀疏矩阵中,然后实现稀疏矩阵的乘法运算。[基本要求]设计稀疏矩阵的存储结构;建立稀疏矩阵;实现稀疏矩阵的乘法

相关文档
最新文档