این پروژه نیز کاربرد مفید لینک لیست ها را نشان می دهد که ابتدا بی نهایت مجموعه با بی نهایت عضو می گیرد و سپس اسم دو مجموعه از مجموعه های ورودی را می گیرد و حاصل ضرب دکارتی آن مجموع ها را چاپ می کند .
A={1,2,3}
B={5,6}
A * B = { (1*5) (1*6)(2*5)(2*6)(3*5)(3*6) }
#include "iostream.h"
#include "conio.h"
#include "stdlib.h"
#include "string.h"
struct number{
int count;
int num;
struct number *next;
}*nn,*ln,*fn;
struct collection{
char name[20];
struct number *p;
struct collection *next;
}*fc,*nc,*lc;
void add();
void print();
void move();
int *avali,*dovomi,c1,c2;
char a[20],b[20];
main(){
add();
move();
print();
}
//***********************************
void add(){
char x[20];
int tmp;
cout<<"\n Enter your set by n";
do{
cout<<"\n Enter a name for complex : ";
cin>>x;
if(strcmp(x,"final")==0)
break;
cout<<"\n\t { \n";
nc=(struct collection*)calloc(1,sizeof(struct collection));
if(nc==NULL)
exit(1);
if(fc==NULL)
fc=nc;
else
lc->next=nc;
lc=nc;
nc->next=NULL;
nc->p=NULL;
strcpy(nc->name,x);
do{
cout<<"\t\t";
cin>>x;
if(strcmp(x,"end")==0)
break;
else
tmp=atoi(x);
nn=(struct number*)calloc(1,sizeof(struct number));
if(nn==NULL)
exit(1);
nn->next=NULL;
nn->num=tmp;
nn->count=0;
if(nc->p==NULL){
nc->p=fn=nn;
fn->count=1;
}
else{
ln->next=nn;
fn->count+=1;
}
ln=nn;
}while(1);
cout<<"\n\t } \n";
}while(1);
}
//************************************************
void move(){
int i;
clrscr();
cout<<"\n Enter two collection (C B) : ";
cin>>a>>b;
nc=fc;
while(nc!=NULL){
if(strcmp(nc->name,a)==0){
ln=nc->p;
c1=ln->count;
avali=(int*)calloc(c1,sizeof(int));
for(i=0;i<c1;i++){
avali=ln->num;
ln=ln->next;
}
}
else if(strcmp(nc->name,b)==0){
ln=nc->p;
c2=ln->count;
dovomi=(int*)calloc(c2,sizeof(int));
for(i=0;i<c2;i++){
dovomi=ln->num;
ln=ln->next;
}
}
nc=nc->next;
}
}
//******************************************************************************
void print(){
int i,j;
clrscr();
cout<<"\n "<<a<<"*"<<b<<" = {";
for(i=0;i<c1;i++)
for(j=0;j<c2;j++)
cout<<"("<<avali<<"*"<<dovomi[j]<<")";
cout<<"}";
getch();
}