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.