Sunteți pe pagina 1din 3

#include<iostream>

using namespace std ;


struct NOD;
typedef NOD* LISTA ;
void error ( char * ) ;
void adaugare (LISTA&, int ) ;
LISTA creareLista ( ) ;
void afisareLista (LISTA ) ;
LISTA cautareNod (LISTA , int ) ;
LISTA copieLista (LISTA ) ;
void joc1 (LISTA&, int , int &);
void joc2 (LISTA&, int , int&, int &);
struct NOD
{
int info ;
NOD* next ;
};
void error ( char* msg)
{
cerr<<"Eroare de executie. "<<endl ;
cerr<<msg<<endl ;
cerr<<"Programul se opreste ! "<<endl ;
exit ( 1 ) ;
}
void adaugare (LISTA &crt , int infon )
{
// adaugarea unui nod nou dupa ultimul nod adugat in lista
LISTA nou = new NOD;
if ( nou == NULL)
error ( " Spatiu insuficient! " );
nou->info = infon ;
if ( crt == 0) // lista este vida
{
crt = nou ; // crt contine adresa ultimului nod adaugat ,
// nodul curent
crt->next = nou ; // crt->next este adresa primului nod adaugat
}
else
{
nou->next = crt->next ;
crt->next = nou ;
crt = nou ;
}
}
LISTA creareLista ( int &n )
{
LISTA crt = 0 ;
do
{
cout<<"Numarul de copii ( cel putin 2 ) : " ;
cin>>n ;
}while ( n < 2 ) ;
for ( int i = 1 ; i <= n ; i++)
adaugare ( crt , i ) ;
return crt ;
}
void afisareLista (LISTA crt )
{
// afisam lista incepand cu primul nod inserat
LISTA p = crt->next ;

if ( p != 0 )
{
do
{
cout<<p->info <<" " ;
p = p->next ;
}while ( p != crt->next ) ;
cout << endl ;
}
else
cout<<" Lista este vida ! "<<endl ;
L}ISTA cautareNod (LISTA crt , int infoc )
{
LISTA p = crt ;
if (p != 0)
{
do
{
if (p->info == infoc )
return p ;
// se returneaza adresa nodului de informatie infoc
p = p->next ;
}while (p != crt ) ;
}
return 0 ;
}
LISTA copieLista (LISTA crt )
{
if ( ! crt )
{
cout<<"LISTA este vida ! "<<endl ;
return 0 ;
}
LISTA crtcopy = 0 , p = crt->next ;
// incepem copierea cu primul nod inserat in lista ,
// asa incat crt sa reprezinte tot adresa ultimului element inserat
do
{
adaugare ( crtcopy , p->info ) ;
p = p->next ;
}while (p != crt->next ) ;
return crtcopy ;
}
void joc1 (LISTA &crt , int n , int &poz )
{
do
{
cout<<" Pozitia de la care incepe numaratoarea : " ;
cin>>poz ;
}while ( poz <= 0 || poz > n ) ;
LISTA p , q = cautareNod ( crt , poz ) ;
int j = n ;
do
{
for ( int i = 1 ; i < n ; i++)
{
p = q ;
q = q->next ;
}
// nodul de sters are adresa pastrata in q ,

// iar precedentul , in p
cout<<" Copilul eliminat este "<<q->info <<endl ;
p->next = q->next ; // l e g a t u r a noua
if ( q == crt )
crt = p ;
delete q ; // se s t e r g e n o dul q
// a f i s a r e L i s t a ( c r t ) ;
// se t r e c e l a u rm a t o rul c o p i l de dupa c e l s t e r s
q = p->next ;
j --; // se dece remen te a z a numarul de c o p i i
}while ( j > 1 ) ;
}void joc2 (LISTA &crt , int n , int &poz , int &m)
{
do
{
cout<<"Pozitia de la care incepe numaratoarea : " ;
cin>>poz ;
}while ( poz <= 0 || poz > n ) ;
do
{
cout<<" Pasul de eliminare , m: ";
cin>>m;
}while (m < 2 ) ;
LISTA p , q = cautareNod ( crt , poz ) ;
do
{
for ( int i = 1 ; i < m; i++)
{
p = q ;
q = q->next ;
}
cout<<"Copilul eliminat este "<<q->info <<endl ;
p->next = q->next ;
if ( q == crt )
crt = p ;
delete q ;
// afisareLista ( crt ) ;
q = p->next ;
n--;
}while ( n > 1 ) ;
}
int main ( )
{
int nr , poz , m;
LISTA curent = creareLista ( nr ) ;
// realizam o copie a listei initiale
LISTA curentcopy = copieLista ( curent ) ;
cout<<" Lista circulara initiala . "<<endl ;
afisareLista ( curent ) ;
joc1 ( curent , nr , poz ) ;
cout<<" Castigator al primului joc este copilul " ;
afisareLista ( curent ) ;
joc2 ( curentcopy , nr , poz , m) ;
cout<<" Castigator al celui de-al doilea joc este copilul " ;
afisareLista ( curentcopy ) ;
return 0 ;
}

S-ar putea să vă placă și