稀疏矩阵三元组的操作

来源:互联网 发布:php直播系统源码下载 编辑:程序博客网 时间:2024/05/23 21:05

稀疏矩阵三元组的操作:

#include <iostream>#include <conio.h>#include  <iomanip>#include  <windows.h>#include  <cstdio>#include <algorithm>#define MAXSIZE 12500using namespace std;//假设非零元个数的最大值typedef int Elemtype;typedef   struct{    int  i, j,k;    //该非零元的行列下标    Elemtype  e;} Triple;typedef  struct{    Triple  data[MAXSIZE];    int       mu, nu, tu;    //矩阵的行、列数和非零元个数} TSMatrix;bool cmp(Triple n,Triple m){    if(n.i<m.i)        return n.i<m.i;    else        return n.j<m.j;}//建立稀疏矩阵int create(TSMatrix &t){    int i,m,n;    Elemtype e;    cout<<"请输入稀疏矩阵的行数、列数、非零元素数(中间用空格隔开):"<<endl;    cin>>t.mu>>t.nu>>t.tu;    if(t.tu>MAXSIZE)        return 0;    for(i=0; i<t.tu; i++)    {        cout<<"按行序列顺序输入第"<<i<<"个非零元素所在的行(0-"<<t.mu<<"),列(0-"<<t.nu<<")"<<endl;        cin>>m>>n>>e;        t.data[i].i=m;        t.data[i].j=n;        t.data[i].e=e;    }    return 1;}//打印稀疏矩阵void print(TSMatrix m){    int k,x,y,n;    cout<<"\n";    for(x=0; x<m.mu; x++)    {        for(y=0; y<m.nu; y++)        {            k=0;            for(n=0; n<m.tu; n++)            {                if((m.data[n].i==x)&&(m.data[n].j==y))                {                    cout<<setw(5)<<m.data[n].e;                    k=1;                }            }            if(k==0)                cout<<setw(5)<<k;        }        cout<<"\n";    }}void transpose(TSMatrix m,TSMatrix &t){    t.nu=m.mu;    t.mu=m.nu;    t.tu=m.tu;    int i,j,q;    q=0;    if(m.tu)    {        for(i=0; i<m.nu; i++)        {            for(j=0; j<m.tu; j++)            {                if(m.data[j].j==i)                {                    t.data[q].i=m.data[j].j;                    t.data[q].j=m.data[j].i;                    t.data[q].e=m.data[j].e;                    q++;                }            }        }    }}void AddSMatrix(TSMatrix m,TSMatrix n,TSMatrix &t,TSMatrix &kk){    int i,j,k;    k=0;    TSMatrix kk1;    int sum=0;    int f=0;    if(m.nu!=n.nu||m.mu!=n.mu)    {        printf("请输入行和列相同的矩阵");        return ;    }    for(i=0; i<m.tu; i++)    {        for(j=0; j<n.tu; j++)        {            if(m.data[i].i==n.data[j].i&&m.data[i].j==n.data[j].j)            {                t.data[k].i=m.data[i].i;                t.data[k].j=m.data[i].j;                t.data[k].e=m.data[i].e+n.data[j].e;                k++;                n.data[j].e=0;                m.data[i].e=0;            }        }    }    for(i=0; i<m.tu; i++)    {        if(m.data[i].e!=0)        {            t.data[k].i=m.data[i].i;            t.data[k].j=m.data[i].j;            t.data[k].e=m.data[i].e;            k++;        }    }    for(i=0; i<n.tu; i++)    {        if(n.data[i].e!=0)        {            t.data[k].i=n.data[i].i;            t.data[k].j=n.data[i].j;            t.data[k].e=n.data[i].e;            k++;        }    }    t.nu=m.nu;    t.mu=m.mu;    t.tu=m.tu;//    printf("%d\n",k);//    for(i=0; i<k; i++)//    {//        printf("%d %d %d\n",t.data[i].i,t.data[i].j,t.data[i].e);//    }//    printf("\n");    int q=0;    for(j=0; j<t.mu;j++)    {        for(i=0; i<k; i++)        {            if(t.data[i].i==j)            {                kk.data[q].i=t.data[i].i;                kk.data[q].j=t.data[i].j;                kk.data[q].e=t.data[i].e;                q++;            }        }    }    kk.nu=m.nu;    kk.mu=m.mu;    kk.tu=q;//    for(i=0; i<q ;i++)//    {//        printf("%d %d %d\n",kk.data[i].i,kk.data[i].j,kk.data[i].e);//    }}void jianMatrix(TSMatrix m,TSMatrix n,TSMatrix &t,TSMatrix &kk){    int i,j,k;    k=0;    TSMatrix kk1;    int sum=0;    int f=0;    if(m.nu!=n.nu||m.mu!=n.mu)    {        printf("请输入行和列相同的矩阵");        return ;    }    for(i=0; i<m.tu; i++)    {        for(j=0; j<n.tu; j++)        {            if(m.data[i].i==n.data[j].i&&m.data[i].j==n.data[j].j)            {                t.data[k].i=m.data[i].i;                t.data[k].j=m.data[i].j;                sum=m.data[i].e-n.data[j].e;                t.data[k].e=sum;                k++;                n.data[j].e=0;                m.data[i].e=0;            }        }    }    for(i=0; i<m.tu; i++)    {        if(m.data[i].e!=0)        {            t.data[k].i=m.data[i].i;            t.data[k].j=m.data[i].j;            t.data[k].e=m.data[i].e;            k++;        }    }    for(i=0; i<n.tu; i++)    {        if(n.data[i].e!=0)        {            t.data[k].i=n.data[i].i;            t.data[k].j=n.data[i].j;            t.data[k].e=n.data[i].e;            k++;        }    }    t.nu=m.nu;    t.mu=m.mu;    t.tu=m.tu;//    printf("%d\n",k);//    for(i=0; i<k; i++)//    {//        printf("%d %d %d\n",t.data[i].i,t.data[i].j,t.data[i].e);//    }//    printf("\n");    int q=0;    for(j=0; j<t.mu;j++)    {        for(i=0; i<k; i++)        {            if(t.data[i].i==j)            {                kk.data[q].i=t.data[i].i;                kk.data[q].j=t.data[i].j;                kk.data[q].e=t.data[i].e;                q++;            }        }    }    kk.nu=m.nu;    kk.mu=m.mu;    kk.tu=q;//    for(i=0; i<q ;i++)//    {//        printf("%d %d %d\n",kk.data[i].i,kk.data[i].j,kk.data[i].e);//    }}void fasttranspose(TSMatrix m,TSMatrix &t){    int num[1000],co[10000];    memset(num,sizeof(num),0);    memset(co,sizeof(co),0);    int i,j,k;    t.nu=m.mu;    t.mu=m.nu;    t.tu=m.tu;    if(m.tu)    {        for(i=0; i<m.tu; i++)        {            num[m.data[i].j]++;        }        co[0]=0;        for(i=1; i<m.nu; i++)        {            co[i]=co[i-1]+num[i-1];            printf("%d\n",co[i]);        }        for(i=0; i<m.tu; i++)        {            k=m.data[i].j;            j=co[k];            t.data[j].i=m.data[i].j;            t.data[j].j=m.data[i].i;            t.data[j].e=m.data[i].e;            co[k]++;        }    }}char menuselect(void){    char ch;    cout<<endl;    cout<<"  ***********************数组和广义表********************"<<endl;    cout<<"  *   a:创建稀疏矩阵"<<"\t"<<"\t"<<"b:稀疏矩阵相加"<<"\t"<<"\t"<<"*"<<endl;    cout<<"  *   c: 稀疏矩阵相减"<<"\t"<<"\t"<<"d:稀疏矩阵相乘"<<"\t"<<"\t"<<"*"<<endl;    cout<<"  *   e:稀疏矩阵转置"<<"\t"<<"\t"<<"f:快速转置    "<<"\t"<<"\t"<<"*"<<endl;    cout<<"  *   g:打印稀疏矩阵"<<"\t"<<"\t"<<"h:            "<<"\t"<<"\t"<<"*"<<endl;    cout<<"  *   i:      "<<"\t"<<"\t"<<"\t"<<"j:      "<<"\t"<<"\t"<<"*"<<endl;    cout<<"  *   k:      "<<"\t"<<"\t"<<"\t"<<"l:      "<<"\t"<<"\t"<<"*"<<endl;    cout<<"  *   w:      "<<"\t"<<"\t"<<"\t"<<"x:       "<<"\t"<<"\t"<<"*"<<endl;    cout<<"  *   z:退出        "<<"\t"<<"\t"<<"x:       "<<"\t"<<"\t"<<"*"<<endl;    cout<<"  *******************************************************"<<endl;    cout<<"  请输入你的选择:";    cin>>ch;    return ch;}void menu(void);TSMatrix m,n,q,s;void menu(void){    char menuselect(void);    for(;;)    {        switch (menuselect())        {        case 'a'://创建            create(m);            break;        case 'b'://相加            cout<<"输入矩阵M"<<endl;            create(m);//创建矩阵M            cout<<"输入矩阵N"<<endl;            create(n);//创建矩阵N            AddSMatrix(m,n,s,q);//M+N            cout<<"输入矩阵M和N的和:"<<endl;            print(q);//输出矩阵M+N的和矩阵Q            break;case 'c'://相减        cout<<"输入矩阵M"<<endl;        create(m);//创建矩阵M        cout<<"输入矩阵N"<<endl;        create(n);//创建矩阵N         jianMatrix(m,n,s,q);//M+N            cout<<"输入矩阵M和N的减"<<endl;        print(q);//输出矩阵M+N的和矩阵Qbreak;        case 'e'://转置            transpose(m,n);            cout<<"转置后的稀疏矩阵为:"<<endl;            print(n);            break;        case 'f'://快速转置            fasttranspose(m,n);            cout<<"快速转置后的稀疏矩阵为:"<<endl;            print(n);            break;        case 'g'://打印            cout<<"稀疏矩阵为:"<<endl;            print(m);            break;        case 'z':            cout<<"                         再见!                       "<<endl;            return;        }    }}int main(){    menu();}/*10 10 81 2 121 3 93 1 -33 6 144 3 245 2 186 1 156 4 -710 10 81 3 -31 6 152 1 122 5 183 1 93 4 244 6 -76 3 14*/


原创粉丝点击