GPA665 Structures de données et algorithmes

Documents pareils
1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Les structures. Chapitre 3

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

Algorithmique, Structures de données et langage C

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Compression de Données - Algorithme de Huffman Document de Conception

Introduction au langage C

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Les structures de données. Rajae El Ouazzani

Programmation en langage C

Chapitre 1 : La gestion dynamique de la mémoire

Java Licence Professionnelle CISII,


Le prototype de la fonction main()

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Les arbres binaires de recherche

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

OS Réseaux et Programmation Système - C5

Utilisation d objets : String et ArrayList

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Cours d initiation à la programmation en C++ Johann Cuenin

Programmer en JAVA. par Tama

SUPPORT DE COURS. Langage C

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

Programme Compte bancaire (code)

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Conventions d écriture et outils de mise au point

Derrière toi Une machine virtuelle!

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

as Architecture des Systèmes d Information

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

#include <stdio.h> #include <stdlib.h> struct cell { int clef; struct cell *suiv; };

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

Programmation C++ (débutant)/instructions for, while et do...while

Travaux Dirigés n 1 : chaînes de caractères

TP2 : tableaux dynamiques et listes chaînées

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Algorithmique et Programmation, IMA

Cours Programmation Système

INITIATION A LA PROGRAMMATION

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

Cours d Algorithmique et de Langage C v 3.0

TD2/TME2 : Ordonnanceur et Threads (POSIX et fair)

TD3: tableaux avancées, première classe et chaînes

Chap III : Les tableaux

Programmation système de commandes en C

Cours de C. Allocation dynamique. Sébastien Paumier

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

