online: 4; azi: 644; total: 51099 Manual clasa a xi a - Implementarea structurilor de date - Lista liniara

Probleme Rezolvate



Manual clasa a Xi a

Implementarea structurilor de date

Lista liniara

Se creează o listă în care ordinea de acces este cea în care sunt citite numerele din fişier . Se afişează numerele care au ultimele trei cifre identice, se elimină din listă numerele care au ultimele trei cifre consecutive şi se insereaza valoarea 10 înaintea numerelor care au suma ultimelor trei cifre egală cu 10.
# include < iostream >
# include < fstream >
using namespace std ;
struct Node {
int data;
Node * next ;
};
Node * createNode ( int val) {
Node * newNode = new Node ();
newNode ->data = val;
newNode -> next = NULL ;
return newNode ;
}
void insert ( Node ** headRef , int val) {
Node * newNode = createNode (val);
if (* headRef == NULL ) {
* headRef = newNode ;
} else {
Node * temp = * headRef ;
while ( temp -> next != NULL ) {
temp = temp -> next ;
}
temp -> next = newNode ;
}
}
bool hasLastThreeDigitsIdentical ( int num) {
int lastDigit = num % 10 ;
int secondLastDigit = (num / 10 ) % 10 ;
int thirdLastDigit = (num / 100 ) % 10 ;
return ( lastDigit == secondLastDigit && secondLastDigit == thirdLastDigit );
}
bool hasLastThreeDigitsConsecutive ( int num) {
int lastDigit = num % 10 ;
int secondLastDigit = (num / 10 ) % 10 ;
int thirdLastDigit = (num / 100 ) % 10 ;
return ( lastDigit == secondLastDigit + 1 && secondLastDigit == thirdLastDigit + 1 );
}
int sumLastThreeDigits ( int num) {
int lastDigit = num % 10 ;
int secondLastDigit = (num / 10 ) % 10 ;
int thirdLastDigit = (num / 100 ) % 10 ;
return ( lastDigit + secondLastDigit + thirdLastDigit );
}
void processList ( Node ** headRef ) {
Node * temp = * headRef ;
Node * prev = NULL ;
while ( temp != NULL ) {
if ( hasLastThreeDigitsIdentical ( temp ->data)) {
cout << " Number with last three digits identical : " << temp ->data << endl ;
if ( prev == NULL ) {
* headRef = temp -> next ;
} else {
prev -> next = temp -> next ;
}
Node * toDelete = temp ;
temp = temp -> next ;
delete toDelete ;
} else if ( hasLastThreeDigitsConsecutive ( temp ->data)) {
if ( prev == NULL ) {
* headRef = temp -> next ;
} else {
prev -> next = temp -> next ;
}
Node * toDelete = temp ;
temp = temp -> next ;
delete toDelete ;
} else if ( sumLastThreeDigits ( temp ->data) == 10 ) {
Node * newNode = createNode ( 10 );
newNode -> next = temp -> next ;
temp -> next = newNode ;
prev = temp ;
temp = temp -> next ;
} else {
prev = temp ;
temp = temp -> next ;
}
}
}
void printList ( Node * head ) {
Node * temp = head ;
while ( temp != NULL ) {
cout << temp ->data << " " ;
temp = temp -> next ;
}
cout << endl ;
}
int main () {
ifstream fin ( "input.txt" ) ;
Node * list = NULL ;
int val;
while (fin >> val) {
insert(& list , val);
}
fin.close ();
cout << "Original list : " ;
printList ( list );
processList (& list );
cout << " Processed list : " ;
printList ( list );
return 0 ;
}