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



Documents pareils
Les structures de données. Rajae El Ouazzani

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

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

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

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

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

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

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

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)

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

Cours 6 : Tubes anonymes et nommés

Les structures. Chapitre 3

V- Manipulations de nombres en binaire

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

Java Licence Professionnelle CISII,

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Les arbres binaires de recherche

Les processus légers : threads. Système L3, /31

Algorithmique, Structures de données et langage C

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Cours de Systèmes d Exploitation


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

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

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

TP2 : tableaux dynamiques et listes chaînées

1 Recherche en table par balayage

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

Introduction au langage C

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

Poker. A rendre pour le 25 avril

INITIATION A LA PROGRAMMATION

Programmation avec des objets : Cours 7. Menu du jour

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

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

Le prototype de la fonction main()

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

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Cours Programmation Système

Programmation en langage C

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Projet L1, S2, 2015: Simulation de fourmis, Soutenance la semaine du 4 mai.

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

Algorithmique et Programmation, IMA

Chapitre 1 : La gestion dynamique de la mémoire

Arguments d un programme

Les algorithmes de base du graphisme

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

Représentation d un entier en base b

Le langage C. Séance n 4

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

Programmer en JAVA. par Tama

Initiation. àl algorithmique et à la programmation. en C

Programmation Classique en langage C

Projet de programmation (IK3) : TP n 1 Correction

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

Introduction à MATLAB R

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

I. Introduction aux fonctions : les fonctions standards

Cours de C. Allocation dynamique. Sébastien Paumier

Premiers Pas en Programmation Objet : les Classes et les Objets

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Cours d Algorithmique et de Langage C v 3.0

Conventions d écriture et outils de mise au point

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

Utilisation d objets : String et ArrayList

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

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

SUPPORT DE COURS. Dr. Omari Mohammed Maître de Conférences Classe A Université d Adrar Courriel : omarinmt@gmail.com

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

INF111. Initiation à la programmation impérative en C amini/cours/l1/inf111/ Massih-Reza Amini

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

Arbres binaires de recherche

Programme Compte bancaire (code)

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

Initiation à l algorithmique

Programmation système de commandes en C

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

Traduction des Langages : Le Compilateur Micro Java

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

Programmation système I Les entrées/sorties

Solutions du chapitre 4

Cours 14 Les fichiers

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

2. Comprendre les définitions de classes

Cours de Programmation Impérative: Zones de mémoires et pointeurs

Informatique III: Programmation en C++

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

Programmation impérative

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

