第四章学习总结

第四章学习小结

本章我们主要学习了串、数组和广义表。而今天我就来讲一讲作业中《稀疏矩阵》这道题的解题过程。

什么是稀疏矩阵?

指矩阵中大多数元素为零的矩阵。一般的,党费领元素个数只占矩阵元素总数的25%-30%,或低于这个百分数是,我们称这样的矩阵为稀疏矩阵。这道题目有两种方法:三元组表示法十字链表法

三元组表示法:

稀疏矩阵的顺序存储结构要求在存储非零元素的同时,还必须存储该非零元素在矩阵中的行号和列号。

十字链表法:

稀疏矩阵的链式存储结构,矩阵的每一个非零元素用一个结点表示,该节点除了(row,col,value)以外,还要有两个域(right:用于链接同一行中的下一个非零元素;down:用以链接同一列中的下一个非零元素)

结构示意图:

本道题我用了三元组表示法。

1. 定义数组  

如果要用到三元组,那我们首先需要定义一个数组,而由于矩阵中的每一个元素都需要存储行、列、数值,所以数组中的每一个“节点”都必须有三个存储单位。因此,传统的一维数组是不行的,因此,我们可以构造出新的结构体类型M,非零元素在新型“一维数组”中的表现形式如图所示:

 

row

col

value

M.Data[1]

M.Data[1].row

M.Data[1].col

M.Data[1].value

M.Data[2]

M.Data[2].row

M.Data[2].col

M.Data[2].value

M.Data[3]

M.Data[3].row

M.Data[3].col

M.Data[3].value

……

M.Data[4].row

M.Data[4].col

M.Data[4].value

M.Data[M.len]

M.Data[M.len].row

M.Data[M.len].col

M.Data[M.len].value

代码

typedef struct Triple{
    int row,col; //该非零元素的行下标和列下标 
    int e; //该非零元素的值 
}Triple;

typedef struct TSMatrix{
    Triple data[MAXSIZE+1]; //非零元素的三元组表,data[0]空置不用 
    int m,n,len; //矩阵的行数、列数和非零元素的个数 
}TSMatrix; 
View Code

2. 输入数据

根据上表所示的数组图,就可以把每个元素的对应的行、列和数值输入,这里要注意的是,为了方便起见,一般把data[0]空置不用,从data[1]开始,因此前面定义数组空间大小应该是MAXSIZE+1

代码

        TSMatrix M;
    int value,i,j,k,a,b;
    cin>>M.m>>M.n>>M.len;// 输入矩阵的行数、列数和非零元素的个数 
     
    for(int k=1;k<=M.len;++k){
        cin>>i>>j>>a; //输入矩阵元素——行下标,列下标,非零元素的元素值
        M.data[k].row=i;
        M.data[k].col=j;
        M.data[k].e=a;
View Code

 

3. 查找数组

将这个功能封装为一个函数search(),将每个数组的值一一进行比较,因为想到函数返回值只能为一个,所以就干脆返回数组的位置而不是所对应的行和列。

代码

int search(TSMatrix &M,int value){
    int i;
    for(i=1;i<=M.len;i++)
      { //遍历三元组表中的非零元素的值,若查找成功,则返回非        
            零元素所在数组中的位置 i,否则返回-1 
        if(M.data[i].e==value)
        return i;
    }
    return -1;
};    
View Code

4. 输出

根据返回的位置i,输出i对应的rowcol

代码

        cin>>value; //输入查询元素的值 
        b=search(M,value);//查询非零元素所在位置,并返回其在数组中的位置i 
    if(b!=-1) cout<<M.data[b].row<<" "<<M.data[b].col<<endl;
    else cout<<"ERROR";        
View Code

附录:《中国大学慕课》--数据结构(华中农业大学 ,陈仲民等)

下次学习目标:希望自己能够利用好课堂的时间,尽可能地把每一道题解和此题解背后涉及到的相关知识也记录下来,写在博客里。

猜你喜欢

转载自www.cnblogs.com/butterboy/p/10706261.html