MINIMUM. connaissances nécessaires à la programmation des microcontrôleurs PIC18 en langage C (une introduction au langage c A.N.S.

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Corrigés des premiers exercices sur les classes

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Projet de programmation (IK3) : TP n 1 Correction

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

3IS - Système d'exploitation linux - Programmation système

Notions fondamentales du langage C# Version 1.0

Introduction à MATLAB R

Claude Delannoy. 3 e édition C++

Cahier des charges. driver WIFI pour chipset Ralink RT2571W. sur hardware ARM7

Un ordonnanceur stupide

Le langage C. Introduction, guide de reference

Problèmes liés à la concurrence

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte

Notes du cours 4M056 Programmation en C et C++ Vincent Lemaire et Damien Simon

Programmation Classique en langage C

Bases de programmation. Cours 5. Structurer les données

Arguments d un programme

Cours 6 : Tubes anonymes et nommés

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Chapitre 10. Les interfaces Comparable et Comparator 1

Introduction à la programmation concurrente

I. Introduction aux fonctions : les fonctions standards

STS SE. FreeRTOS. Programmation réseau WIFI. Programmation réseau. Socket Tcp. FlyPort smart Wi-Fi module

TRAVAUX PRATIQUES Programmation Système Langage C / Système UNIX. 2 e année Génie Informatique

Introduction au Langage de Programmation C

COMPARAISONDESLANGAGESC, C++, JAVA ET

Programmation C. J.-F. Lalande. 15 novembre 2012

Programmation en langage C d un µcontrôleur PIC à l aide du compilateur C-CCS Sommaire

Programmation avec des objets : Cours 7. Menu du jour

ACTIVITÉ DE PROGRAMMATION

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Une introduction à Java

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Algorithmique I. Algorithmique I p.1/??

Plan du cours. Historique du langage Nouveautés de Java 7

Apprendre Java en 154 minutes

Analyse de sécurité de logiciels système par typage statique

Les fichiers. Chapitre 4

Package Java.util Classe générique

30.avr.10 Présentation miniprojet. 9.mars.10 Cours 3 4.mai.10 Cours C mars.10 Cours 4 11.mai.10 Cours C++ 2

Transcription:

École de technologie supérieure Département de génie de la production automatisée GPA665 Structures de données et algorithmes Solutions du cahier d exercices Série d exercices no. 3 : Les listes élémentaires (les listes chaînées) Session : Automne 2002 Responsable du cours : Mohamed Cheriet, ing., Ph. D. Locaux : Cours : 3740 Chargé de cours : Jean-Christophe Demers Laboratoire : 3324 Chargé de laboratoire : Nicolas Morency

Exercice 1 Le programme montré pour cet exercice est incomplet, donc ne compile pas. En fait, vous devez le considérer comme du pseudo-code. Par exemple la fonction new n est pas définit en langage C (mais elle existe en langage C++). Voici le code de ce programme corrigé : #include <stdlib.h> #include <stdio.h> #include <string.h> #define maxname 8 #define maxfamily 100 typedef struct char Name[maxname]; int age; Person; void NewPerson(Person** P); void main(void) int i; Person *personptr, *family[maxfamily]; NewPerson(&personptr); personptr->age = 25; strcpy(personptr->name, "Fred "); for (i = 0; i < maxname; i++) printf("%c", personptr->name[i]); printf("\test age de \t%d\n", personptr->age); family[10] = personptr; for (i = 0; i < maxname; i++) printf("%c", personptr->name[i]); printf("\test age de \t%d\n", personptr->age); void NewPerson(Person** P) *P = (Person*)malloc(sizeof(Person)); La sortie de ce programme est : Fred??? est âgé de 25 Fred??? est âgé de 25

Exercice 2 Fonction qui compte le nombre de noeuds dans une liste chaînée. int count(node *head) node* current = head; int n = 0; while (current!= NULL) n++; current = current->next; return n; Exercice 3 Fonction qui libère toute la mémoire allouée pour une liste chaînée. Voici deux exemples différents pour une même fonction. Premier exemple : void FreeLinkedList1(node *head) node *First = head, *Temp; while (First!= NULL) Temp = First; First = First->next; free(temp); Deuxième exemple : void FreeLinkedList2(node **head) node *Temp; while (*head!= NULL) Temp = *head; *head = (*head)->next; free(temp); L avantage du deuxième exemple est qu après l exécution de la fonction le pointeur head vaut nul. Ainsi, cette méthode aide à ne pas faire d accès mémoire incorrect.

Exercice 4 Fonction qui copie entièrement une liste chaînée dans une autre. void CopyLinkedList(node *HeadSource, node** HeadTarget) node *CurrentSource = HeadSource; node *CurrentTarget; /* S'assure qu'il y ait au moins 1 élément */ if (HeadSource == NULL) *HeadTarget = NULL; else /* Affectation du premier noeud de la liste chaîné */ CurrentTarget = (node*)malloc(sizeof(node)); CurrentTarget->data = CurrentSource->data; *HeadTarget = CurrentTarget; CurrentSource = CurrentSource->next; /* Affectation de tout les noeuds suivants */ while (CurrentSource!= NULL) CurrentTarget->next = (node*)malloc(sizeof(node)); CurrentTarget->next->data = CurrentSource->data; CurrentSource = CurrentSource->next; CurrentTarget = CurrentTarget->next; CurrentTarget->next = NULL;

Exercice 5 Fonction qui copie le contenu d une liste chaînée en ordre inverse. Voici deux exemples différents pour cette fonction. Premier exemple : void CopyBackward1(node *HeadSource, node** HeadTarget) if (HeadSource!= NULL) CopyBackward1(HeadSource->next, HeadTarget); InsertLast(HeadTarget, HeadSource->data); void InsertLast(node** Head, int Data) node *Cur = *Head, *New = (node*)malloc(sizeof(node)); New->data = Data; New->next = NULL; if (*Head == NULL) *Head = New; else while (Cur->next!= NULL) Cur = Cur->next; Cur->next = New; Deuxième exemple : void CopyBackward2(node *HeadSource, node** HeadTarget) static node* LastTargetNode = *HeadTarget; if (HeadSource!= NULL) CopyBackward2(HeadSource->next, HeadTarget); if (LastTargetNode == NULL) *HeadTarget = (node*)malloc(sizeof(node)); (*HeadTarget)->data = HeadSource->data; (*HeadTarget)->next = NULL; LastTargetNode = *HeadTarget; else LastTargetNode->next = (node*)malloc(sizeof(node)); LastTargetNode->next->data = HeadSource->data; LastTargetNode->next->next = NULL; LastTargetNode = LastTargetNode->next; Le premier exemple possède le désavantage important de parcourir toute la nouvelle liste lors de chaque insertion. Le deuxième exemple parcours la nouvelle liste chaînée en utilisant habilement une variable static qui permet d identifier le dernier noeud de la nouvelle liste pour chaque nouvelle insertion.

Exercice 6a Fonction déterminant si deux listes chaînées circulaires sont identique en considérant les duplications interdites. On suppose une liste chaînée circulaire ordonnée avec un pointeur de liste pointant sur le dernier élément. int IsEqual1(node *L1, node *L2) node *Cur1 = L1, *Cur2 = L2; int Equal = 1; do Cur1 = Cur1->Next; Cur2 = Cur2->Next; if (Cur1 && Cur2 && (Cur1->data == Cur2->data) && ((Cur1->data!= Cur1->next->data) (Cur1 == Cur1->next))) Equal = 0; while (Equal && (Cur1!= L1)); if (Equal && (Cur2 == L2)) return 1; /* EQUAL */ else return 0; /* NOT EQUAL OR DUPLICATE */ Exercice 6b Fonction déterminant si deux listes chaînées circulaires sont identique en considérant les duplications interdites. On suppose une liste chaînée circulaire ordonnée avec un pointeur de liste pointant sur le dernier élément. int IsEqual2(node *L1, node *L2) node *Cur1 = L1, *Cur2 = L2; int Equal = 1; do Cur1 = Cur1->Next; Cur2 = Cur2->Next; if (Cur1 && Cur2 && (Cur1->data == Cur2->data)) Equal = 0; while (Equal && (Cur1!= L1)); if (Equal && (Cur2 == L2)) return 1; /* EQUAL */ else return 0; /* NOT EQUAL */

Exercice 7 Pour l implantation d une chaîne de caractères sous forme de liste chaînée, on suppose que : chaque noeud possède un char pour chaque caractère; la fin de la liste chaînée (pointant vers nul) indique la fin de la chaîne de caractères (ainsi, le caractère \0 n est plus utilisé pour indiquer la fin de la chaîne de caractères). Voici la déclaration du type utilisé : typedef struct _LinkedListStringNode char Character; _LinkedListStringNode *Next; LinkedListStringNode; La fonction de concaténation peut être utilisée à l aide de la fonction qui a été définie au numéro 4 (CopyLinkedList). Évidemment, les types de données ne concordent pas (node* et LinkedListStringNode*). Mais il suffit d adapter ce nouveau type à la même logique et la fonction est utilisable. void StringConcatenation( LinkedListStringNode **StringSource, LinkedListStringNode *StringToConcatenate) LinkedListStringNode* CurSource = *StringSource; if (CurSource == NULL) CopyLinkedList(StringToConcatenate, StringSource); else while (CurSource->next!= NULL) CurSource = CurSource->next; CopyLinkedList(StringToConcatenate, &(CurSource->next)); La fonction de calcul de la longueur est : int StringLength(LinkedListStringNode* HeadString) LinkedListStringNode* Current = HeadString; int n = 0; while (Current!= NULL) n++; Current = Current->next; return n;

Pour implanter la chaîne de caractères sans avoir à parcourir toute la chaîne pour connaître sa longueur, il suffit de garder cette information dans une variable. Ainsi, à chaque insertion on incrémente cette variable et à chaque suppression on décrémente la variable. Une technique élégante et pratique pour implanter une telle technique consiste à définir une structure d entête contenant à la fois le pointeur de tête mais aussi le nombre de caractère. Voici la déclaration d un tel type de donnée : typedef struct _LinkedListStringNode *Head; int Length; LinkedListString; Exercice 8