online: 3; azi: 111; total: 52117 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 calculeze cifra de control a fi ecărui număr şi , dacă numărul este divizibil cu cifra de control, cifra este adăugată după număr; altfel, numărul este eliminat din listă. Cifra de control a unui număr este suma repetată a cifrelor numărului până când se obține o sumă mai mică decât 10.
V om folosi următoarele subprograme:
# include < iostream >
# include < fstream >
using namespace std ;
struct Node {
int val;
Node * prev ;
Node * next ;
};
int digit_sum ( int n) {
int sum = 0 ;
while (n > 0 ) {
sum += n % 10 ;
n /= 10 ;
}
return sum ;
}
int digit_control ( int n) {
while (n >= 10 ) {
n = digit_sum (n);
}
return n;
}
void eliminate_numbers_with_no_control_digit ( Node * head ) {
Node * curr = head ;
while ( curr != NULL ) {
int control_digit = digit_control ( curr ->val);
if ( control_digit != 0 && curr ->val % control_digit == 0 ) {
// add control digit after current node
Node * new_node = new Node { control_digit , curr , curr -> next };
if ( curr -> next != NULL ) {
curr -> next -> prev = new_node ;
}
curr -> next = new_node ;
curr = new_node -> next ;
} else {
// eliminate current node
Node * prev = curr -> prev ;
Node * next = curr -> next ;
if ( prev == NULL ) {
head = next ;
} else {
prev -> next = next ;
}
if ( next != NULL ) {
next -> prev = prev ;
}
Node * to_delete = curr ;
curr = next ;
delete to_delete ;
}
}
}
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_numbers_with_no_control_digit ( 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:
123 456 789 1011 1213 1415
Această listă conține numerele 123, 456, 789, 1011, 1213 și 1415. Programul va calcula cifra de control a fiecărui număr și va elimina numerele care nu au cifra de control, adăugând cifra de control după numărul respectiv în listă. Astfel, ieșirea programului ar trebui să arate astfel:
Original list : 123 456 789 1011 1213 1415
Modified list : 6 123 9 4 3 10 456 3 21 1011 1 1213 3 8 1415
În această listă modificată, numerele 789 și 1415 nu au fost păstrate în listă, deoarece nu au cifra de control. Pentru celelalte numere, a fost calculată cifra de control și a fost adăugată după numărul respectiv în listă.