稀疏矩阵的存储实现Word下载.docx

上传人:b****2 文档编号:14977544 上传时间:2022-10-26 格式:DOCX 页数:29 大小:171.08KB
下载 相关 举报
稀疏矩阵的存储实现Word下载.docx_第1页
第1页 / 共29页
稀疏矩阵的存储实现Word下载.docx_第2页
第2页 / 共29页
稀疏矩阵的存储实现Word下载.docx_第3页
第3页 / 共29页
稀疏矩阵的存储实现Word下载.docx_第4页
第4页 / 共29页
稀疏矩阵的存储实现Word下载.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

稀疏矩阵的存储实现Word下载.docx

《稀疏矩阵的存储实现Word下载.docx》由会员分享,可在线阅读,更多相关《稀疏矩阵的存储实现Word下载.docx(29页珍藏版)》请在冰豆网上搜索。

稀疏矩阵的存储实现Word下载.docx

(1)设计题目;

(2)摘要和关键字(中文和英文);

(3)正文,包括引言、需求分析、数据结构设计、算法设计、有关技术的讨论、设计体会等;

(4)结束语;

(5)参考文献。

时间安排:

2013年12月16日--25日

 

指导教师签名:

李晓红2013年12月14日

系主任(或责任教师)签名:

年月日

摘要本课程设计在学习数据结构的前提下,运用c语言,对稀疏矩阵进行三元组存储和十字链表存储,并完成稀疏矩阵的转置,相加,相乘等基本运算。

关键词稀疏矩阵三元组十字链表基本运算

AbstractThiscourseisdesignedonthepremiseoflearningdatastructuresusingclanguage,forsparsematrixtriplestoretostoreandcross-linked,andwereachievedunderthetwostoragesparsematrixtranspose,add,multiply,andotherbasicoperations.

KeywordssparsematrixtriplesCrusadersbasicoperations

目录 

引言 

....................................................1

1需求分析

1.1稀疏矩阵三元组表和十字链表两种存储的实现............ 

1.2稀疏矩阵转置........................................ 

1.3稀疏矩阵的相加相乘.................................. 

1.4输出结果 

........................................... 

2数据结构设计

2.1三元组的结构体......................................2

2.2十字链表的结构体.......................... 

.........3 

3算法设计

3.1三元组

3.1.1三元组的创建.................................... 

3.1.2三元组的转置.................................... 

3.1.3三元组的相加.................................... 

5

3.1.4三元组的相乘.................................... 

3.1.5三元组的显示...................................10 

3.2十字链表

3.2.1十字链表的创建.................................11 

3.2.2十字链表的显示................................. 

12 

3.3主函数............................................ 

13

4设计体会............................................16

5结束语..............................................16

附1参考文献............................................16

附2源代码..............................................17

附3运行结果............................................38

引言

什么是稀疏矩阵?

人们无法给出确切的定义,它只是一个凭人们的直觉来了解的概念。

假设在m×

n的矩阵中,有t个元素不为零。

令q=t/(m×

n),称q为矩阵的稀疏因子。

通常认为q<

=0.05时称为稀疏矩阵。

按照压缩存储的概念,值存稀疏矩阵的非零元。

因此,除了寻出非零元的值外,还必须同时记下它所在的行和列的位置。

反之,一个三元组唯一确定了矩阵A的一个非零元。

由此,稀疏矩阵可由表示非零元的三元组及其行列数唯一确定。

其存储方法有三种,分别是三元组顺序表,行逻辑链接的顺序表,十字链表。

分别是以顺序存储结构,带行连接信息的三元组表,及链式存储结构进行存储表示。

1需求分析

1.1稀疏矩阵三元组表和十字链表两种存储的实现

三元组表的实现通过建立两个结构体,分别用来表示三元组的行数、列数、非零元数和元素的行、列坐标、值。

然后通过for循环进行赋值。

并求出每行含有的非零元个数。

十字链表与三元组的不同在于用链表来存储每一行,每一列的元素信息。

1.2稀疏矩阵的转置

稀疏矩阵的转置即将行列值进行调换,将元素的行列值进行调换,重排每个元素的次序。

如何重排?

三元组按照原矩阵M的列序进行转置。

