/* Fichier Liste0.cpp : liste lineaire chainee des entiers en ordre LIFO (Last In First Out) Explications en classe : apres l'intra Il est TRÈS IMPORTANT de faire des schémas pour comprendre la création et la manipulation de base d'une liste linéaire programmée par nous-même. Au final, le dessin d'un schéma sera évalué pour chaque tâche demandée de la manipulation d'une telle liste. À comprendre et adapter selon vos besoins. Voir Liste1.cpp pour liste en ordre FIFO */ #include // pour entrée-sortie cin, cout #include // pour le formatage #include // chaîne de caractères using namespace std; // librairie standard struct Element { int valeur ; Element * suivant ; }; typedef Element * Pointeur ; // creer en ordre LIFO (faire de schema pour mieux comprendre la technique void creer(Pointeur & liste, int nombre) { liste = NULL ; for(int candi = 1 ; candi <= nombre; candi++) if (nombre % candi == 0) { Pointeur tempo = new Element ; tempo->valeur = candi ; tempo->suivant = liste ; liste = tempo; } } int nbElem(Pointeur liste) { int n = 0; while (liste) { n++; liste = liste->suivant; } return n; } void afficher(Pointeur liste, string message = "apres la creation") { cout << "Contenu de la liste de " << nbElem(liste) << " elements " << "en ordre LIFO " << message << " :\n"; while (liste) { cout << setw(5) << liste->valeur ; liste = liste->suivant; } cout << endl; } void chercher(int aChercher, Pointeur liste, Pointeur & avant, Pointeur & cestLui) { avant = NULL; cestLui = liste; while (cestLui && cestLui->valeur != aChercher) { avant = cestLui; cestLui= cestLui->suivant ; } } void demoRecherche(Pointeur liste) { int aChercher ; Pointeur avant, cestLui = liste; char reponse = 'o'; while (cestLui && (reponse == 'o' || reponse == 'O')) { cout << "Quelle valeur recherchee " ; cin >> aChercher; chercher(aChercher, liste, avant, cestLui); if (cestLui) { cout << "On trouve : " << cestLui->valeur << endl; if (avant) cout << "La valeur avant : " << avant->valeur << endl; else cout << "au debut de la liste\n"; } else cout << "introuvable\n"; cout << endl << "Voulez-vous continuer ? (o/n) " ; cin >> reponse; } } void demoSupprimer(Pointeur & liste) { int aChercher; Pointeur avant, cestLui; char reponse = 'o'; while (reponse == 'o' || reponse == 'O') { cout << "Quelle valeur a supprimer " ; cin >> aChercher; cestLui = liste; chercher(aChercher, liste, avant, cestLui); if (cestLui) { cout << "On trouve et supprime : " << cestLui->valeur << endl; if (avant) avant->suivant = cestLui->suivant; else liste=liste->suivant; delete cestLui; afficher(liste, "apres cette suppression"); } else cout << "introuvable\n"; cout << endl << "Voulez-vous continuer ? (o/n) " ; cin >> reponse; } if (liste == NULL) cout << "La liste est vide!\n"; } int main() { Pointeur liste ; creer(liste, 20); // liste des diviseurs de 20 afficher(liste); demoRecherche(liste); demoSupprimer(liste); return 0; } /* Exécution: Contenu de la liste de 6 elements en ordre LIFO apres la creation : 20 10 5 4 2 1 Quelle valeur recherchee 5 On trouve : 5 La valeur avant : 10 Voulez-vous continuer ? (o/n) o Quelle valeur recherchee 20 On trouve : 20 au debut de la liste Voulez-vous continuer ? (o/n) n Quelle valeur a supprimer 2 On trouve et supprime : 2 Contenu de la liste de 5 elements en ordre LIFO apres cette suppression : 20 10 5 4 1 Voulez-vous continuer ? (o/n) o Quelle valeur a supprimer 20 On trouve et supprime : 20 Contenu de la liste de 4 elements en ordre LIFO apres cette suppression : 10 5 4 1 Voulez-vous continuer ? (o/n) n */