Eléments d’Informatique Cours11 – Allocation dynamique, listes chaînées Catherine Recanati.

Slides:



Advertisements
Présentations similaires
Rappels C.
Advertisements

8PRO100 Éléments de programmation Allocation dynamique de la mémoire.
Le langage C Structures de données
Les types composés Les enregistrements.
TABLEAUX des POINTEURS TRAITEMENT DE STRUCTURES
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.
C++ Les fonctions. Présentation Utilité : Dès qu'un programme dépasse la centaine de lignes de code, il est pratique de pouvoir le décomposer en plusieurs.
CINI – Li115 1 Semaine 9 Algorithmes de tri ● Introduction ● Tri à bulle ● - principe ● - algorithme ● - efficacité ● Tri par sélection ● - principe, algorithme,
1 © Copyright 2005, Philippe Arlotto tln.fr Creative Commons Attribution-ShareAlike 2.0 license 25/09/2016 ● Algorithmique & Langage.
Tableaux et Pointeurs Chaînes de Caractères Programmation Impérative II.
CINI – Li115 1 Semaine 5 Les tableaux ● Qu'est-ce qu'un tableau ? ● Déclarer et initialiser un tableau ● Fixer la taille d'un tableau ● Opérations classiques.
CINI – Li115 1 Semaine 10 Les pointeurs ● Notion d'adresse ● Déclaration et utilisation de pointeurs ● "Types pointeur" et initialisation des pointeurs.
1 Programmation en C++ C++ de base ● Programme C++ ● Variables, objets, types ● Fonctions ● Namespace ● Tests ● Boucles ● Pointeurs, références.
1 © Copyright 2005, Philippe Arlotto tln.fr Creative Commons Attribution-ShareAlike 2.0 license 27/09/2016 Algorithmique & Langage.
1 Programmation en C++ C++ de base ● Programme C++ ● Variables, objets, types ● Types et opérations fondamentales ● Tests ● Boucles ● Pointeurs, références.
CINI – Li115 1 Semaine 11 Les pointeurs (suite) ● Tableaux et pointeurs ● Questions sur les pointeurs.
Tableaux en C Mardi 2/05.
Le Langage JavaScript pour le web
Semaine 8 Retour sur les tableaux : fonctions et récursivité
Synthèse TP 2 Codeblock 1 Les objectifs de ce tp sont :
Les tableaux différencier les variables simples des variables indicées (ordonnées et numérotées) un identificateur unique désigne un ensemble, une collection.
Introduction au Langage Pascal
Structure et Services « STS » Menu Structures : Divisions
Pas de variable globale
Algorithmiques Abdelbasset KABOU
Allocation dynamique de mémoire
Pointeurs et langage C.
Algorithmique et programmation de modèles numériques
Collecte de données CAPI
AO (Architecture des ordinateurs)
Principes de programmation (suite)
Algorithmique Langage C
11ième Classe (Mardi, 18 novembre) CSI2572
Semaine 11 Les pointeurs (suite)
Les fonctions.
Matrices, déclaration en CSharp
SIF-1053 Architecture de ordinateurs
Tableaux à plusieurs dimensions en langage C
Tableaux à plusieurs dimensions en langage C
Les chaînes de caractères et le langage C
Algorithmique & Langage C
Routage S 3 - Questionnaire N°1
IFT1969 Programmation scientifique en C Michel Reid.
6. Les types utilisateurs et les structures de données
Piles.
Notions de pointeurs en C
Constantes énumérées.
Cours N°9: Algorithmiques Les Tableaux 1
Les tableaux.
Programmation en C++ C++ de base
Structure D’une Base De Données Relationnelle
1 RECURSIVITE PRESENTATION Ch. PAUL ALGORITHMIQUE Présentation de la récursivité.
Constantes énumérées.
Les structures en langage C
Calcul Scientifique Initiation à SCILB
Eléments de base du langage C
Bases de données sous Access. Initiation aux bases de données  Structure d’une base de données.
Les classes et les objets
Les structures de base Listes chainées. Listes Les listes(similaire aux tableaux) sont des structures informatiques qui permettent de garder en mémoire.
Les exceptions Le mécanisme des exceptions est destiné à permettre aux fonctions profondes d'une bibliothèque de notifier la survenue d'une erreur aux.
Cours Programmation en C. Traitement de l’information Catégorie d’information Les données Les résultats Les informations intermédiaires.
Chapitre 3: Les listes simplement chaînées A.ABDALI MIPC/MIP S
Principes de programmation (suite)
Quelle est la valeur de S après exécution des instructions suivantes :
QCM Pointeurs 2 / Q1 On considère la déclaration suivante : char *ptc ; ptc peut contenir : 1) des valeurs de variables de type caractère 2) des adresses.
Présentation Chaînage dynamique Retour sur les tableaux
Listes Chaînées.
Tableau de bord d’un système de recommandation
Python Nicolas THIBAULT
Eléments de base du langage C
Transcription de la présentation:

