您的位置:首页 > 其它

稀疏矩阵三元组的操作

2017-11-24 20:33 239 查看
稀疏矩阵三元组的操作:

#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
.i==x)&&(m.data
.j==y))
{
cout<<setw(5)<<m.data
.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
4000
);//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*/

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: