稀疏矩阵的存储实现Word下载.docx
《稀疏矩阵的存储实现Word下载.docx》由会员分享,可在线阅读,更多相关《稀疏矩阵的存储实现Word下载.docx(29页珍藏版)》请在冰豆网上搜索。
(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稀疏矩阵三元组表和十字链表两种存储的实现............
2
1.2稀疏矩阵转置........................................
1.3稀疏矩阵的相加相乘..................................
1.4输出结果
...........................................
2数据结构设计
2.1三元组的结构体......................................2
2.2十字链表的结构体..........................
.........3
3算法设计
3.1三元组
3.1.1三元组的创建....................................
3
3.1.2三元组的转置....................................
5
3.1.3三元组的相加....................................
5
3.1.4三元组的相乘....................................
8
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.