GEF 243B Programmation informatique appliquée Listes chaînées II §15.1 – 15.2.

Slides:



Advertisements
Présentations similaires
Module Systèmes d’exploitation
Advertisements

GEF 243B Programmation informatique appliquée Listes chaînées I – Tableaux de structures §15.1 – 15.2.
GEF 243B Programmation informatique appliquée
Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Structure de base des programmes en C.
GEF 243B Programmation informatique appliquée
Rappels C.
GEF 243B Programmation informatique appliquée Boucles §
GEF 243B Programmation Informatique Appliquée
Hiver 2005Maj JGA Beaulieu & Capt MWP LeSauvage GEF 243B Programmation informatique appliquée Tests.
GEF 243B Programmation informatique appliquée
GEF 243B Programmation informatique appliquée Structures §12.3.
GEF 243B Programmation informatique appliquée Expressions et opérateurs §
GEF 243B Programmation informatique appliquée
GEF 243B Programmation informatique appliquée
Hiver 2005Maj JGA Beaulieu & Capt MWP LeSauvage GEF 243B Programmation informatique appliquée Modélisation II.
GEF 243B Programmation informatique appliquée Tableaux et pointeurs §10.1.
GEF 435 Principes des systèmes d’exploitation
GEF 243B Programmation informatique appliquée Pointeurs et adresses §9.1.
GEF 243B Programmation informatique appliquée Décisions de design avec structures de données §15.1 – 15.2.
GEF 243B Programmation informatique appliquée Flot de contrôle et énoncés de sélection §
GEF 243B Programmation informatique appliquée Expressions et opérateurs.
Hiver 2005Maj JGA Beaulieu & Capt MWP LeSauvage GEF 243B Programmation informatique appliquée Types, variables et constantes.
GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux §
GEF 243B Programmation informatique appliquée
GEF 243B Programmation informatique appliquée Expressions de type mixte et blocs §
GEF 243B Programmation informatique appliquée
GEF 243B Programmation informatique appliquée
Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Tableaux et pointeurs §10.1.
Cours n°2M2. IST-IE (S. Sidhom) UE 303 Promo. M2 IST-IE 2005/06 Conception dun système d'information multimédia Architecture trois-tiers : PHP/MySQL &
C.
Chap. 1 Structures séquentielles : listes linéaires
ESIEE Paris © Denis BUREAU I N Initiation à la programmation avec le langage Java.
FLSI602 Génie Informatique et Réseaux
FLSI602 Génie Informatique et Réseaux
Les requêtes La Requête est une méthode pour afficher les enregistrements qui répondent à des conditions spécifiques. La requête est donc un filtre.
ALGORITHMES RECURSIFS
Récursivité.
Les structures de données arborescentes
RECURSIVITE ARBRES BINAIRES
8PRO100 Éléments de programmation Allocation dynamique de la mémoire.
TRAITEMENT DE STRUCTURES
Définition d’un maillon de liste
1 Les pointeurs et quelques rappels sur certains éléments du langage C.
IFT-2000: Structures de Données Listes chaînées Dominic Genest, 2009.
Les pointeurs Modes d’adressage de variables. Définition d’un pointeur. Opérateurs de base. Opérations élémentaires. Pointeurs et tableaux. Pointeurs et.
IFT-2000: Structures de données
Arbres Rouge noir Démo : INF3105 Structures de données et algorithmes
Présentation Structures de Données et TDA
Structures de données IFT-2000
Plan cours La notion de pointeur et d’adresse mémoire.
L’essentiel du langage C
Structures des données
Le langage C Structures de données
ECOLE DES HAUTES ETUDES COMMERCIALES MARKETING FONDAMENTAL
Le langage C Rappel Pointeurs & Allocation de mémoire.
Ch. PAUL - Piles et Files à l'aide de listes chainées
CALENDRIER-PLAYBOY 2020.
LES PILES ET FILES.
Les Pointeurs et les Tableaux Statiques et Tableaux Dynamiques
Université Mohammed V-Agdal École Supérieure de Technologie Salé
Notions de pointeurs en C
et quelques rappels sur certains éléments du langage C
Les adresses des fonctions
Un survol du language C.
1 Structures des données. 2  Le tableau permettait de désigner sous un seul nom un ensemble de valeurs de même type, chacune d'entre elles étant repérée.
Structures de données élémentaires dans le contexte du TP #1
ETNA – 1ème année Guillaume Belmas –
TABLEAUX des POINTEURS TRAITEMENT DE STRUCTURES
Cours LCS N°4 Présenté par Mr: LALLALI
Informatique 2A Langage C 5ème séance. Déroulement de la séance 5 1 ère partie Étude des chaînes de caractères 2 ème partie Les structures 3.
Transcription de la présentation:

