vuoi
o PayPal
tutte le volte che vuoi
Semplice programma che permettee di creare modificare eliminare ,insomma di lavorare su un grafo.Il linguaggio C++.
{mark[start-1]=1;
nodo* tmp=first;
trova_nodo(tmp,start);
visita(tmp->right,mark);
}
}
//metodo privato per la copia degli adiacenti
void grafo::copy_adiac(adiacenti *v,adiacenti * &n)
{if (v!=NULL)
{n=new adiacenti;
n->x=v->x;
copy_adiac(v->right,n->right);
}
else n=v;
}
//metodo privato per la copia dei nodi
void grafo::copy_nodo(nodo * v,nodo* &n)
{if(v!=NULL)
{n=new nodo;
n->x=v->x;
copy_adiac(v->right,n->right);
copy_nodo(v->down,n->down);
}
else n=v;
}
//procedura privata per la somma di y con adiacenti
void grafo:: somma_adiac(int y,adiacenti* &p)
{if(p!=NULL)
{p->x=p->x+y;
somma_adiac(y,p->right);
}
}
//procedura privata per la somma di y con i nodi
void grafo::somma_nodo(int y,nodo* &p)
{if(p!=NULL)
{p->x=p->x+y;
somma_adiac(y,p->right);
somma_nodo(y,p->down);
}
}
//overloading dell'operatore +:somma l'intero passato con tutti gli elementi del
grafo
grafo grafo ::operator +(int n)
{if (first!=NULL)
{grafo tmp=*this;
somma_nodo(n,tmp.first);
return tmp;
}
}
void grafo::cancarc(int n,int a)
{ nodo *tmp=first;
trova_nodo(tmp,n);
canc_arc(tmp->right,a);
};
void grafo::canc_arc(adiacenti* &p,int a)
{ if(p!=NULL)
{ canc_arc(p->right,a);
if(p->x==a)
{ adiacenti *tmp=p->right;
delete p;
p=tmp;
}
}
};
grafo::grafo()
{ first=NULL;
numnodi=0;
};
grafo::~grafo()
{ distr_nodi(first);
};
void grafo::distr_nodi(nodo* &p)
{ if (p!=NULL)
{ distr_nodi(p->down);
distr_adiacenti(p->right);
delete p;
}
};
void grafo::distr_adiacenti(adiacenti* &p)
{ if(p!=NULL)
{ distr_adiacenti(p->right);
delete p;
}
};
//Procedure per stampare un grafo
void grafo::stampa()
{ if (first!=NULL) print_nodi(first);
else cout<<"Grafo vuoto!";
};
void grafo::print_nodi(nodo* &p)
{
if(p!=NULL)
{
cout<<"Nodo "<<p->x<<endl;
print_adiacenti(p->right);
print_nodi(p->down);
}
};
void grafo::print_adiacenti(adiacenti* &p)
{
if(p!=NULL)
{
cout<<"adiacente a "<<p->x<<endl;
print_adiacenti(p->right);
}
};
//overloading dell'operatore =
grafo grafo:: operator = (grafo op)
{if(op.first!=NULL)
{distr_nodi(first);
copy_nodo(op.first,first);
return *this;
}
else {first=NULL;
return *this;
}
}
//costruttore copy
grafo::grafo(grafo & op)
{if(op.first!=NULL)
{copy_nodo(op.first,first);
}
else {first=NULL;
cout<<"\n grafo vuota(vista dal costruttore copy)";
}
}
//Procedure per l'inserimento di un nodo
void grafo::insnodo()
{
ins_nodo(first);
};
void grafo::ins_nodo(nodo* &p)
{
if(p!=NULL) ins_nodo(p->down);
else
{ p=new nodo;
numnodi++;
p->x=numnodi;
p->right=NULL;
p->down=NULL;
}
};
void grafo::ins_arc(adiacenti* &p,int a)
{ if(p!=NULL)
ins_arc(p->right,a);
else
{ p=new adiacenti;
p->x=a;
p->right=NULL;
}
};
void grafo::insarc(int n,int a)
{
nodo* tmp=first;
trova_nodo(tmp,n);
ins_arc(tmp->right,a);
};
void grafo::trova_nodo(nodo* &p,int n)
{
if(p->x!=n && p!=NULL)
{ p=p->down;
trova_nodo(p,n);
}
};
main ()
{ int sc=1,x,a;
grafo g,f;
while(sc!=0)
{ cout<<" *** GRAFO 1.73 *** "<<endl;
cout<<"-----------------MENU----------------"<<endl;
cout<<"Inserisci un nodo nel grafo 1"<<endl;
cout<<"Inserisci un arco nel grafo 2"<<endl;
cout<<"Visualizza il grafo 3"<<endl;
cout<<"Cancella un arco 4"<<endl;
cout<<"Overloading di = 5"<<endl;
cout<<"Costruttore copy 6"<<endl;
cout<<"Overloading di + 7"<<endl;
cout<<"depth_first 8"<<endl;
cout<<"Esci 0"<<endl;
cout<<"EFFETTUA UNA SCELTA: "<<endl;
cin>>sc;
switch(sc)
{ case 1:g.insnodo();
cout<<"E' stato inserito il nodo numero "<<g.numnodi<<endl;
break;
case 2:cout<<"Inserisci la coda dell'arco: "<<endl;
cin>>x;
cout<<"Inserisci la testa dell'arco: "<<endl;
cin>>a;
g.insarc(x,a);
break;
case 3:cout<<"Visualizzazione del grafo: "<<endl;
g.stampa();
break;
case 4:cout<<"Inserisci la coda dell'arco da cancellare: "<<endl;
cin>>x;
cout<<"Inserisci la testa dell'arco da cancellare: "<<endl;
cin>>a;
g.cancarc(x,a);
break;
case 5:f=g;
cout<<"Overloading dell'operatore d'assegnamento... "<<endl,
f.stampa();
break;
case 7:cout<<"Inserisci il numero da sommare a tutti i nodi del
grafo:"<<endl;
cin>>x;
cout<<"Overloading..."<<endl;
g=g+x;
break;
case 8:g.dept_ferst(g.numnodi);
break;
case 6:grafo k(g);
cout<<"Uso del costruttore di copie..."<<endl;
k.stampa();