稀疏矩阵三元组的操作

稀疏矩阵三元组的操作:

#include <iostream>
#include <conio.h>
#include  <iomanip>
#include  <windows.h>
#include  <cstdio>
#include <algorithm>
#define MAXSIZE 12500
using 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的和矩阵Q
			break;
        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 8
1 2 12
1 3 9
3 1 -3
3 6 14
4 3 24
5 2 18
6 1 15
6 4 -7


10 10 8
1 3 -3
1 6 15
2 1 12
2 5 18
3 1 9
3 4 24
4 6 -7
6 3 14*/





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值