Eléments d’Informatique Cours11 – Allocation dynamique, listes chaînées Catherine Recanati

Plan général Représentation des nombres. Notion de variable. Programme. Expressions. Architecture des ordinateurs: langage machine, langage assembleur, AMIL. Systèmes d’exploitation : fichiers, processus, compilation. Instructions de contrôle: boucles et branchements. Programme. Définition de fonction. Appel fonctionnel. Tableaux de variables et fonctions d’arguments de type tableau. Sens d’un programme, pile d’exécution, compilation. Pointeurs et tableaux. Chaines de caractères, bibliothèque <string.h>. Allocation dynamique, liste chaînées. Révisions.

Notes du partiel P1: Elles sont affichées. Si vous voulez voir votre copie, il n’y a actuellement qu’une seule possibilité : demain (mardi) dans mon bureau B213 de 10h30 à 13h30, de 14h30 à 17h15 Ensuite, je ne serai plus disponible avant début janvier

Programme du partiel P2: Programme du premier partiel + les fonctions et les tableaux statiques d'entiers à une seule dimension (surtout les cours de CM5 à CM9 en sus de CM1, et CM2 principalement). Il y aura à coup sûr plusieurs exercices avec des fonctions d'argument de type tableau (TD7, TD8 et TD9). Ceux qui traiteront ces exercices en utilisant des pointeurs auront des points de bonus supplémentaires.

Programme détaillé du partiel P1: - Codage d'un entier, d'un réel rationnel, d’un caractère. Variable, types simples de variable, identificateur de variable, valeur, adresse de variable et affectation. - une certaine familiarité avec la notation BNF et, pouvoir reconnaître une expression, une définition ou déclaration de fonction et un appel de fonction. - Vous devrez aussi maîtriser le sens des instructions de contrôle (en particulier des boucles) et la structure syntaxique d'un programme (bloc, main, déclaration/définition).

Programme du partiel P1 (suite): Compilation: comprendre dans les grandes lignes ce que fait le compilateur, et être capable de distinguer différentes sortes d'erreurs détectées par le compilateur selon les 5 étapes de la compilation (1.préprocesseur, 2.analyse lexicale, 3.analyse syntaxique, 4.analyse sémantique, 5.éditeur de liens). => Mais vous n’avez pas à connaitre dans les moindres détails les cours CM3, CM4 (même chose pour CM8). Ces cours sont destinés à vous aider à comprendre le fonctionnement du compilateur.

Nouveaux ajouts pour P2 : fonctions tableaux statiques à une dimension (TD7, TD8 et TD9) + les TP correspondants. Pour les pointeurs et les tableaux : pointeur comme adresse (cours CM2, etc. jusqu’à CM9) CM10 et CM11 ne sont pas à proprement parler au programme, au sens où vous n’êtes pas obligé de maitriser les pointeurs et le parcours de tableau avec des pointeurs. (les points du sujet accordés pour cette maitrise s’il y en a, seront des points bonus supplémentaires au barème).

Points de CC: Votre note de CC sera élaborée à partir des 3 QCC. Il y aura peut-être des points de présences accordés pour améliorer votre moyenne à ces 3 QCC. Il n’y aura pas de QCC cette semaine. aucun point de présence ne sera compté pour cette semaine pour améliorer votre note de CC, mais les feuilles de présences seront transmises comme il se doit à l’administration.

- Cours 11 – Allocation dynamique, listes chaînées le type complexe struct types complexes listes chaînées

void * malloc(size_t size); Plan void * malloc(size_t size); Allocation dynamique La fonction malloc alloue size bytes de mémoire et retourne un pointeur sur l’espace alloué. On force alors la conversion de ce pointeur par le type des données souhaitées. Exemple: typ *pt = (typ*) malloc(n*sizeof(typ)) ... free (pt); /* libère l’espace alloué précédemment par malloc */ types complexes le type struct listes chaînées Il n’y a pas de type « chaîne de caractères » explicite en C. Celles-ci sont simplement représentées par un tableau de caractères. La fin de la chaîne est indiquée par le caractère spécial ’\0’ . En pratique, cela implique qu’un tableau de N caractères peut contenir une chaîne d’au plus (N􀀀 1) caractères, le Nème caractère étant le caractère de terminaison de chaîne. 8

