zoukankan      html  css  js  c++  java
  • 稀疏矩阵线性表示

    稀疏矩阵

    #include<stdio.h>
    #include<stdlib.h>
    #include<malloc.h>
    #define MAX 100
    typedef struct{
        int data[MAX][MAX];
        int m,n;
    }matrix;//一个普通矩阵
    typedef int spmatrix[MAX][3];//稀疏矩阵三元组表示法
    //一个普通矩阵的初始化
    void init(matrix*p,int m,int n)
    {
        p->m=m;
        p->n=n;
    }
    //普通矩阵转换为稀疏矩阵
    void compressmatrix(matrix A,spmatrix B)
    {
        int i,j,k=1;
        for(i=0;i<A.m;i++)
            for(j=0;j<A.n;j++)
            if(A.data[i][j]!=0)
        {
            B[k][0]=i;
            B[k][1]=j;
            B[k][2]=A.data[i][j];
            k++;
        }
        B[0][0]=A.m;
        B[0][1]=A.n;
        B[0][2]=k-1;
    }
    //稀疏矩阵转置
    void transpmatrix(spmatrix B,spmatrix C)
    {
        int i,j,t,m,n;
        int x[MAX];
        int y[MAX];
        m=B[0][0];n=B[0][1];t=B[0][2];
        C[0][0]=n;C[0][1]=m;C[0][2]=t;
        if(t>0)
        {
            for(i=0;i<n;i++)x[i]=0;
            for(i=1;i<=t;i++)x[B[i][1]]++;
            y[0]=1;
            for(i=1;i<n;i++)y[i]=y[i-1]+x[i-1];
            for(i=1;i<=t;i++)
            {
                j=y[B[i][1]];
                C[j][0]=B[i][1];
                C[j][1]=B[i][0];
                C[j][2]=B[i][2];
                y[B[i][1]]=j+1;
            }
        }
    }

    输入输出相关

    //普通矩阵输入
    void Mat_input(matrix *p)
    {
        int i,j,lm=p->m,ln=p->n;
        for(i=0;i<lm;i++)
            for(j=0;j<ln;j++)
                scanf("%d",&p->data[i][j]);
    }
    //普通矩阵输出
    void Mat_output(matrix *p)
    {
        int i,j,lm=p->m,ln=p->n;
        for(i=0;i<lm;i++)
        {
            for(j=0;j<ln;j++)
                printf("%4d",p->data[i][j]);
            printf("
    ");
        }
    }
    //稀疏矩阵三元组显示
    void SpMat_output(spmatrix A)
    {
        int i,len=A[0][2];
        for(i=0;i<=len;i++)
            printf("%d	%d	%d
    ",A[i][0],A[i][1],A[i][2]);
        printf("
    ");
    }
    //根据稀疏矩阵三元组输出稀疏矩阵
    void SpMat_display(spmatrix A)
    {
        int temp[MAX][MAX]={0};
        int i,j,lm=A[0][0],ln=A[0][1],lsum=A[0][2];
        for(i=1;i<=lsum;i++)
            temp[A[i][0]][A[i][1]]=A[i][2];
        for(i=0;i<lm;i++)
        {
            for(j=0;j<ln;j++)
                printf("%4d",temp[i][j]);
            printf("
    ");
        }
        printf("
    ");
    }

    测试:

    int main()
    {
        matrix m,*pm=&m;
        spmatrix sp1;
        init(pm,3,3);
        Mat_input(pm);
        Mat_output(pm);
        compressmatrix(m,sp1);
        SpMat_output(sp1);
        SpMat_display(sp1);
    
    }



    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    实现免费WiFi无线共享
    详解spring配置文件
    P1886 滑动窗口 /【模板】单调队列
    P3370 【模板】字符串哈希
    P3371 【模板】单源最短路径(弱化版)
    P3367 【模板】并查集
    P1177 【模板】快速排序
    P3382 【模板】三分法
    P3374 【模板】树状数组 1
    P1226 【模板】快速幂||取余运算
  • 原文地址:https://www.cnblogs.com/Thereisnospon/p/4768519.html
Copyright © 2011-2022 走看看