Le langage C Structures de données

Slides:



Advertisements
Présentations similaires
GEF 243B Programmation informatique appliquée Listes chaînées I – Tableaux de structures §15.1 – 15.2.
Advertisements

Cours de C – Séance dexercices 12 Octobre Exercice 5 Idem quexercice 1 : lire une ligne au clavier Sans limitation de la longueur de la ligne (utilisez.
Chap. 4 Recherche en Table
Rappels C.
GEF 243B Programmation informatique appliquée Listes chaînées II §15.1 – 15.2.
1 UMLV 1. Introduction 2. Hachage ouvert 3. Hachage fermé 4. Implémentation des fonctions Méthodes de hachage.
C.
Algorithme et structure de données
Structures et unions types énumérés Qu'est-ce qu'une structure
Chap. 1 Structures séquentielles : listes linéaires
FLSI602 Génie Informatique et Réseaux
Chapitre IV. Structures linéaires (piles, files, listes chaînées)
ALGORITHMES RECURSIFS
Cours 7 - Les pointeurs, l'allocation dynamique, les listes chaînées
UE NFA006 STRUCTURES DE DONNEES
Structures de données linéaires
Algo-Prog en Ada TD1 2 MIC Romaric GUILLERM
A B D A B D LSC avec « sentinelle »
Récursivité.
Cours d’Algorithmique
Structures de données et algorithmes – C5 Maria-Iuliana Dascalu, PhD
Types de données et représentation
II. Chaînage, SDD séquentielles
RECURSIVITE ARBRES BINAIRES
8PRO100 Éléments de programmation Allocation dynamique de la mémoire.
La fonction alloue un bloc de taille size. Il faut indiquer la taille du bloc que lon veut allouer. Le premier exemple: #include void main()
II. Chaînage, SDD séquentielles
TRAITEMENT DE STRUCTURES
Définition d’un maillon de liste
IFT-2000: Structures de Données Listes chaînées Dominic Genest, 2009.
Quest-ce quune classe dallocation? Une classe dallocation détermine la portée et la durée de vie dun objet ou dune fonction.
Master 1 SIGLIS Java Lecteur Stéphane Tallard Chapitre 5 – Héritage, Interfaces et Listes génériques.
Les pointeurs Enormément utilisé en C/C++ ! Pourquoi? A quoi ça sert?
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
Structures de données IFT-2000
Les listes chaînées par Frédérick Henri.
Exposé en structures de données
IFT-2000: Structures de données Piles et files Dominic Genest, 2009.
TD4 2 IMACS Romaric GUILLERM Algo-Prog en Ada.
L’essentiel du langage C
Algo-Prog en Ada TD1 2 MIC Romaric GUILLERM
Le langage C Rappel Pointeurs & Allocation de mémoire.
Ch. PAUL - Piles et Files à l'aide de listes chainées
LES PILES ET FILES.
Les Pointeurs et les Tableaux Statiques et Tableaux Dynamiques
Université Mohammed V-Agdal École Supérieure de Technologie Salé
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.
La fonction alloue un bloc de taille size. Il faut indiquer la taille du bloc que l’on veut allouer. Le premier exemple: #include void main()
Structures de données élémentaires dans le contexte du TP #1
Arbres binaires et tables de hachage
Chaînage et LSC : motivation et principe Manipuler la LSC : exemples Variantes : LDC, liste circulaire, … Etude de cas : réalisation d’un buffer clavier.
II. Chaînage, SDD séquentielles
ETNA – 1ème année Guillaume Belmas –
Les types composés Les enregistrements.
TABLEAUX des POINTEURS TRAITEMENT DE STRUCTURES
Classe 1 CSI2572 Autres modificateurs de déclaration de variables: & volatile & register & static & auto & extern & const volatile Indique au compilateur.
Tutorat en bio-informatique Le 15 novembre Exercices 1 et 2 (MAT1400) - solutions Chapitre 12.2, Analyse - concepts et contextes vol. 2 19) Calculez.
Structures de données élémentaires
8PRO107 Éléments de programmation Les tableaux. Étude de cas 1 Description du problème : Lire une liste d’entiers et l’afficher d’abord dans le même ordre.
 Chaînage et LSC : motivation et principe Manipuler la LSC : exemples Variantes : LDC, liste circulaire, … Etude de cas : réalisation d’un buffer clavier.
Exercices sur les pointeurs. lireCar/remettreCar Lorsque l’on lit caractère par caractère, on ne peut pas savoir qu’on a atteint un caractère avant de.
Chaînage et LSC : motivation et principe  Manipuler la LSC : exemples Variantes : LDC, liste circulaire, … Etude de cas : réalisation d’un buffer clavier.
CSI2510 Structures des Données et Algorithmes
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.
Les structures de base Listes chainées. Listes Les listes(similaire aux tableaux) sont des structures informatiques qui permettent de garder en mémoire.
Transcription de la présentation:

Le langage C Structures de données Les listes simplement chaînées