void * malloc(size_t size); Plan void * malloc(size_t size); Allocation dynamique int main() { char* tab[]; // sa taille n’est pas fixée tab = (char*)malloc(10*sizeof(char)); // la taille de tab est maintenant fixée // à 10, et sa valeur (constante) aussi. tab[0] = 1; ... tab[9] = 567; } types complexes le type struct listes chaînées Il n’y a pas de type « chaîne de caractères » explicite en C. Celles-ci sont simplement représentées par un tableau de caractères. La fin de la chaîne est indiquée par le caractère spécial ’\0’ . En pratique, cela implique qu’un tableau de N caractères peut contenir une chaîne d’au plus (N􀀀 1) caractères, le Nème caractère étant le caractère de terminaison de chaîne. 8

Types complexes Plan Allocation dynamique Le langage C propose deux types complexes permettant au programmeur d’utiliser d’autres types construits à partir des types primitifs : le type tableau qui peut contenir un certain nombre de données d’un même type le type structure qui peut contenir des données de types différents Types complexes Le type struct Listes chaînées Rappels Tableaux de variables Déclarations et Initialisations Fonctions d’argument de type tableau Passage d’argument de type tableau Warning du compilateur Conversions de types

Un tableau est une variable composée de données de même type, stockées de manière contiguë en mémoire (les unes à la suite des autres). Une structure est une variable composée de données de types hétérogènes, stockées en mémoire les unes derrière les autres. Plan Allocation dynamique Types complexes donnée ... Le type struct Listes chaînées donnée (type 1) (type 2) ... (type n)

Le type struct Déclaration d’un type de structure nommée toto. Plan Allocation dynamique Déclaration d’un type de structure nommée toto. struct toto { int val; char f; int tab[]; } ; - sizeof (toto) renverra la place mémoire nécessaire à une variable de type « struct  toto ». Types complexes Le type struct Listes chaînées Il n’y a pas de type « chaîne de caractères » explicite en C. Celles-ci sont simplement représentées par un tableau de caractères. La fin de la chaîne est indiquée par le caractère spécial ’\0’ . En pratique, cela implique qu’un tableau de N caractères peut contenir une chaîne d’au plus (N􀀀 1) caractères, le Nème caractère étant le caractère de terminaison de chaîne. 8

int tab[]; /* ou int* tab; */ } ; struct toto { int val; char f; int tab[]; /* ou int* tab; */ } ; On accèdera aux champs (de types divers) avec l’opérateur Point « . » ex: struct toto x; // declaration /* la place pour une variable x de type struct toto est réservée */ x.val= 8; x.f = ‘\n’; x.tab[0]=0; Plan Allocation dynamique Types complexes Le type struct Listes chaînées Il n’y a pas de type « chaîne de caractères » explicite en C. Celles-ci sont simplement représentées par un tableau de caractères. La fin de la chaîne est indiquée par le caractère spécial ’\0’ . En pratique, cela implique qu’un tableau de N caractères peut contenir une chaîne d’au plus (N􀀀 1) caractères, le Nème caractère étant le caractère de terminaison de chaîne. 8

struct toto { int val; char f; struct toto* pt; } ; Grâce à une définition récursive et l’utilisation de pointeur, on va pouvoir créer des listes chainées d’éléments de type toto : Plan Allocation dynamique Types complexes Le type struct Listes chaînées Il n’y a pas de type « chaîne de caractères » explicite en C. Celles-ci sont simplement représentées par un tableau de caractères. La fin de la chaîne est indiquée par le caractère spécial ’\0’ . En pratique, cela implique qu’un tableau de N caractères peut contenir une chaîne d’au plus (N􀀀 1) caractères, le Nème caractère étant le caractère de terminaison de chaîne. 8 4 a 9 b 2 z

Comparaison des deux types de structures de données complexes : tableau et liste chaînée. Un tableau 6 4 9 2 Une liste chaînée d’éléments (de type struct) 6 4 9 2