为了找到M的每个元素,要对三元组表从第一行开始进行扫描,便可得到转置后矩阵的顺序。

十字链表需要将元素的行指针和列指针调换。

1.3稀疏矩阵的相加相乘

两个矩阵相加及每个元素分别对应相加。

两个矩阵的相乘M×

N=S,即M的行元素与N的列元素分别对应乘积的累加,得到的即为S以M的行,N的列为坐标的元素的值。

1.4输出结果

可以用for或while循环,输出两种表示下的稀疏矩阵。

2.1三元组的结构体

typedefstruct{

inti,j;

//三元组每个元素的行坐标,列坐标,值

inte;

}Triple;

Tripledata[MAXSIZE+1];

intrpos[MAXSIZE+1];

//三元组各行第一个元素的位置

intmu,nu,tu;

//三元组矩阵的行数,列数,非零元个数

}TSMatrix;

//三元组结构体定义;

2.2十字链表的结构体

typedefstructOLNode{

//十字链表每个元素的行坐标,列坐标,值

structOLNode*right,*down;

}OLNode,*OLink;

typedefstruct{

//矩阵的行数,列数,非零元个数

OLink*rhead,*chead;

//行和列头指针

}CrossList;

//十字链表结构体定义

3.1.1三元组的创建

voidCreateSMatrix(TSMatrix&

M){

//采用三元组顺序表存储表示,创建稀疏矩阵M

printf("

请输入稀疏矩阵的行数列数非零元个数:

\n"

);

scanf("

%d%d%d"

&

M.mu,&

M.nu,&

M.tu);

if((M.mu<

=0)||(M.nu<

=0)||(M.tu<

=0)||(M.tu>

M.mu*M.nu))

//判断行值、列值、元素个数是否合法

printf("

输入有误!

"

for(inti=1;

i<

=M.tu;

i++){//输入稀疏矩阵元素

请输入请输入非零元的行坐标列坐标值:

scanf("

M.data[i].i,&

M.data[i].j,&

M.data[i].e);

if((M.data[i].i<

=0)||(M.data[i].j<

=0)){

输入错误,请重新输入!

}//if

}//for

intnum[100];

if(M.tu)

{inti;

for(i=1;

i<

=M.mu;

i++)num[i]=0;

//初始化

for(intt=1;

t<

=M.tu;

t++)++num[M.data[t].i];

//求M中每一行含非零元素个数

//求rpos

M.rpos[1]=1;

for(i=2;

i++)M.rpos[i]=M.rpos[i-1]+num[i-1];

}

}//创建三元组

3.1.2三元组的转置

voidTransposeSMatrix(TSMatrixM,TSMatrix&

T){

T.nu=M.mu;

//通过三元组表示,将M转置为T

T.mu=M.nu;

T.tu=M.tu;

intq=1;

for(intcol=1;

col<

=M.nu;

col++)

for(intp=1;

p<

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

}

}//三元组转置

3.1.3三元组的相加

intCompare(inta1,intb1,inta2,intb2){//先建立Compare函数

if(a1>

a2)return1;

elseif(a1<

a2)return-1;

elseif(b1>

b2)return1;

if(b1<

b2)return-1;

elsereturn0;

voidAddTMatix(TSMatrixM,TSMatrixT,TSMatrix&

S){//矩阵S存放相加后的矩阵

S.mu=M.mu>

T.mu?

M.mu:

T.mu;

//对S矩阵的行数赋值

S.nu=M.nu>

T.nu?

M.nu:

T.nu;

//对S矩阵的列数赋值

S.tu=0;

intce;

intq=1;

intmcount=1,tcount=1;

while(mcount<

=M.tu&

&

tcount<

=T.tu){

switch(Compare(M.data[mcount].i,M.data[mcount].j,T.data[tcount].i,T.data[tcount].j))

//用switch分支语句,用compare函数对需要相加的两个矩阵的某元素行数列数进行比较

{case-1:

S.data[q].e=M.data[mcount].e;

S.data[q].i=M.data[mcount].i;

S.data[q].j=M.data[mcount].j;

q++;

mcount++;

break;

case1:

S.data[q].e=T.data[tcount].e;

S.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 成人教育 > 电大

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1