GEF 243B Programmation informatique appliquée Listes chaînées II §15.1 – 15.2

21-Jan-14 2 JGA Beaulieu Revue Où dans la mémoire est-ce que les listes chaînées sont stockées? Est-ce que chaque nœud dans la liste chaînée possède un nom symbolique (nom de variable)? Quelle est lutilité du pointeur de tête?

21-Jan-14 3 JGA Beaulieu Synopsis Traverser/chercher dans une LC Insérer un nœud 1.À la tête de la LC 2.Après la tête de la LC Effacer un nœud 1.À la tête de la LC 2.Après la tête de la LC 3.Utilisant lindirection

21-Jan-14 4 JGA Beaulieu Traverser – chercher dans une LC Rappel cours Liste Chaìnée I: typedef struct TAG_NOEUD_ETUDIANT { char prenom[15]; char surnom[25]; unsigned long numeroDeCollege; float moyenne; struct TAG_NOEUD_ETUDIANT* pProchainNoeud; } NOEUD_ETUDIANT; //nom du type

21-Jan-14 5 JGA Beaulieu 1.Déclarez un pointeur à la structure de type définit (disons pTraverse ) NOEUD_ETUDIANT* pTraverse = NULL; 2.Met pTraverse à la tête de la liste pTraverse = pListeEtudiants; 3.Vérifie si le pointeur est NULL 4.Traite le nœud courrant 5.Met le pointeur au prochain nœud pTraverse = pTraverse->pProchainNoeud; 6.Retourne à létape 3 jusquà fin Traverser – chercher dans une LC

