online: 9; azi: 141; total: 52147 Manual clasa a xi a - Implementarea structurilor de date - Lista liniara

Probleme Rezolvate



Manual clasa a Xi a

Implementarea structurilor de date

Lista liniara

Să se elimine numerele prime şi să se insereze între fiecare pereche de numere rămase cel mai mare divizor comun al lor.
V om folosi următoarele subprograme:
# include < iostream >
# include < fstream >
using namespace std ;
struct Node {
int val;
Node * prev ;
Node * next ;
};
int cmmdc ( int a, int b) {
if (b == 0 ) {
return a;
}
return cmmdc (b, a % b);
}
bool is_prime ( int n) {
if (n < 2 ) {
return false ;
}
for ( int i = 2 ; i <= n / 2 ; i++) {
if (n % i == 0 ) {
return false ;
}
}
return true ;
}
void eliminate_primes_and_insert_gcds ( Node * head ) {
Node * curr = head ;
while ( curr != NULL && curr -> next != NULL ) {
Node * next = curr -> next ;
if ( is_prime ( curr ->val)) {
// eliminate current node
if ( curr == head ) {
head = next ;
next -> prev = NULL ;
} else {
curr -> prev -> next = next ;
next -> prev = curr -> prev ;
}
delete curr ;
curr = next ;
} else {
// calculate gcd and insert it
int gcd = cmmdc ( curr ->val, next ->val);
Node * new_node = new Node { gcd , curr , next };
curr -> next = new_node ;
next -> prev = new_node ;
curr = next -> next ;
}
}
}
void print_list ( Node * head ) {
Node * curr = head ;
while ( curr != NULL ) {
cout << curr ->val << " " ;
curr = curr -> next ;
}
cout << endl ;
}
int main () {
ifstream fin ( "input.txt" ) ;
// create the linked list
Node * head = NULL ;
Node * tail = NULL ;
int num;
while (fin >> num) {
Node * new_node = new Node {num, tail , NULL };
if ( tail == NULL ) {
head = new_node ;
} else {
tail -> next = new_node ;
}
tail = new_node ;
}
fin. close ();
cout << "Original list : " ;
print_list ( head );
eliminate_primes_and_insert_gcds ( head );
cout << " Modified list : " ;
print_list ( head );
// free memory
Node * curr = head ;
while ( curr != NULL ) {
Node * next = curr -> next ;
delete curr ;
curr = next ;
}
return 0 ;
}

Pentru a testa programul, avem nevoie de un fișier text care să conțină o listă de numere întregi separate prin spațiu. De exemplu, un fișier de intrare "input.txt" ar putea arăta astfel:
1 2 3 4 5 6 7 8 9 10
Această listă conține numerele de la 1 la 10, iar programul va elimina numerele prime și va insera cel mai mare divizor comun între fiecare pereche de numere rămase în listă. Astfel, ieșirea programului ar trebui să arate astfel:
Original list : 1 2 3 4 5 6 7 8 9 10
Modified list : 2 1 4 1 6 1 8 1 10
În această listă modificată, numerele prime au fost eliminate, iar între fiecare pereche de numere rămase a fost inserat cel mai mare divizor comun al lor.