Plan Principe Liste chaînée Vs. Tableau Construction Parcours Insertion Suppression Fonctions de manipulation

Principe Notion de maillon L'élément de base d'une liste chaînée s'appelle le maillon. Il est constitué : * d'un champ de données ; * d'un pointeur vers un maillon. données pointeur

Principe Maillon suivant Le champ pointeur vers un maillon pointe vers le maillon suivant de la liste. S'il n'y a pas de maillon suivant, le pointeur vaut NULL.

Principe Notion de liste Une liste simplement chaînée est un pointeur sur un maillon. Une liste vide est une liste qui ne contient pas de maillon. Elle a donc la valeur NULL. NULL

Principe La terminologie suivante est généralement employée : * le premier maillon de la liste est appelé tête ; * le dernier maillon de la liste est appelé queue. Rq : il se peut que les maillons qui composent la liste ne soit pas placées dans l'ordre en mémoire et encore moins de façon contiguë. NULL queue tête

Liste chaînée Vs. Tableau Dans une liste chaînée : la taille est inconnue au départ, la liste peut avoir autant d'éléments que votre mémoire le permet. Pour déclarer une liste chaînée il suffit de créer le pointeur qui va pointer sur le premier élément de votre liste chaînée, aucune taille n'est à spécifier donc. Il est possible d'ajouter, de supprimer, d'intervertir des éléments d'un liste chaînées en manipulant simplement leurs pointeurs.

Construction Le maillon Il faut déclarer les types constituant le maillon. Exemple : //pointeur sur maillon typedef struct s_maillon *p_maillon_t; //maillon typedef struct s_maillon { int valeur; p_maillon_t suivant; } maillon_t;

Construction La liste Maintenant on déclare les types constituant la liste : //liste typedef p_maillon_t liste_t; //pointeur sur liste typedef liste_t *p_liste_t;

Construction Deux types de fonctions vont interagir avec les listes : * les fonctions qui utilisent les listes : elles voient l'aspect externe des listes (les types liste_t et p_liste_t) * les fonctions qui gèrent les listes : elles voient l'aspect interne des listes (les types maillon_t et p_maillon_t). Les fonctions qui utilisent les listes n'ont pas à savoir que les listes sont constituées de maillons.

Parcours D’après son principe et sa construction, le parcours d’une liste simplement chaînée se fait uniquement du début vers la fin. Illustrons ceci par le calcul de la longueur d’une liste simplement chaînée. NULL

Parcours Longueur de la liste * Version itérative : int longueur_i(liste_t liste) { p_maillon_t p_maillon = liste; int longueur = 0; while (p_maillon != NULL) longueur++; p_maillon = p_maillon->suivant; } return longueur;

Parcours Longueur de la liste * Version récursive : int longueur_r(liste_t liste) { p_maillon_t p_maillon = liste; if (p_maillon != NULL) return 1 + longueur_r(p_maillon->suivant); } return 0;

Parcours Exercice : (correction en TP) Affichage de la liste. Écrire les fonctions permettant l’affichage du contenu de la liste en version itérative et récursive.

Insertion Insertion en tête

Insertion Insertion en tête { p_maillon_t p_maillon_ancien = *p_liste; void insertion_en_tete(p_liste_t p_liste, int entier) { p_maillon_t p_maillon_ancien = *p_liste; p_maillon_t p_maillon_nouveau = NULL; p_maillon_nouveau = malloc(sizeof(maillon_t)); p_maillon_nouveau->valeur = entier; p_maillon_nouveau->suivant = p_maillon_ancien; *p_liste = p_maillon_nouveau; }

Insertion Insertion en queue

Insertion Insertion en queue (version récursive) void insertion_en_queue(p_liste_t p_liste, int entier) { p_maillon_t p_maillon = *p_liste; if (p_maillon == NULL) insertion_en_tete(p_liste, entier); } else insertion_en_queue(&(p_maillon->suivant), entier); version itérative en exercice

Suppression Suppression en tête int suppression_en_tete(p_liste_t p_liste) { p_maillon_t p_maillon = *p_liste; int resultat = 0; if (p_maillon != NULL) resultat = p_maillon->valeur; *p_liste = p_maillon->suivant; free(p_maillon); } return resultat;

Suppression Suppression en queue (version récursive) int suppression_en_queue(p_liste_t p_liste) { p_maillon_t p_maillon = *p_liste; int resultat = 0; if (p_maillon != NULL) if (p_maillon->suivant == NULL) resultat = suppression_en_tete(p_liste); } else resultat = suppression_en_queue(&(p_maillon->suivant)); return resultat; version itérative en exercice

Fonctions de manipulation Au vu de l'utilisation des listes chaînées, il se dessine clairement quelques fonctions indispensables : * Initialisation (à vide) * Ajout d'un élément (à un emplacement i) * Suppression d'un élément (ième élément) * Accès à l'élément suivant * Accès aux données * Accès au premier élément de la liste * Accès au dernier élément de la liste * Suppression de la liste entière À préparer pour le TP