21-Jan-14 6 JGA Beaulieu Traverser – chercher dans une LC … int compte = 0; NOEUD_ETUDIANT* pTraverse = pListeEtudiants; while (pTraverse != NULL) { compte++; //traite le noeud courrant pTraverse = pTraverse->pProchainNoeud; }//fin while pTraverse …

Allard pProchainNoeud Allen pProchainNoeud Baar pProchainNoeud Alpo pProchainNoeud 0 pListeEtudiants pTraverse compte = 0 pTraverse = pListeEtudiants;

Allard pProchainNoeud Allen pProchainNoeud Baar pProchainNoeud Alpo pProchainNoeud 0 pListeEtudiants pTraverse compte = 1 pTraverse = pTraverse->pProchainNoeud;

Allard pProchainNoeud Allen pProchainNoeud Baar pProchainNoeud Alpo pProchainNoeud 0 pListeEtudiants pTraverse compte = 4 while (pTraverse->pProchainNoeud != NULL) {…}

21-Jan JGA Beaulieu Nous avons déjà vu comment insérer un nœud au début de la liste dans le cours précédent. Avant que nous voulions insérer un nœud dans la LC nous devons la traverser pour chercher le point dinsertion. La seule exception à cette règle est si nous utilisons une liste non-ordonnée. Dans ce cas nous ajoutons toujours les nœuds au début de la liste. Ceci est un cas simple qui est couvert par les étapes pour linsertion dans une liste ordonnée Insertion dun nœud dans une LC

21-Jan JGA Beaulieu 1.Déclarez un nœud temporaire (pTemp) et demander de la mémoire avec malloc On vérifie si il y a assez de mémoire 2.Mettez touts les champs du nœud pointé par pTemp à leurs valeurs appropriées 3.Pour insérer un nœud au début de la liste: a.À la tête de la liste: i.Pointe le nouveau nœud au premier nœud en utilisant le pointeur de tête: pTemp->pProchainNoeud = pListeEtudiants; ii.Pointez le pointeur de tête au nouveau nœud ( pTemp ) pListeEtudiants = pTemp; Insertion dun nœud à la tête dune LC

21-Jan JGA Beaulieu Insertion dun nœud à la tête dune LC //1. créez un nouveau noeud NOEUD_ETUDIANT* pTemp = NULL; pTemp = (NOEUD_ETUDIANT *)malloc(sizeof(NOEUD_ETUDIANT)); //2. initialisez le nouveau noeud strcpy(pTemp->prenom,"Jack"); strcpy(pTemp->surnom,"Rabbit"); pTemp->numeroDeCollege = 22222; pTemp->moyenne = 99.9; //3.a Insérez le nœud à la tête de la liste pTemp->pProchainNoeud = pListeEtudiants; pListeEtudiants = pTemp;

Allard pProchainNoeud 0 pListeEtudiants pTemp Rabbit pProchainNoeud ? Insertion dun nœud à la tête dune LC Étapes 1,2 – déclare et initialise le nœud

Allard pProchainNoeud 0 pListeEtudiants pTemp Rabbit pProchainNoeud 1. pTemp->pProchainNoeud = pListeEtudiants; 2. pListeEtudiants = pTemp; 1 2 Insertion dun nœud à la tête dune LC Étape 3a – déclare et initialise le nœud

21-Jan JGA Beaulieu 1.Créez un nouveau nœud 2.Initialisez le nouveau nœud 3.Pour insérer dans la LC: b.Nimporte où dautre que la tête dans la LC i.Traversez la liste en utilisant pTraverse (ici nous assumons que nous voulons insérer après pTraverse ) ii.Pointez le nouveau nœud où pTraverse pointe (indirection) pTemp->pProchainNoeud = pTraverse->pProchainNoeud; i.Pointez pTraverse au nouveau nœud pTravers->pProchainNoeud = pTemp; Insertion dun nœud après la tête de la LC

21-Jan JGA Beaulieu Insertion dun nœud après la tête de la LC //1. créez un nouveau noeud NOEUD_ETUDIANT* pTemp = NULL; pTemp = (NOEUD_ETUDIANT *)malloc(sizeof(NOEUD_ETUDIANT)); //2. initialisez le nouveau nœud strcpy(pTemp->prenom,"Jack"); strcpy(pTemp->surnom,"Rabbit"); pTemp->numeroDeCollege = 22222; pTemp->moyenne = 99.9; //3.b. insérez le nœud nimporte où dautre dans la LC pTemp->pProchainNoeud = pTraverse->pProchainNoeud; pTravers->pProchainNoeud = pTemp;

Allard pProchainNoeud 0 pListeEtudiants pTemp Rabbit pProchainNoeud ? All pProchainNoeud pTraverse Insertion dun nœud après la tête de la LC Étapes 1,2 – Déclare et initialise le nouveau nœud

Allard pProchainNoeud 0 pListeEtudiants pTemp Rabbit pProchainNoeud 1. pTemp->pProchainNoeud = pTravers->pProchainNoeud; 2. pTravers->pProchainNoeud = pTemp; Allen pProchainNoeud pTraverse 1 2 Insertion dun nœud après la tête de la LC Étape 3b – Déclare et initialise le nouveau nœud

21-Jan JGA Beaulieu 1.Déclarez un nouveau pointeur appelé pPred qui suit pTraverse mais un nœud en arrière 2.Vérifiez si la liste est vide et imprime une erreur si cest le cas 3.Vérifiez si le nœud à être effacé est le premier (la tête) a.nous mettons la tête au prochain nœud dans la liste. pListeEtudiants = pListeEtudiants->pProchainNoeud; b.Libèrez la mémoire Effacer un nœud à la tête de la LC

21-Jan JGA Beaulieu Effacer un nœud à la tête de la LC …//Condition spéciale si le noeud est la tête unsigned long numEfface = 0; //on obtiens cette valeur //1. Déclarez deux pointeurs NOEUD_ETUDIANT *pTraverse = pListeEtudiants; NOEUD_ETUDIANT *pPred = pListeEtudiants; //2. check si la liste est vide if (pListeEtudiants == NULL){…} //imprime erreur et sort //3a. Efface la tête de la liste parce que cest le bon nœud if (pListeEtudiants->numeroDeCollege == numEfface) { pListeEtudiants = pListeEtudiants->pProchainNoeud; free(pTraverse); } else pTraverse = pTraverse->pProchainNoeud; …//pTraverse est maintenant en avant de pPred

Allard pProchainNoeud Allen pProchainNoeud Baar pProchainNoeud Alpo pProchainNoeud 0 pListeEtudiants pTraverse numEfface = pPred Effacer un nœud à la tête de la LC Étapes 1,2 – trouve le nœud à effacer

Allard pProchainNoeud Allen pProchainNoeud Baar pProchainNoeud Alpo pProchainNoeud 0 pListeEtudiants pTraverse numEfface = pPred Effacer un nœud à la tête de la LC Étapes 3a,b – efface le nœud et libère la mémoire

21-Jan JGA Beaulieu 3.Voir si le nœud de tête doit être effacé 4.On fait une recherche pour le nœud à être effacé en testant pour la condition numeroDeCollege match dedans une boucle a.Avance les deux pointeurs ( pTraverse et pPred ) 5.Efface le nœud qui suit pPred a.réglant le pointeur de prochain nœud de pPred comme suit: pPred->pProchainNoeud = pTraverse->pProchainNoeud; b.Libère la mémoire où pTraverse pointe Effacer un nœud après la tête de la LC

21-Jan JGA Beaulieu Effacer un nœud dans une LC - général …//étapes 1 – 3b diapo 20 //4. trouve le nœud à effacer while (pTraverse->numeroDeCollege != numEfface) { pPred = pTraverse; //4a. Avance les pointeurs pTraverse = pTraverse->pProchainNoeud; if (pTraverse == NULL) {…} //check si fin de la LC //si on arrive à la fin sans trouver le nœud //il faut donner une erreur } //5. Efface le nœud et libère la mémoire pPred->pProchainNoeud = pTraverse->pProchainNoeud; free(pTraverse); …

Allard pProchainNoeud Allen pProchainNoeud Baar pProchainNoeud Alpo pProchainNoeud 0 pListeEtudiants pTraverse numEfface = Avance des pointeurs pTraverse en avant de pPred pPred

Allard pProchainNoeud Allen pProchainNoeud Baar pProchainNoeud Alpo pProchainNoeud 0 pListeEtudiants pTraverse numEfface = pPred->pProchainNoeud = pTraverse->pProchainNoeud; free(pTraverse); pPred

21-Jan JGA Beaulieu Effacer un nœud dans une LC - général Vous pouvez aussi vous servir de lindirection pour tenir le prédécesseur du nœud que vous voulez effacer Le code suivant est équivalent au code de la diapo 24 Quand vous vous servez de ce genre dindirection faites attention à ce que vous libérez (free)!

21-Jan JGA Beaulieu while ((pTraverse->pProchainNoeud)->numeroDeCollege != numEfface) { pTraverse = pTraverse->pProchainNoeud; if (pTraverse->pProchainNoeud == NULL) {…} //imprime une erreur et … } pTemp = pTraverse->pProchainNoeud; pTraverse->pProchainNoeud = (pTraverse->pProchainNoeud)->pProchainNoeud; free(pTemp); //Cette ligne est importante …

21-Jan JGA Beaulieu Quiz Time Décrivez les étapes pour traverser une LC Décrivez les étapes pour faire une insertion générale dans une LC