第五章

二位数组的行优先和列优先存储

矩阵的转置

void trsmat(int A[][maxSize],int B[][maxSize],int m,int n)
{
    for (i=0;i<m;i++)
        for(int j=0;j<n;j++)
            B[j][i]=A[i][j]
}

略去一些非法输入的判定操作,且为了方便处理,将二位数组统一设置成maxSize×maxSize的尺寸,其中maxSize是可能穿线的尺寸最大值,用参数m和n来控制数组的实际尺寸。

 矩阵相加

void addmat(int C[][maxSize],int A[][maxSize],int B[][maxSize],int m,int n)
{
    for (int i=0;i<m;i++)
        for (int j=0;j<n;j++)
            C[i][j]=A[i][j]+B[i][j];
}

矩阵相乘

void mutmat(int C[][maxSize],int A[][maxSize];int B[][maxSize];int m,int n,int k)
{
    for(int i=0;i<m;i++)
        for(int j=0;j<k;j++)
        {
            C[i][j]=0;
            for(int h=o;h<n;h++)
                C[i][j]+=A[i][h]+B[h][j];
        }
}

特殊矩阵

  1. 对称矩阵
  2. 三角矩阵
  3. 对角矩阵

稀疏矩阵

      常用的顺序存储方法有三元组表示法和伪地址表示法

三元组表示法

/*元素结构体定义*/
typedef struct
{
    int val;
    int i,j;
}Trimat;
int trimat[maxterms+1][3];

trimat[k][0]表示原矩阵 中的元素按照行优先顺序地第k个非零元素的值;trimat[k][1]、trimat[k][2]表示第k个非零元素在矩阵中的位置。规定第0行的三个元素分别用来存储非零元素个数、行数和列数。

建立一个三元组的核心问题在于求原矩阵的非零元素个数、非零元素值,以及非零元素在原数组中的位置。

void createtrimat(float A[][maxSize],int m,int n,float B[][3])
{
    int k=1;
    for (int i=0;i<m;++i)
        for (int j=0;j<n;++j)
            if (A[i][j]!=0)
            {
                B[k][0]=a[i][j];
                B[k][1]=i;
                B[k][2]=j;
                k++;
            }
    B[0][0]=k-1;
    B[0][1]=m;
    B[0][2]=n;
}

伪地址表示法

伪地址表示法每一行 只有两个存储单元,一个用来存放矩阵元素值,另一个用来存放伪地址。这种方法只需要2N个存储单元。对于一个m×n的稀疏矩阵A,元素A[i][j]的伪地址计算方法为n(i-1)+j,通过这个公式不仅可以计算矩阵中一个给顶元素的伪地址,还可以反推出给定元素在原矩阵中的真实地址。

稀疏矩阵的链式存储方法中最常用的两种:邻接表示法和十字链表法

广义表:表元素可以是院子或者广义表的一种线性表的扩展结构。

广义表的长度:表中最上层元素的个数

广义表的深度:表中括号的最大层数

表头(Head)和表尾(Tail):当广义表非空时,第一个元素为广义表的表头,其余元素组成的表示广义表的表尾。

头尾链表存储结构和扩展线性表差异
 头尾链表存储结构扩展线性表
原子结点(0)标记域和数据域标记域、数据域和尾指针域
广义表结点(1)标记域、头指针域和尾指针域标记域、头指针域和尾指针域

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值