数据结构 矩阵的快速转置 矩阵相乘(行逻辑连接顺序表)

来源:互联网 发布:java重定向到百度 编辑:程序博客网 时间:2024/05/16 08:15

快速转置

#include <iostream>#include <string.h>using namespace std;class num{    public:    int x,y;    int e;    int row,col;}a[100000],b[100000];int sum[100000],deal[1000000];int main(){    int i,j,n,m,s,t,flag;    int flag2;    cin>>n>>m;    a[0].row=n; a[0].col=m;    flag=1;    for(i=0;i<=n-1;i++)    {        for(j=0;j<=m-1;j++)        {            cin>>s;            if(s)            {                a[flag].x=i;                a[flag].y=j;                a[flag++].e=s;            }        }    }    b[0].row=m; b[0].col=n;    memset(sum,0,sizeof(sum));    for(i=1;i<=flag-1;i++)    {        sum[a[i].y]++;    }    deal[0]=1;    for(i=1;i<=m-1;i++)    {        deal[i]=deal[i-1]+sum[i-1];    }    for(i=1;i<=flag-1;i++)    {       flag2=deal[a[i].y];       b[flag2].x=a[i].y;    b[flag2].y=a[i].x;       b[flag2].e=a[i].e;       deal[a[i].y]++;    }    int x=1;    for(i=0;i<=b[0].row-1;i++)    {        for(j=0;j<=b[0].col-1;j++)        {            if(i==b[x].x&&j==b[x].y)            {                cout<<b[x].e<<" ";                x++;            }else            {                cout<<"0 ";            }        }        cout<<endl;    }    return 0;}


 

矩阵的相乘 (带行连接信息的三元组表为行逻辑链接的顺序表)

#include <iostream>#include <stdlib.h>#include <string.h>using namespace std;class num{    public:    int x,y;    int e;    int sum[10000],row,col,deal[10000];}a[1000],b[1000],c[1000];int sum[1000];int main(){    void build(num *ex,int n,int m);    int i,j,n,m,s,t,flag;    cout<<"请输入矩阵1"<<endl;    cin>>n>>m;    build(a,n,m);    cout<<"请输入矩阵2"<<endl;    cin>>n>>m;    build(b,n,m);    if(a[0].col!=b[0].row)    {        cout<<"您输入错误"<<endl;        exit(0);    }    c[0].row=a[0].row; c[0].col=b[0].col;    int fp,row,col,fp2;    flag=1;    for(i=0;i<=a[0].row-1;i++)    {        memset(sum,0,sizeof(sum));        if(i<a[0].row-1)        {            fp=(a[0].deal)[i+1];        }else        {            fp=(a[0].deal)[i]+1;        }        for(j=(a[0].deal)[i];j<fp;j++)        {            col=a[j].y;            if(col<b[0].row-1)            {                fp2=(b[0].deal)[col+1];            }else            {                fp2=(b[0].deal)[col]+1;            }            for(int x=(b[0].deal)[col];x<fp2;x++)            {                sum[b[x].y]+=a[j].e*b[x].e;            }        }        for(j=0;j<=b[0].col-1;j++)        {            if(sum[j])            {               c[flag].x=i; c[flag].y=j;               c[flag++].e=sum[j];            }        }    }    t=1;    for(i=0;i<=c[0].row-1;i++)    {        for(j=0;j<=c[0].col-1;j++)        {            if(c[t].x==i&&c[t].y==j)            {                cout<<c[t].e<<" ";                t++;            }else            {                cout<<"0 ";            }        }        cout<<endl;    }    return 0;}void build(num *ex,int n,int m){    ex[0].row=n; ex[0].col=m;    int flag=1,i,j,t,s;    for(i=0;i<=n-1;i++)    {        t=0;        for(j=0;j<=m-1;j++)        {            cin>>s;            if(s)            {                t++;                ex[flag].x=i; ex[flag].y=j;                ex[flag++].e=s;            }        }        ex[0].sum[i]=t;    }    ex[0].deal[0]=1;    for(i=1;i<=n-1;i++)    {        (ex[0].deal)[i]=(ex[0].deal)[i-1]+(ex[0].sum)[i-1];    }}