稀疏矩阵存储 (1)三元组(2)十字链表

三对角矩阵

在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190621112929982.png?x-oss-在这里插入图片描述

1 三元组(triple)

0 参考博客链接, 请点击

1 图解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Code

三元组的加法

核心思想

int cmp(Triple m1, Triple m2)
{
    if(m1.i == m2.i)
    {
        if(m1.j == m2.j)
            return 0;
        else if(m1.j < m2.j)
            return -1;
        else
            return 1;
    }
    else if(m1.i < m2.i)
        return -1;
    else
        return 1;
}

1.1 三元组应用例题

在这里插入图片描述
在这里插入图片描述

code

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>

using namespace std;

#define OK true
#define ERROR false

#define MaxSize 100

//typedef long long ll;

//定义三元组线性表中的数据元素存储结构
typedef struct
{
    int row;        //行号
    int col;        //列号
    int d;    //元素值,ElemType为数据元素类型

} TupNode; //三元组定义

//定义三元组线性表存储结构
typedef struct
{
    int rows;                   //三元组的总行数值,是TupNode一层一层推起来的
    int cols;                   //列数值
    int nums;                   //非零元素个数
    TupNode data[MaxSize];      //data数据域

} TSMatrix; //三元组顺序表定义

void swap_(int& a, int& b)
{
    int temp;
    temp=a;
    a=b;
    b=temp;
}

//以行序方式扫描二维矩阵A,将其非零的元素加入到三元组t
//以3行4列的稀疏矩阵为例
// No error
void CreatMat(TSMatrix *t, int arr[3][4])
{
    int i;
    int j;
    t->rows = 3;
    t->cols = 4;
    t->nums = 0;

    //扫描矩阵中的非零元素
    for(i = 0; i < 3; i++)
    {
        for(j = 0; j < 4; j++)
        {
            //只存非零值,以三元组方式
            if(arr[i][j] != 0)
            {
                t->data[t->nums].row = i;
                t->data[t->nums].col = j;
                t->data[t->nums].d = arr[i][j];
                t->nums++;
            }
        }
    }
}

/* 将三元组线性表中指定位置的元素值赋值给e
* nums同时也是data[]的元素个数, data[]元素索引: 0-->(nums-1)
* No error
*/
void arr_Assign(TSMatrix t, int *e, int i, int j)
{
    int k = 0;
    //i和j是否合法, 程序的Robustness
    if(i >= t.rows || j >= t.cols)
    {
        return;
    }

    //找到指定元素的行下标
    while(k < t.nums && i > t.data[k].row)
    {
        k++;
    }

    //当找到指定元素的行下标后,再找到指定元素的列下标
    // 细节: i == t.data[k].row,
    while (k < t.nums && i == t.data[k].row && j > t.data[k].col)
    {
        k++;
    }
    //如果指定元素的行和列都相等,说明找到了
    if(t.data[k].row == i && t.data[k].col==j)
    {
        *e = t.data[k].d;
    }
    else
    {
        //说明没找到
        *e = 0;
    }
}

/* 矩阵转置
*   No error
*/
void Transpose_Matrix(TSMatrix *t)
{
    int i;
    for(i=0; i<t->nums; i++)
    {
        swap_(t->data[i].col, t->data[i].row);
    }

}

/* 规定的排序
*  No error
*/
int cmp(TupNode m1, TupNode m2)
{
    if(m1.row == m2.row)
    {
        if(m1.col == m2.col)
            return 0;
        else if(m1.col < m2.col)
            return -1;
        else if(m1.col > m2.col)
            return 1;
    }
    else if(m1.row < m2.row)
        return -1;
    else if(m1.row > m2.row)
        return 1;
}

/*
*   三元组m1与三元组m2都是递增存储的, m3存储m1+m2的三元组
*   No error
*/
void Matrix_Add(TSMatrix *m1, TSMatrix *m2, TSMatrix *m3)
{
    int i=0, j=0; /* i是m1的索引, j是m2的索引 */
    int k=0;      /* k是m3的索引 */
    while(i < m1->nums && j< m2->nums)
    {
        /* m1.row < m2.row || (m1.row == m2.row && m1.col < m2.col) */
        if( cmp(m1->data[i], m2->data[j]) ==-1 )
        {
            m3->data[k].row = m1->data[i].row;
            m3->data[k].col = m1->data[i].col;
            m3->data[k].d = m1->data[i].d;
            i++;
            k++;
        }
        /* m2.row < m1.row || (m1.row == m2.row && m2.col < m1.col) */
        else if( cmp(m1->data[i], m2->data[j]) == 1 )
        {
            m3->data[k].row = m2->data[j].row;
            m3->data[k].col = m2->data[j].col;
            m3->data[k].d = m2->data[j].d;
            j++;
            k++;
        }
        /* m2.col == m1.col && m2.row == m1.row */
        else
        {
            if(m2->data[j].d + m1->data[i].d == 0)
            {
                i++;
                j++;
                continue;
            }
            m3->data[k].d = m2->data[j].d + m1->data[i].d;
            m3->data[k].col = m2->data[j].col;
            m3->data[k].row = m2->data[j].row;
            i++, j++;
            k++;
        }
    } /* close outer while */

    /* 三元组m1的元素还没遍历完, m2的已经遍历完了 */
    while(i < m1->nums)
    {
        m3->data[k].row = m1->data[i].row;
        m3->data[k].col = m1->data[i].col;
        m3->data[k].d = m1->data[i].d;
        i++;
        k++;
    }
    while(j < m2->nums)
    {
        m3->data[k].row = m2->data[j].row;
        m3->data[k].col = m2->data[j].col;
        m3->data[k].d = m2->data[j].d;
        j++;
        k++;
    }

    m3->nums = k;
}


/* Error */
void as_sign(TSMatrix *A, int& cnt)
{
    A->nums=0;

    int p,q,e;
    while(cnt--)
    {
        scanf("%d %d %d", &p,&q,&e);
        A->data[A->nums].row = p;
        A->data[A->nums].col = q;
        A->data[A->nums].d = e;
        A->nums++;
    }
}

void print_matrix(TSMatrix *A)
{
    for(int i=0; i<A->nums; i++)
    {
        printf("%d %d %d\n",A->data[i].row,A->data[i].col,A->data[i].d);
    }
}

void bubble_sort(TSMatrix *m1)
{
    int i;
    int j;
    for(i=0; i<(m1->nums)-1; i++)
    {
        for(j=0; j<(m1->nums-1)-i; j++)
        {
            if( cmp(m1->data[j], m1->data[j+1]) == 1 )
            {
                TupNode tmp = m1->data[j];
                m1->data[j] = m1->data[j+1];
                m1->data[j+1] = tmp;
            }
        }
    }
}

int main()
{
    //freopen("1.txt","r",stdin);

    int m,n,cnt;

    TSMatrix A,B,C;

    scanf("%d%d%d",&m,&n,&cnt);
    as_sign(&A, cnt);
    //print_matrix(&A);

    scanf("%d%d%d",&m,&n,&cnt);
    as_sign(&B, cnt);
    //print_matrix(&B);

    Matrix_Add(&A, &B, &C);

    Transpose_Matrix(&A);
    bubble_sort(&A);
    printf("%s\n","The transformed matrix  is:");
    print_matrix(&A);

    printf("%s\n","The added matrix is:");
    print_matrix(&C);

    return 0;
}



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值