Assurance Qualité. Cours de génie logiciel. Renaud Marlet. LaBRI / INRIA (d'après A.-M. Hugues) màj 23/04/2007

TP, première séquence d exercices.

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

Le système de gestion des fichiers, les entrées/sorties.

PROJET 1 : BASE DE DONNÉES REPARTIES

Les fichiers. Chapitre 4

COMPARAISONDESLANGAGESC, C++, JAVA ET

Tp 1 correction. Structures de données (IF2)

Les chaînes de caractères

Transcription:

#include <stdio.h> #include <stdlib.h> struct cell int clef; struct cell suiv; ; / longueur. pc->suiv est l abréviation de (pc).suiv. pour cette fonction comme pour les suivantes, on donne, lorsqu il existe une version non-récursive et une récursive, les deux versions. / int longueur(struct cell pc) int nbr = 0; nbr++; return nbr; int longueur_rec(struct cell pc) if (pc == NULL) return 0; return 1 + longueur_rec(pc->suiv); / afficher La version récursive n est demandée que pour la forme : elle est n est pas plus simple que la version non récursive si l on souhaite éviter l affichage de "Liste Vide" après le dernier élément de la liste ou l affichage de \n multiples. / void afficher (struct cell pc) if (pc == NULL) printf("liste Vide"); else printf("%d ",pc->clef); printf("\n"); void afficher_rec(struct cell pc) if (pc == NULL) printf("liste Vide\n"); else 1

2 printf("%d ",pc->clef); if (pc->suiv!= NULL) afficher_rec(pc->suiv); else printf("\n"); / empiler rien de difficile. / struct cell empiler(struct cell pc, int n) struct cell pn = malloc(sizeof(struct cell)); / ajouter. la version non récursive est plus complexe : on crée la cellule pn à ajouter. si la liste est vide : on renvoie la liste réduite à pn. sinon : à l aide du pointeur mobile pm, on parcourt la liste, jusqu à la dernière cellule. on chaîne cette cellule avec la cellule crée. on renvoie l adresse de la première cellule. pour la version récursive : si la liste est vide : on crée la cellule pn à ajouter. on renvoie la liste réduite à pn. sinon : on chaîne la première cellule à la liste obtenue par ajout d une nouvelle cellule à pc->suiv. on renvoie l adresse de la première cellule. / struct cell ajouter(struct cell pc, int n) struct cell pn = malloc(sizeof(struct cell)); if (pc == NULL) pn->suiv = NULL; else struct cell pm = pc; while (pm->suiv!=null) pm = pm->suiv; pm->suiv = pn; pn->suiv = NULL;

3 struct cell ajouter_rec(struct cell pc, int n) if (pc == NULL) struct cell pn = malloc(sizeof(struct cell)); else pc->suiv = ajouter_rec(pc->suiv,n); / depiler rien de difficile. / struct cell depiler(struct cell pc) if (pc!= NULL) struct cell pcs = pc->suiv; pc = pcs; / supprimer il faut, quel que soit la version, distinguer les cas : - liste vide - liste à un seul élément - liste à au moins deux éléments dans la version non-récursive, la difficulté est d avancer dans la liste jusqu à l avant-dernière cellule. / struct cell supprimer(struct cell pc) if (pc->suiv == NULL) return NULL; struct cell pm = pc; while (pm->suiv->suiv!= NULL) pm = pm->suiv; free(pm->suiv); pm->suiv = NULL;

4 struct cell supprimer_rec(struct cell pc) if (pc->suiv == NULL) return NULL; pc->suiv = supprimer_rec(pc->suiv); / detruire / void detruire(struct cell pc) while (pc!= NULL) pc = depiler(pc); void detruire_rec(struct cell pc) if (pc!= NULL) detruire_rec (pc->suiv); / copier la version récursive est de loin la plus simple. pour la non-récursive, on a, à partir de la seconde itération : - ppc pointe vers la toute première cellule créée, - pn recoit l adresse d une nouvelle cellule, - pnp pointe vers la cellule crée à l étape précédente, Noter que l on est obligé de distinguer la première étape des suivantes (à la 1ère, ppc pointe vers NULL, sa valeur d initialisation avant la boucle). / struct cell copier(struct cell pc) struct cell ppc = NULL, pnp; struct cell pn = malloc(sizeof(struct cell)); pn->clef = pc->clef; if (ppc == NULL) ppc = pn; pnp = pn; else pnp = pn; pnp->suiv = pn; pnp->suiv = NULL; return ppc;

5 struct cell copier_rec(struct cell pc) struct cell pcc = copier_rec(pc->suiv); return empiler(pcc,pc->clef); / chainer la version récursive est encore la plus compacte. / struct cell chainer(struct cell pc1, struct cell pc2) if (pc1 == NULL) return pc2; struct cell pm = pc1; while (pm->suiv!= NULL) pm = pm->suiv; pm->suiv = pc2; return pc1; struct cell chainer_rec(struct cell pc1, struct cell pc2) if (pc1 == NULL) return pc2; pc1->suiv = chainer_rec(pc1->suiv,pc2); return pc1; / inserer_trie et copier_trie la version non-récursive est un cauchemar à écrire correctement. en pratique, ce genre de fonction doit être écrit par récurrence. / struct cell inserer_trie(struct cell pc, int n) struct cell pn = malloc(sizeof(struct cell)); if (pc == NULL pc->clef >= n) struct cell pm = pc; while (pm->suiv!= NULL && pm->suiv->clef < n) pm = pm->suiv; pn->suiv = pm->suiv; pm->suiv = pn; struct cell inserer_trie_rec(struct cell pc, int n) if (pc == NULL pc->clef >= n)

6 struct cell pn = malloc(sizeof(struct cell)); pc->suiv = inserer_trie_rec(pc->suiv,n); struct cell copier_trie(struct cell pc) struct cell pct = NULL; pct = inserer_trie(pct,pc->clef); afficher_rec(pct); return pct; / inversion on réorganise en pci la liste pc, par itération. un exemple de fonction sur les listes où une écriture par récurrence serait inefficace. / struct cell inverser(struct cell pc) struct cell pci = NULL; struct cell pctmp = pc->suiv; pc->suiv = pci; pci = pc; pc = pctmp; return pci; main()