6 4 9 2 Un tableau, tab taille fixe (connue à la création) adresse du premier élément connue stockage continu: on peut accéder directement au i-ème élément tab[i] erreur d’exécution si on cherche à accéder à un élément inexistant (tab[j] avec j >= taille du tableau ou j < 0) supprimer ou ajouter un élément est difficile (réallocation et/ou recopie)

Une liste chaînée d’éléments 6 4 9 2 taille inconnue (variable), limitée uniquement par la mémoire disponible impossible d’accéder directement à l’élément de rang i s’il n’y a pas d’élément suivant, l’adresse indiquée pour ce dernier sera NULL il est facile d’ajouter ou de supprimer un élément (sans avoir à recréer la liste)

Plan Listes chaînées en C Allocation dynamique Définition d’une structure appelée element. C’est une définition récursive (dite aussi auto-référentielle): struct element { int valeur; struct element *suivant; } ; Une liste chaînée sera un pointeur sur une structure de ce type. Types complexes Le type struct Listes chaînées Il n’y a pas de type « chaîne de caractères » explicite en C. Celles-ci sont simplement représentées par un tableau de caractères. La fin de la chaîne est indiquée par le caractère spécial ’\0’ . En pratique, cela implique qu’un tableau de N caractères peut contenir une chaîne d’au plus (N􀀀 1) caractères, le Nème caractère étant le caractère de terminaison de chaîne. 8

struct element *suivant; } ; typedef struct element element; int valeur; struct element *suivant; } ; typedef struct element element; typedef element* liste; // trois déclarations équivalentes struct element* liste1 = NULL; element* liste2 = NULL; liste liste3 = NULL; Plan Allocation dynamique Types complexes Le type struct Listes chaînées Il n’y a pas de type « chaîne de caractères » explicite en C. Celles-ci sont simplement représentées par un tableau de caractères. La fin de la chaîne est indiquée par le caractère spécial ’\0’ . En pratique, cela implique qu’un tableau de N caractères peut contenir une chaîne d’au plus (N􀀀 1) caractères, le Nème caractère étant le caractère de terminaison de chaîne. 8

Fonction de création (d’une liste) d’un élément Plan Fonction de création (d’une liste) d’un élément Allocation dynamique element* newElement (int val) { element* nouvElem = (element *) malloc (sizeof(element)); nouvElem->valeur = val; nouvElem->suivant = NULL; return nouvElem; } Types complexes Le type struct Listes chaînées Il n’y a pas de type « chaîne de caractères » explicite en C. Celles-ci sont simplement représentées par un tableau de caractères. La fin de la chaîne est indiquée par le caractère spécial ’\0’ . En pratique, cela implique qu’un tableau de N caractères peut contenir une chaîne d’au plus (N􀀀 1) caractères, le Nème caractère étant le caractère de terminaison de chaîne. 8 nouvElem val

Algorithme d’affichage liste 6 4 9 2 p p p printf("(%d", p->valeur); // ici: (6 while ( (p = p->suivant) != NULL) printf(", %d", p->valeur); // puis: , 4 printf(")\n"); Lorsqu’on déclare une liste chaînée par l’une des 3 déclarations précédentes, le compilateur se contente de créer un pointeur, mais la place mémoire nécessaire pour stocker un premier élément n’est pas allouée. On va maintenant voir l’affichage

void affiche (liste list) { element * p = list; if (p == NULL) { // on affiche “()” printf(“()”); return ; } printf("(%d", p->valeur); // “(“ et 1er caract. while ( (p = p->suivant) != NULL) printf(", %d", p->valeur); // les suivants... printf(")\n"); // et pour terminer “)” return; } Lorsqu’on déclare une liste chaînée par l’une des 3 déclarations précédentes, le compilateur se contente de créer un pointeur, mais la place mémoire nécessaire pour stocker un premier élément n’est pas allouée.

Suite du programme ... insertion d'un élément en tête insertion d’un élément en queue ... recherche d'un élément suppression d’un élément

Ajouter un élément en tête de liste 4 7 8 Lorsqu’on déclare une liste chaînée par l’une des 3 déclarations précédentes, le compilateur se contente de créer un pointeur, mais la place mémoire nécessaire pour stocker un premier élément n’est pas allouée. 2 2 5 3

Ajouter un élément en tête de liste 4 7 8 2 2 5 3

liste 4 7 8 deb 2 5 3

Merci pour votre attention ! Des questions ? Plan Merci pour votre attention ! Des questions ? Allocation dynamique Types complexes Le type struct Listes chaînées Le for est la boucle la plus utilisée. 29