ضرب دو ماتریس اسپارس با لیستهای پیوندی


#include <conio.h>

#include <stdio.h>
#include <iostream.h>
#include <math.h>
main ()
{

int xx=10,yy=18,x,y,n,k,i,j,qq=0,q,list1[100][3],list2[100][3],list3[100][3],list4[100][3],a=0,b=0,h=0,c=0,jj=0,onsor=0;
xx+=2;
yy=16;
gotoxy(yy,xx);
cout<<"___________Matrix 1 ________";
xx+=2,yy=18;
yy=18;
gotoxy(yy,xx);
cin >>x;
list3[0][0]=x;
yy+=8;
gotoxy(yy,xx);
cin >>y;
list3[0][1]=y;
yy+=8;
gotoxy(yy,xx);
cin >>i;
xx++;
//______________________________________________________________________________
for(n=0;n<=100;n++)
{
for(k=0;k<3;k++)
{
list1[n][k]=9;
list2[n][k]=9;
list3[n][k]=9;
list4[n][k]=9;
}
}
//____________________________input1__________________________________________________
cout<<" ............................";
yy=18;xx++;
for(n=0;n<i;n++)
{
for(k=0;k<3;k++)
{
gotoxy(yy,xx);
cin >> list1[n][k];
yy+=8;
}
yy=18;
xx++;
}
//_____________________________input 2_________________________________________________
xx+=2,yy=18;
cout<<" ___________Matris 2 ________";
gotoxy(yy,xx);
cin >>x;
list3[0][0]=x;
yy+=8;
gotoxy(yy,xx);
cin >>y;
list3[0][1]=y;
yy+=8;
gotoxy(yy,xx);
cin >>j;
//_____________________________________________________________________________________
xx++;
cout<<" ............................";

xx++; yy=18;
for(n=0;n<j;n++)
{
for(k=0;k<3;k++)
{
gotoxy(yy,xx);
cin >> list2[n][k];
yy+=8;

}
yy=18;
xx++;
}
//______________________________________________________________________________
h=0;q=0;
for (n=0;n<i;n++)
{
for (k=0;k<j;k++)
{

if(list2[k][0]==list1[n][1])
{
h++;
list3[h-1][0]=list1[n][0] ;
list3[h-1][1]=list2[k][1] ;
list3[h-1][2]=list1[n][2]*list2[k][2];

}
}

}
jj=h;
//______________________________________________________________________________

h=0;
for(n=0;n<jj;n++)
{
if (n==jj-1) break;
if(list3[n][1]==list3[n+1][1] && list3[n][0]==list3[n+1][0])
{
list4[h][0]=list3[n][0]+list3[n+1][0];
list4[h][1]=list3[n][1]+list3[n+1][1];
list4[h][2]=list3[n][2]+list3[n+1][2];
q=6;n++;qq++;
}
else
{
list4[h][0]=list3[n][0];
list4[h][1]=list3[n][1];
list4[h][2]=list3[n][2];
q=2;
}
h++;
}
if( q==2)
{
list4[h][0]=list3[n][0];
list4[h][1]=list3[n][1];
list4[h][2]=list3[n][2];
}
if( q==0)
{
list4[h][0]=list3[n][0];
list4[h][1]=list3[n][1];
list4[h][2]=list3[n][2];
}

//___________________________ Sort _____________________________________________
if(qq>0)jj=jj-qq;
h=jj;
for(n=0;n<h;n++)
{
if(h==n-1)break;
if (list4[n][0]==list4[n+1][0])
{
if(list4[n][1]>list4[n+1][1])
{
a=0;b=0;c=0;
a=list4[n][0]; b=list4[n][1]; c=list4[n][2];
list4[n][0]=list4[n+1][0]; list4[n][1]=list4[n+1][1]; list4[n][2]=list4[n+1][2];
list4[n+1][0]=a; list4[n+1][1]=b; list4[n+1][2]=c;
}
}

}

//_____________________________ Print __________________________________________

cout<<"\n\n\t\t "<<x<<"\t"<<y<<"\t"<<jj<<"\n";
cout<<"\t\t__________________\n\t\t ";
for(n=0;n<jj;n++)
{
for(k=0;k<3;k++)
{
cout <<list4[n][k] <<"\t" ;
}
cout<<"\n"<<"\t\t ";
}

getch();

}