online: 11; azi: 1416; total: 51871 Manual clasa a xi a - Implementarea structurilor de date - Lista liniara

Probleme Rezolvate



Manual clasa a Xi a

Implementarea structurilor de date

Lista liniara

Din lista circulară creată să se creeze alte două liste circulare simplu înlănţuite — una cu numerele divizibile cu cea mai mare cifră, iar alta cu numerele divizibile cu cea mai mică cifră — şi să se verifice dacă cele două liste conţin numere comune.
# include < iostream >
# include < fstream >
struct Nod {
int valoare;
Nod* urmator ;
};
int ceaMaiMareCifra ( int n) {
int maxCifra = 0 ;
while (n != 0 ) {
int cifra = n % 10 ;
if (cifra > maxCifra ) {
maxCifra = cifra;
}
n /= 10 ;
}
return maxCifra ;
}
int ceaMaiMicaCifra ( int n) {
int minCifra = 9 ;
while (n != 0 ) {
int cifra = n % 10 ;
if (cifra < minCifra ) {
minCifra = cifra;
}
n /= 10 ;
}
return minCifra ;
}
bool contineNumereComune (Nod* lista1, Nod* lista2) {
Nod* p = lista1;
do {
Nod* q = lista2;
do {
if (p->valoare == q->valoare) {
return true ;
}
q = q-> urmator ;
} while (q != lista2);
p = p-> urmator ;
} while (p != lista1);
return false ;
}
int main () {
// Citire lista circulara din fisier
std :: ifstream fisier ( "lista.txt" ) ;
Nod* lista = nullptr ;
Nod* ultimulNod = nullptr ;
int valoare;
while ( fisier >> valoare) {
Nod* nod = new Nod;
nod->valoare = valoare;
nod-> urmator = lista;
if (lista == nullptr ) {
lista = nod;
}
else {
ultimulNod -> urmator = nod;
}
ultimulNod = nod;
}
ultimulNod -> urmator = lista;
// Cream cele doua liste cerute
Nod* listaMare = nullptr ;
Nod* ultimulNodMare = nullptr ;
Nod* listaMica = nullptr ;
Nod* ultimulNodMica = nullptr ;
Nod* p = lista;
do {
int cifra = ceaMaiMareCifra (p->valoare);
if (cifra == ceaMaiMareCifra (lista->valoare)) {
Nod* nod = new Nod;
nod->valoare = p->valoare;
nod-> urmator = listaMare ;
if ( listaMare == nullptr ) {
listaMare = nod;
}
else {
ultimulNodMare -> urmator = nod;
}
ultimulNodMare = nod;
}
else if (cifra == ceaMaiMicaCifra (lista->valoare)) {
Nod* nod = new Nod;
nod->valoare = p->valoare;
nod-> urmator = listaMica ;
if ( listaMica == nullptr ) {
listaMica = nod;
}
else {
ultimulNodMica -> urmator = nod;
}
ultimulNodMica = nod;
}
p = p-> urmator ;
} while (p != lista);
// Afisam cele doua liste
std :: cout << "Lista cu numere divizibile cu cea mai mare cifra: " ;
p = listaMare ;
do {
std :: cout << p->valoare << " " ;
p = p-> urmator ;
} while (p != listaMare );
std :: cout << std :: endl ;
std :: cout << "Lista cu numere divizibile cu cea mai mica cifra: " ;
p = listaMica ;
do {
std :: cout << p->valoare << " " ;
p = p-> urmator ;
} while (p != listaMica );
std :: cout << std :: endl ;
// Verificam daca cele doua liste contin numere comune
bool contineComune = contineNumereComune ( listaMare , listaMica );
if ( contineComune ) {
std :: cout << "Cele doua liste contin numere comune." << std :: endl ;
}
else {
std :: cout << "Cele doua liste nu contin numere comune." << std :: endl ;
}
// Eliberam memoria alocata dinamic
p = listaMare ;
do {
Nod* q = p;
p = p-> urmator ;
delete q;
} while (p != listaMare );
p = listaMica ;
do {
Nod* q = p;
p = p-> urmator ;
delete q;
} while (p != listaMica );
p = lista;
do {
Nod* q = p;
p = p-> urmator ;
delete q;
} while (p != lista);
return 0 ;
}

P utem crea un fișier lista.txt cu conținutul următor:
12 34 56 78 90 21 43 65 87