online: 3; azi: 1105; total: 51560 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 modifice adresele din nodurile listei astfel încât să se obțină două liste liniare dublu înlănțuite care să conţină numerele din poziţiile pare, respectiv din pozițiile impare.
# include < iostream >
# include < fstream >
using namespace std ;
struct Node {
int val;
Node * prev ;
Node * next ;
};
void split_list ( Node * head , Node ** even_head , Node ** odd_head ) {
Node * even_tail = NULL ;
Node * odd_tail = NULL ;
Node * curr = head ;
int i = 1 ;
while ( curr != NULL ) {
Node * new_node = new Node { curr ->val, NULL , NULL };
if (i % 2 == 0 ) {
// add to even list
if (* even_head == NULL ) {
* even_head = new_node ;
} else {
even_tail -> next = new_node ;
new_node -> prev = even_tail ;
}
even_tail = new_node ;
} else {
// add to odd list
if (* odd_head == NULL ) {
* odd_head = new_node ;
} else {
odd_tail -> next = new_node ;
new_node -> prev = odd_tail ;
}
odd_tail = new_node ;
}
curr = curr -> next ;
i++;
}
}
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 );
// split list into even and odd lists
Node * even_head = NULL ;
Node * odd_head = NULL ;
split_list ( head , & even_head , & odd_head );
cout << " Even list : " ;
print_list ( even_head );
cout << " Odd list : " ;
print_list ( odd_head );
// free memory
Node * curr = head ;
while ( curr != NULL ) {
Node * next = curr -> next ;
delete curr ;
curr = next ;
}
curr = even_head ;
while ( curr != NULL ) {
Node * next = curr -> next ;
delete curr ;
curr = next ;
}
curr = odd_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 crea două liste separate, una cu numerele din poziții pare și una cu numerele din poziții impare. Astfel, ieșirea programului ar trebui să arate astfel:
Original list : 1 2 3 4 5 6 7 8 9 10
Even list : 2 4 6 8 10
Odd list : 1 3 5 7 9
În aceste liste separate, numerele de pe poziții pare sunt în lista cu numere pare, iar numerele de pe poziții impare sunt în lista cu numere impare.