online: 3; azi: 1010; total: 51465 Manual clasa a xi a - Implementarea structurilor de date - Lista liniara

Probleme Rezolvate



Manual clasa a Xi a

Implementarea structurilor de date

Lista liniara

Pentru două mulţimi de numere A şi B să se determine diferențele A-B şi B-A.
Fișierul de intrare ar putea arăta astfel:
5 2 3 8 9
3 9 1 10 12
Acest program va citi mulțimile de numere întregi A și B din fișier și va calcula diferențele dintre aceste mulțimi.
Rezultatul pentru acest exemplu va fi:
A - B : 2 5 8
B-A: 1 10 12
# include < iostream >
# include < fstream >
# include < sstream >
struct Node {
int val;
Node * next ;
};
Node * create_node ( int val) {
Node * new_node = new Node ;
new_node ->val = val;
new_node -> next = nullptr ;
return new_node ;
}
void insert ( Node *& head , int val) {
if (! head || head ->val >= val) {
if ( head && head ->val == val) return ;
Node * new_node = create_node (val);
new_node -> next = head ;
head = new_node ;
} else {
Node * current = head ;
while ( current -> next && current -> next ->val < val) {
current = current -> next ;
}
if ( current -> next && current -> next ->val == val) return ;
Node * new_node = create_node (val);
new_node -> next = current -> next ;
current -> next = new_node ;
}
}
Node * difference ( Node * A, Node * B) {
Node * result = nullptr ;
while (A) {
if (!B || A->val < B->val) {
insert ( result , A->val);
A = A-> next ;
} else if (A->val == B->val) {
A = A-> next ;
B = B-> next ;
} else {
B = B-> next ;
}
}
return result ;
}
void print_list ( Node * head ) {
while ( head ) {
std :: cout << head ->val << " " ;
head = head -> next ;
}
std :: cout << std :: endl ;
}
void delete_list ( Node *& head ) {
while ( head ) {
Node * temp = head ;
head = head -> next ;
delete temp ;
}
}
int main () {
std :: ifstream input_file ( "numere.txt" ) ;
int num;
Node *A = nullptr , *B = nullptr ;
std :: string line;
std :: getline ( input_file , line);
std :: stringstream ss1 (line) ;
while (ss1 >> num) {
insert (A, num);
}
std :: getline ( input_file , line);
std :: stringstream ss2 (line) ;
while (ss2 >> num) {
insert (B, num);
}
Node * A_minus_B = difference (A, B);
Node * B_minus_A = difference (B, A);
std :: cout << "A-B: " ;
print_list ( A_minus_B );
std :: cout << "B-A: " ;
print_list ( B_minus_A );
delete_list (A);
delete_list (B);
delete_list ( A_minus_B );
delete_list ( B_minus_A );
return 0 ;
}