Vous êtes sur la page 1sur 149

Algorithmique et Structures de Donnes

DUT-GI (S2) Anne universitaire: 2009-2010


Pr. Mohamed NAIMI
Universit Hassan 1er Ecole Suprieure de Technologie Berrechid (ESTB)

Rappels sur lalgorithmique de base

Dfinitions (1)
Algorithmique:

Conception de mthodes pour la rsolution de problmes: Description des donnes dun problme (spcification des entres du problme). Description des mthodes pour rsoudre le problme (spcification des sorties partir des entres). Test des mthodes proposes.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

Dfinitions (2)
Algorithme:

Suite finie dtapes vrifiant: Chaque tape est dcrite de faon prcise. Chaque tape est dterministe (produit des rsultats uniques). Lalgorithme sarrte aprs un nombre fini dinstructions. Reoit des donnes en entre. Produit des donnes en sortie. Applicable des ensembles diffrents de donnes dentre.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

Dfinitions (3)
Efficacit:

Minimisation du temps de calcul. Optimisation de lespace mmoire utilis. Organisation des donnes: Choix des structures de donnes. Implmentation: Choix dun langage de programmation. Traduction de lalgorithme en un programme informatique.

Ralisation:

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

Intrt de lalgorithmique
Sparation analyse/codage (pas de proccupation de syntaxe). Lalgorithmique exprime les instructions rsolvant un problme donn indpendamment des particularits de tel ou tel langage.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

Problme et instance du problme


Exemple dun problme:

Tri dun ensemble dlments: Entre: suite de n lments A1, A2,, An. Sortie: la suite ordonne. Suite de nombres: 475, 787, 34, 245, 56, 350. Suite de noms: Pierre, Christine, Sylvie, Samuel, Fabien.

Instances du problme:

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

Etapes de rsolution dun problme

Enonc du problme Spcification Cahier des charges Analyse Algorithme Traduction en langage Programme source Compilation Programme excutable Tests et modifications Version finale et rsultats

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

Reprsentation dun algorithme


Lorganigramme:

Reprsentation graphique avec des symboles (carrs, losanges,). Vue densemble de lalgorithme. Reprsentation quasiment abandonne aujourdhui. Reprsentation textuelle avec une srie de conventions ressemblant un langage de programmation (sans les problmes de syntaxe). Plus pratique pour crire un algorithme. Reprsentation largement utilise.

Le pseudo-code:

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

Notion de variable
Dans les langages de programmation, une variable sert stocker la valeur dune donne. Une variable dsigne en fait un emplacement mmoire dont le contenu peut changer au cours dun programme (do le nom variable). Les variables doivent tre dclares avant dtre utilises, elles doivent tre caractrises par:

Un nom (identificateur). Un type (entier, rel, caractre, chane de caractres,).

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

10

Choix des identificateurs (1)


De prfrence, un nom doit commencer par une lettre alphabtique.

Exemple valide: A1. Exemple invalide: 1A.

De prfrence, un nom doit tre constitu uniquement de lettres non accentues, de chiffres et du soulignement _ (Eviter les caractres de ponctuation et les espaces).

Exemple valide: GI_S2. Exemple invalide: GI;S2.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

11

Choix des identificateurs (2)


Un nom doit tre diffrent des mots rservs du langage (par exemple en C: int, float, else, switch, case, default, for, main, return,). La longueur du nom doit tre infrieure la taille maximale spcifie par le langage utilis. Conseil:

Choisir des noms significatifs pour dsigner les donnes manipules. Exemples: prix_HT, prix_TTC.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

12

Types des variables (1)


Le type dune variable dtermine lensemble des valeurs quelle peut prendre, les types offerts par la plupart des langages sont:

Type numrique (entier ou rel): Byte (cod sur 1octet): de 0 255. Entier court (cod sur 2 octets). Entier long (cod sur 4 ou 8 octets). Rel simple prcision (cod sur 4 octets). Rel double prcision (cod sur 8 octets).

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

13

Types des variables (2)

Type logique ou boolen: Deux valeurs: VRAI ou FAUX (1 ou 0 dans certains langages). Type caractre: Lettres majuscules, minuscules, chiffres, symboles, Type chane de caractres: Toute suite de caractres.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

14

Dclaration des variables


En pseudo-code:

Variables identificateur1 : type1 identificateur2 : type2 Variables i, j, k : Entier x, y : Rel nom : Chane de caractres

Exemple:

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

15

Linstruction daffectation (1)


Laffectation consiste attribuer une valeur une variable (ce qui consiste remplir o modifier le contenu d'une zone mmoire). En pseudo-code, l'affectation se note avec le signe

Var e : attribue la valeur de e la variable Var. e peut tre une valeur, une autre variable ou une expression. Var et e doivent tre de mme type ou de types compatibles.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

16

Linstruction daffectation (2)


Beaucoup de langages de programmation (C, C++, Java,) utilisent le signe gal = pour laffectation . Certains langages donnent des valeurs par dfaut aux variables dclares. Pour viter tout problme il est prfrable d'initialiser les variables dclares.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

17

Linstruction daffectation: Exemple 1


Donnez les valeurs des variables A, B et C aprs excution des instructions suivantes ?
Variables A, B, C: Entier Dbut A3 B7 AB B A+5 CA+B CBA Fin

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

18

Linstruction daffectation: Exemple 2


Donnez les valeurs des variables A et B aprs excution des instructions suivantes ?
Variables A, B: Entier Dbut A1 B2 AB BA Fin

Les deux dernires instructions permettent-elles dchanger les valeurs de A et B ?


Pr. Mohamed NAIMI | Cours_algo_sd | ESTB 19

Linstruction daffectation: Exercice


Ecrire un algorithme permettant dchanger les valeurs de deux variables entires A et B ?

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

20

Les instructions dE/S (1)


Les instructions dEntre/Sortie (E/S) permettent la machine de communiquer avec lutilisateur. La lecture permet d'entrer des donns partir du clavier. En pseudo-code, on note: Lire (var). Remarque:

Le programme s'arrte lorsqu'il rencontre une instruction Lire et ne se poursuit qu'aprs la frappe dune valeur au clavier et de la touche Entre.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

21

Les instructions dE/S (2)


L'criture permet d'afficher des rsultats l'cran (ou de les crire dans un fichier). En pseudo-code, on note: Ecrire (var). Conseil:

Avant de lire une variable, il est fortement conseill dcrire des messages lcran, afin de prvenir lutilisateur de ce quil doit frapper.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

22

Les instructions dE/S: Exemple


Ecrire un algorithme qui demande un nombre entier l'utilisateur, puis qui calcule et affiche le double de ce nombre ?

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

23

Les instructions dE/S: Solution


Algorithme Calcul_double variables A, B : entier Dbut crire("Saisir la valeur de A: ") lire(A) B 2*A crire("le double de ", A, "est :", B) Fin

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

24

Mthodologie de construction dun algorithme simple (1)


crire un algorithme qui consiste a calculer lair S dun cercle selon la formule S = Pi * R2 ?

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

25

Mthodologie de construction dun algorithme simple (2)


Constantes : Pi = 3.14. Variables : Rayon, Surface. Types :

Rayon, Surface : Rel. Surface Pi * (Rayon)*(Rayon).

Expressions et affectation :

Structures conditionnelles et boucles : -----Oprations dE/S : Lire (Rayon), crire (Surface).

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

26

Mthodologie de construction dun algorithme simple (3)


Algorithme Calcul_Aire Constantes Pi = 3,14159 Variables Rayon, Surface : rels Dbut lire (Rayon) Surface := Pi * (Rayon)2 crire (Surface) Fin

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

27

Instructions conditionnelles (1)


Les instructions conditionnelles servent n'excuter une instruction ou une squence d'instructions que si une condition est vrifie. En pseudo-code:
Si condition alors instruction ou suite d'instructions1 Sinon instruction ou suite d'instructions2 Finsi

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

28

Instructions conditionnelles (2)


La partie Sinon est facultative, quand elle n'existe pas et que la condition est fausse, aucun traitement n'est ralis. Dans ce cas, on utilise la forme simplifie suivante:
Si condition alors instruction ou suite d'instructions1 Finsi

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

29

Exemple (SiAlorsSinon)
Algorithme AffichageValeurAbsolue (version 1) Variable x : rel Dbut Ecrire " Entrez un rel : " Lire (x) Si (x < 0) alors Ecrire ("la valeur absolue de ", x, "est:",-x) Sinon Ecrire ("la valeur absolue de ", x, "est:",x) Finsi Fin

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

30

Exemple (SiAlors)
Algorithme AffichageValeurAbsolue (version 2) Variable x,y : rel Dbut Ecrire " Entrez un rel : " Lire (x) y x Si (x < 0) alors y -x Finsi Ecrire ("la valeur absolue de ", x, "est:",y) Fin

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

31

Conditions composes
Une condition compose est une condition forme de plusieurs conditions simples relies par des oprateurs logiques:

ET, OU, OU exclusif (XOR) et NON. x compris entre 2 et 6 : (x > 2) ET (x < 6). n divisible par 3 ou par 2 : (n%3 = 0) OU (n%2 = 0). deux valeurs et deux seulement sont identiques parmi a, b et c : (a = b) XOR (a = c) XOR (b = c).

Exemples :

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

32

Tables de vrit
C1 VRAI VRAI FAUX FAUX C2 VRAI FAUX VRAI FAUX C1 ET C2 VRAI FAUX FAUX FAUX C1 VRAI VRAI FAUX FAUX C2 VRAI FAUX VRAI FAUX C1 OU C2 VRAI VRAI VRAI FAUX

C1 VRAI VRAI FAUX FAUX

C2 VRAI FAUX VRAI FAUX

C1 XOR C2 FAUX VRAI VRAI FAUX

C1 VRAI FAUX

NON C1 FAUX VRAI

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

33

Tests imbriqus (1)


Les tests peuvent avoir un degr quelconque d'imbrications:
Si condition1 alors Si condition2 alors instructionsA Sinon instructionsB Finsi Sinon Si condition3 alors instructionsC Finsi Finsi

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

34

Tests imbriqus: Exemple


Algorithme Test Variable n : entier Dbut Ecrire ("entrez un nombre : ") Lire (n) Si (n < 0) alors Ecrire ("Ce nombre est ngatif") Sinon Si (n = 0) alors Ecrire ("Ce nombre est nul") Sinon Ecrire ("Ce nombre est positif") Finsi Finsi Fin

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

35

Tests imbriqus: Exercice


Le prix de photocopies dans une reprographie varie selon le nombre demand: 0.5 DH la copie pour un nombre de copies infrieur 10, 0.4DH pour un nombre compris entre 10 et 20 et 0.3DH au-del. Ecrire un algorithme qui demande lutilisateur le nombre de photocopies effectues, puis calcule et affiche le prix payer.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

36

Tests imbriqus: Solution


Algorithme Photocopie Variables copies : entier prix : rel Dbut Ecrire ("Nombre de photocopies : ") Lire (copies) Si copies < 10 Alors prix copies*0.5 Sinon Si (copies < 20) prix copies*0.4 Sinon prix copies*0.3 Finsi Finsi Ecrire ("Le prix payer est : ", prix) Fin

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

37

Linstruction conditionnelle choix multiple (1)


Linstruction [Suivant cas] constitue une structure alternative la forme en bloc [Si Alors Sinon]. Elle permet de formuler de manire plus simple le choix du groupe dinstructions, surtout lorsque plusieurs alternatives sont possibles. Lensemble de valeurs sur lequel porte le choix doit tre fini.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

38

Linstruction conditionnelle choix multiple (2)


Syntaxe gnrale:
Suivant Cas Variable Faire Cas Valeur 1 Actions 1 Cas Valeur 2, Valeur3, Valeur 4 Actions 2 Cas Valeur 5 Valeur 7 Actions 3 Sinon Cas Actions N Fin Suivant Cas

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

39

Linstruction conditionnelle choix multiple (3)


Exemple:

Lalgorithme suivant permet de dterminer le nombre de jours dun mois donn.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

40

Linstruction conditionnelle choix multiple (4)


Exemple -Suite:
Algorithme NbJoursMois Variables M : Entier Dbut Ecrire ("Donner un numro de mois: ") Lire(M) Suivant Cas M Faire Cas 2 crire ("Nombre de jours du mois ", M, ": 28 ou 29") Cas 1, 3, 5, 7, 8, 10 , 12 crire ("Nombre de jours du mois ", M, ": 31") Cas 4, 6, 9, 11 crire ("Nombre de jours du mois ", M, ": 30") Sinon Cas crire ("Attention : Numro de mois incorrect") Fin Suivant Cas Fin

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

41

La boucle Tant que (1)

faux test vrai nonc

TANT QUE
le test est vrai rpter lnonc

(le test AVANT lnonc)

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

42

La boucle Tant que (2)


Exemple:

Lalgorithme suivant permet de calculer la fonction factorielle dun nombre N saisi au clavier. Pour ce faire, il utilise la boucle Tant que.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

43

La boucle Tant que (3)


Exemple -Suite:
Algorithme Factorielle Variables F, N, i : Entier Dbut Ecrire ("Saisir un entier positif") Lire(N) Si (N = 0) Alors Ecrire("La factorielle de 0 est: ", 1) Sinon i1, F1 Tant que (i < = N) Faire FF*i, ii+1 Fin Tant que Ecrire("La factorielle de ", N, " est: ", F) Fin Si Fin

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

44

La boucle FaireJusqu (1)

nonc

rpter lnonc

JUSQU ce que
la condition soit vraie

faux

test
vrai

(le test APRES lnonc)

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

45

La boucle FaireJusqu (2)


Exemple:

Cet exemple reprend lalgorithme de lexemple prcdent (calcul de la factorielle) mais en utilisant, cette fois-ci, la boucle FaireJusqu.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

46

La boucle FaireJusqu (3)


Exemple -Suite:
Algorithme Factorielle Variables F, N, i : Entier Dbut Ecrire ("Saisir un entier positif") Lire(N) Si (N = 0) Alors Ecrire("La factorielle de 0 est: ", 1) Sinon i1, F1 Faire FF*i, ii+1 Jusqu (i > N) Ecrire("La factorielle de ", N, " est: ", F) Fin Si Fin

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

47

La boucle Pour (1)


Rptition gre par un compteur. Le nombre ditrations doit tre connu. Forme gnrale:
Rpter N fois (N donn) Corps de la boucle

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

48

La boucle Pour (2)


Exemple:

Il sagit encore une fois de calculer la fonction factorielle mais en utilisant, cette fois-ci, la boucle Pour.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

49

La boucle Pour (3)


Exemple -Suite:
Algorithme Factorielle Variables F, N, i : Entier Dbut Ecrire ("Saisir un entier positif") Lire(N) Si (N = 0) Alors Ecrire("La factorielle de 0 est: ", 1) Sinon F1 Pour i1 N Faire FF*i Fin Pour Ecrire("La factorielle de ", N, " est: ", F) Fin Si Fin

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

50

Pointeurs

Adressage de variables (1)


La mmoire (RAM) est un immense tableau de cases contenant chacune 1 octet (ou byte) = 8 bits.

1 octet

Une variable est stocke sur une ou plusieurs cases en fonction de son type et de la machine. En gnral :

Entiers courts (short int): 2 octets. Entiers (int) et rels en simple prcision (float): 4 octets. Rels en double prcision (double): 8 octets.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

52

Adressage de variables (2)


Ladresse dune variable correspond au numro de la premire case stockant cette variable. Exemple:

Entier ladresse 103 est en fait stock dans les cases 103, 104, 105 et 106.
0 103 104 105 106 107

Espace de stockage

Le nombre de cases disponibles dpend de la taille de la mmoire (ex. 109 octets Des milliards de cases).
Pr. Mohamed NAIMI | Cours_algo_sd | ESTB 53

Adressage de variables (3)


En langage C, ladresse mmoire dune variable est donne par &variable. Mme principe dans le cas des tableaux:

Exemple: Si tb1 est un tableau dentiers, alors &(tb1[i]) correspond ladresse en mmoire de tb1[i].
&(tb1[0]) &(tb1[1]) &(tb1[2])

tb1[0]

tb1[1]

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

54

Adressage de variables (4)


Remarque:

Le nom dun tableau correspond ladresse mmoire de son premier lment. Dans lexemple prcdent, tb1 est identique &(tb1[0]).

Les adresses mmoire dun tableau sont contigus et toutes les valeurs sont stockes sur le mme nombre de cases:

Utilisation doprateurs arithmtiques + et -.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

55

Adressage de variables (5)


Exemples:

tb1 + i correspond ladresse de llment i du tableau tb1: &(tb1[i]). &(tb1[5]) 2 correspond ladresse de tb1[5] laquelle on soustrait 2 adresses: &(tb1[3]). &(tb1[7]) &(tb1[3]) correspond au nombre dadresses entre tb1[7] et tb1[3]: 4.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

56

Adressage de variables (6)


Adressage direct:

Accs au contenu d'une variable par le nom de la variable.

Exemple:

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

57

Adressage de variables (7)


Adressage indirect:

Accs au contenu d'une variable, en passant par une autre variable, appel pointeur, contenant l'adresse de la variable. Soit A une variable contenant la valeur 10 et P un pointeur qui contient l'adresse de A.

Exemple:

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

58

Pointeurs (1)
Un pointeur est une variable permettant de stocker ladresse mmoire dune autre variable. Syntaxe de dclaration:

Type *pointeur; /* Type est le type des variables auxquelles permet daccder le pointeur */ int *pt_int ; /* Pointeur sur des er */ char *pt_char; /* Pointeur sur un caractre */

Exemples:

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

59

Pointeurs (2)
Remarques:

Les pointeurs et les noms de variables ont le mme rle: Ils donnent accs un emplacement dans la mmoire interne de l'ordinateur. Un pointeur est une variable qui peut 'pointer' sur diffrentes adresses. Le nom d'une variable reste toujours li la mme adresse.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

60

Pointeurs (3)
Affectation de ladresse dune variable:
Type x; x = Valeur; Type *px; /* Le pointeur px pointe vers des variables ayant le mme type que la variable x */ px = &x; /* Le pointeur px contient maintenant ladresse de la variable x */

Remarques:

*px dsigne le contenu de l'adresse rfrence par le pointeur px. Aprs linstruction px = &x, *px contiendra Valeur.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

61

Pointeurs (4)
Exemple:
main( ) { short A = 10, B = 50; short *P; P = &A; B = *P; *P = 20; }

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

62

Pointeurs (5)
Exemple Suite:

Aprs les instructions:


short A = 10, B = 50; short *P;

La situation est la suivante:

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

63

Pointeurs (6)
Exemple Fin:

A la fin du programme, la situation est la suivante:

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

64

Pointeurs (7)
Les seules valeurs quon peut affecter un pointeur sont les adresses mmoire de variables. Toutefois, la valeur numrique 0 (zro) est utilise pour indiquer qu'un pointeur ne pointe 'nulle part'. Exemple:
int *P; P = 0;

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

65

Pointeurs (8)
Remarques:

Si un pointeur P pointe sur une variable X, alors *P peut tre utilis partout o on peut crire X. Dans ce cas, toute modification de *P modifie la valeur de X. Aprs linstruction P = &X; , on a les quivalences suivantes: Y = *P+1 *P = *P+10 *P += 2 ++*P (*P)++ Y = X+1 X = X+10

Illustration:

X += 2 ++X X++

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

66

Pointeurs (9)
Exercice:
main( ) { int A = 1, B = 2, C = 3; int *P1, *P2; P1 = &A; P2 = &C; *P1 = (*P2)++; P1 = P2; P2 = &B; *P1 -= *P2; ++*P2; (*P1) *= (*P2); A = ++ (*P2)*(*P1); P1 = &A; *P2 = (*P1) /= (*P2); }

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

67

Pointeurs (10)
Exercice Suite:

Dterminer les valeurs des variables A, B, C, P1 et P2 aprs lexcution de chaque instruction du programme prcdent.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

68

Pointeurs et tableaux monodimensionnels (1)


Relation trs troite entre tableaux et pointeurs en C. Chaque opration avec des indices de tableaux peut aussi tre exprime l'aide de pointeurs. Le nom d'un tableau est un pointeur constant sur le premier lment du tableau. Illustration:

int A[10]; int *P; P = A; est quivalente P = &A;

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

69

Pointeurs et tableaux monodimensionnels (2)


Illustration Suite:

P + i pointe sur le (i + 1)me lment de A, cest--dire: *(P + i) dsigne le contenu de A[i].

En C, le compilateur peut calculer automatiquement l'adresse de l'lment P+i en ajoutant P la grandeur d'une composante multiplie par i.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

70

Pointeurs et tableaux monodimensionnels (3)


Remarques:

Un pointeur est une variable, donc des oprations comme P = A ou P++ sont permises. Le nom d'un tableau est une constante, donc des oprations comme A = P ou A++ sont impossibles.

Soit A un tableau d'un type quelconque et i un indice pour les composantes de A, alors:

A + i dsigne l'adresse de A[i]. *(A + i) dsigne le contenu de A[i].

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

71

Pointeurs et tableaux monodimensionnels (4)


Formalisme tableaux et formalisme pointeurs:

Possibilit de traduire un programme crit laide du formalisme tableaux en un programme crit laide du formalisme pointeurs . Les deux programmes suivants copient les lments positifs d'un tableau T dans un deuxime tableau POS.

Exemple:

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

72

Pointeurs et tableaux monodimensionnels (5)


Programme 1 (Formalisme Tableaux):
main() { int T[10] = {-3, 4, 0, -7, 3, 8, 0, -1, 4, -9}; int POS[10]; int I,J; /* indices courants dans T et POS */ for (J=0,I=0 ; I<10 ; I++) if (T[I]>0) { POS[J] = T[I]; J++; } return 0; }

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

73

Pointeurs et tableaux monodimensionnels (6)


Programme 2 (Formalisme Pointeurs):
main() { int T[10] = {-3, 4, 0, -7, 3, 8, 0, -1, 4, -9}; int POS[10]; int I,J; /* indices courants dans T et POS */ for (J=0,I=0 ; I<10 ; I++) if (*(T+I)>0) { *(P+J) = *(T+I); J++; } return 0; }

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

74

Arithmtique des pointeurs (1)


Remarque fondamentale:

En C, toutes les oprations avec les pointeurs tiennent compte automatiquement du type et de la grandeur des objets points. Soient P1 et P2 deux pointeurs sur le mme type de donnes, alors l'instruction: P1 = P2; fait pointer P1 sur le mme objet que P2.

Affectation par un pointeur sur le mme type:

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

75

Arithmtique des pointeurs (2)


Addition et soustraction d'un nombre entier:

Si P pointe sur l'lment A[i] d'un tableau, alors: P + n pointe sur A[i+n]. P - n pointe sur A[i-n]. Si P pointe sur l'lment A[i] d'un tableau, alors: P++; /* P pointe sur A[i+1] */ P+=n; /* P pointe sur A[i+n] */ P--; /* P pointe sur A[i-1] */ P-=n; /* P pointe sur A[i-n] */

Incrmentation et dcrmentation d'un pointeur:

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

76

Arithmtique des pointeurs (3)


Domaine des oprations:

L'addition, la soustraction, l'incrmentation et la dcrmentation sur les pointeurs sont seulement dfinies l'intrieur d'un tableau.

Exemples:
int int P = P = A[10]; *P; A+9; /* dernier lment -> lgal */ A+10; /* dernier lment + 1 -> lgal ou illgal! A viter en gnral! */ P = A+11; /* dernier lment + 2 -> illgal */ P = A-1; /* premier lment - 1 -> illgal */

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

77

Arithmtique des pointeurs (4)


Soustraction de deux pointeurs:

Soient P1 et P2 deux pointeurs qui pointent dans le mme tableau, alors: P1 - P2 est gal la diffrence entre lindice de la composante pointe par P1 et lindice de la composante pointe par P2. Le rsultat de la soustraction P1-P2 est:
Ngatif, si P1 prcde P2. 0, si P1 = P2. Positif, si P2 prcde P1.

Remarque:

La soustraction de deux pointeurs qui pointent dans le mme tableau est quivalente la soustraction des indices correspondants.
Pr. Mohamed NAIMI | Cours_algo_sd | ESTB 78

Arithmtique des pointeurs (5)


Comparaison de deux pointeurs:

Deux pointeurs peuvent tre compars laide des oprateurs de comparaison: <, >, <=, >=, = = et !=. La comparaison de deux pointeurs qui pointent dans le mme tableau est quivalente la comparaison des indices correspondants. Si les pointeurs ne pointent pas dans le mme tableau, alors le rsultat est donn par leurs positions relatives dans la mmoire.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

79

Arithmtique des pointeurs (6)


Exemple:

Soit P un pointeur qui pointe sur un tableau A:


int A[] = {12, 23, 34, 45, 56, 67, 78, 89, 90}; int *P; P = A;

Quelles valeurs ou adresses fournissent les expressions suivantes:


a) b) c) d) e) f) g) h) *P+2; *(P+2); &P+1; &A[4]-3; A+3; &A[7]-P; P+(*P-10); *(P+*(P+8)-A[7]);

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

80

Pointeurs et tableaux bidimensionnels (1)


Remarque importante:

Les consquences de larithmtique des pointeurs se gnralisent sur les tableaux bidimensionnels. Soit M le tableau bidimensionnel suivant: int M[4][10] = {{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {10,11,12,13,14,15,16,17,18,19}, {20,21,22,23,24,25,26,27,28,29}, {30,31,32,33,34,35,36,37,38,39}};

Illustration:

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

81

Pointeurs et tableaux bidimensionnels (2)


Illustration Suite:

Le nom du tableau M pointe sur le tableau M[0]. Lexpression (M + 1) pointe sur le tableau M[1]. Explication: Un tableau bidimensionnel est un tableau monodimensionnel dont chaque lment est un tableau monodimensionnel. Ainsi, le premier lment de la matrice M est le vecteur M[0], le deuxime lment est le vecteur M[1] et ainsi de suite. Larithmtique des pointeurs, qui respecte la dimension des objets points, conclut logiquement que: M+I dsigne l'adresse du tableau M[I].

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

82

Pointeurs et tableaux bidimensionnels (3)


Illustration Suite:

Problme: Comment peut-on accder, l'aide de pointeurs, aux lments de chaque composante du tableau, cest--dire aux lments M[0][0], M[0][1],, M[3][9] ? Solution: Une solution consiste convertir la valeur de M (qui est un pointeur sur un tableau du type int) en un pointeur sur int:
int *P; P = (int *)M; /* conversion force */

Cette affectation entrane une conversion de ladresse &M[0] dans ladresse &M[0][0].

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

83

Pointeurs et tableaux bidimensionnels (4)


Illustration Suite:

Solution Suite: Ensuite, grce la mmorisation ligne par ligne des tableaux bidimensionnels, nous pouvons maintenant traiter la matrice M laide du pointeur P comme sil sagit dun tableau monodimensionnel de dimension 4*10.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

84

Pointeurs et tableaux bidimensionnels (5)


Illustration Suite:

Exemple: Calcul de la somme de tous les lments du tableau M:


int int P = SOM for *P; I, SOM; (int*)M; = 0; (I=0; I<40; I++) SOM += *(P+I);

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

85

Pointeurs et tableaux bidimensionnels (6)


Remarque:

Lors de l'interprtation d'un tableau bidimensionnel comme tableau monodimensionnel, il faut calculer avec le nombre de colonnes indiqu dans la dclaration du tableau. Soit A la matrice suivante:
int A[3][4]; A[0][0]=1; A[0][1]=2; A[1][0]=10; A[1][1]=20;

Exemple:

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

86

Pointeurs et tableaux bidimensionnels (7)


Exemple -Suite:

Pour la matrice A, nous rservons de la mmoire pour 3 lignes et 4 colonnes, mais nous utilisons seulement 2 lignes et 2 colonnes. Dans la mmoire, les composantes de la matrice A sont stockes comme suit:

Ladresse de llment A[I][J] se calcule alors par la formule: A + I*4 + J.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

87

Chanes de caractres

Chanes et tableaux de caractres (1)


Il nexiste pas un vritable type chane de caractres en langage C. Une abstraction de chane de caractres est donne par un tableau de caractres. Une chane de caractres valide est obligatoirement termine par le caractre NULL ( i.e. \0).

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

89

Chanes et tableaux de caractres (2)


Une chane de caractres est une suite de caractres place entre ". Le compilateur reprsente une chane de caractres sous la forme dun tableau de caractres:

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

90

Chanes et tableaux de caractres (3)


Exemples:

"Ceci est une chane";

"";

/* Chane vide */

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

91

Chanes et tableaux de caractres (4)


Dclaration / Initialisation dune chane de caractres avec un tableau:

Exemples:

char ch[20] = {'b', 'o', 'n', 'j', 'o', 'u', 'r', '\0'}; char ch[20] = "bonjour"; char ch[ ] = "bonjour";

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

92

Chanes et pointeurs (1)


Dclaration / Initialisation dune chane de caractres avec un pointeur:

char *ch; ch = "bonjour";

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

93

Chanes et pointeurs (2)


Exemple 1:
#include<stdio.h> main() { int i; char *chaine; chaine = "chaine de caracteres"; for (i = 0; i < *chaine !='\0'; i++) chaine++; printf("nombre de caracteres = %d\n",i); }

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

94

Chanes et pointeurs (3)


Exemple 2:
#include <stdio.h> int main(void){ char *adr; adr = "bonjour \0 Monsieur"; while(*adr){ printf("%c",*adr); adr++; } }

Va sarrter lorsque \0 va tre atteint Ne va afficher que "bonjour"

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

95

Affichage / Lecture de chanes (1)


Les fonctions daffichage et de lecture de chanes font partie de la bibliothque <stdio.h>. Affichage dune chane ch:

printf("%s", ch); puts(ch); scanf("%s", &ch); gets(ch);

Lecture dune chane ch:


Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

96

Affichage / Lecture de chanes (2)


Exemple:

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

97

Manipulation de chanes (1)


La plupart de fonctions permettant de manipuler (copier, concatner, comparer,) des chanes appartiennent la bibliothque <string.h>. Longueur dune chane ch:

strlen(ch); strlen("bonjour"); 7. strcat(ch1,ch2); strncat(ch1,ch2,n);

Exemple (strlen):

Concatnation de deux chanes ch1 et ch2:


Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

98

Manipulation de chanes (2)


Exemple (strcat):

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

99

Manipulation de chanes (3)


Exemple (strncat):

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

100

Manipulation de chanes (4)


Copie dune chane ch2 dans une chane ch1:

strcpy(ch1,ch2);

Copie des n premiers caractres dune chane ch2 dans une chane ch1:

strncpy(ch1,ch2,n);

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

101

Manipulation de chanes (5)


Exemple (strncpy):
#include <stdio.h> #include <string.h> main() { char ch1[20] = "xxxxxxxxxxxxxxxxxxx"; char ch2[20]; printf ("donnez un mot : "); gets (ch2); strncpy (ch1, ch2, 6); printf ("%s", ch1); }

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

102

Manipulation de chanes (6)


Rsultat de lexemple (strncpy):
donnez un mot : bon bon _______ donnez un mot : bonjour bonjouxxxxxxxxxxxxx

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

103

Manipulation de chanes (7)


Comparaison de deux chanes ch1 et ch2:

strcmp(ch1,ch2); strcmp("bonjour", "monsieur"); Ngatif. strcmp("paris2", "paris10"); Positif. strcmp("salut", "salut"); 0. strcmp("salut", "Salut"); Positif.

Exemples (strcmp):

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

104

Manipulation de chanes (8)


Comparaison des n premiers caractres de deux chanes ch1 et ch2:

strncmp(ch1,ch2,n); strncmp("bonjour", "bon",4); Positif. strncmp("bonjour", "bon",2); 0.

Exemples (strncmp):

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

105

Manipulation de chanes (9)


Recherche de la premire occurrence dun caractre c dans une chane ch:

char *strchr(const char *ch, int c); strchr("bonjour",'o'); /* donne ladresse du premier 'o' */

Exemple (strchr):

Recherche de la dernire occurrence dun caractre c dans une chane ch:

char *strrchr(const char *ch, int c); strrchr("bonjour",'o'); /* donne ladresse du dernier 'o' */

Exemple (strrchr):

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

106

Manipulation de chanes (10)


Recherche de la premire occurrence dune sous-chane sch dans une chane ch:

char *strstr(const char *ch, const char *sch); strstr("bonjour","jour"); sous-chane "jour" */ /* renvoie ladresse du dbut de la

Exemple (strchr):

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

107

Conversion de chanes
Les fonctions de conversion de chanes en types numriques se trouvent dans la bibliothque <stdlib.h>. Conversion dune chane ch en type int:

atoi(ch); atol(ch); atof(ch); atod(ch);

Conversion dune chane ch en type long:

Conversion dune chane ch en type float:

Conversion dune chane ch en type double:

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

108

Tableaux de chanes (1)


Dclaration / Initialisation laide dun tableau bidimensionnel de type char:

char nomJour[7][9] = {"lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"};

Dclaration / Initialisation laide dun tableau de pointeurs sur chanes:

char *nomJour[7] = {"lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"};

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

109

Tableaux de chanes (2)


Affichage des lments du tableau:

for (int i=0; i<7; i++) printf("%s", nomJour[i]); strcpy(nomJour[4], "Friday");

Modification dun lment du tableau:

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

110

Utilisation de caractres spcifiques au sein de chanes

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

111

Allocation dynamique de la mmoire

Allocation statique
Lallocation statique de la mmoire se fait lors de la dclaration de variables. Exemples:

short I, J, C; int T[10]; char S[] = {"Bonjour tout le monde!"};

/* Rservation de 6 octets */ /* Rservation de 40 octets */ /* Rservation de 23 octets */

Remarques:

Allocation faite dans la phase de compilation. Gaspillage de lespace mmoire.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

113

Allocation dynamique
Lallocation dynamique de la mmoire se fait lors de lexcution du programme:

La rservation est faite au fur et mesure de lexcution du programme. Gestion optimale de la mmoire.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

114

La fonction malloc( ) (1)


La fonction malloc( ) fait partie de la bibliothque <stdlib.h>. Elle permet dallouer dynamiquement de lespace mmoire pour des variables. Exemple 1:
int * p; p = (int*)malloc (sizeof(int)); if ( p == NULL ) { fprintf(stderr,"Allocation impossible \n"); exit(EXIT_FAILURE); }
Pr. Mohamed NAIMI | Cours_algo_sd | ESTB 115

La fonction malloc( ) (2)


Exemple 2:
struct complexe { double Re; double Im; }; typedef struct complexe Complexe; Complexe * c; c = (Complexe*)malloc(sizeof(Complexe)); if ( c == NULL ) { fprintf(stderr,"Allocation Impossible"); exit(EXIT_FAILURE); }
Pr. Mohamed NAIMI | Cours_algo_sd | ESTB 116

Allocation dynamique de tableaux (1)


Exemple 1:
int * tabEntier; tabEntier = (int*)malloc (3 * sizeof(int)); if( tabEntier == NULL ) { fprintf(stderr,"Allocation impossible"); exit(EXIT_FAILURE); }

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

117

Allocation dynamique de tableaux (2)


Exemple 2:
Complexe * tabComplexe; tabComplexe = (Complexe*)malloc(3 * sizeof(Complexe)); if( tabComplexe == NULL ) { fprintf(stderr,"Allocation impossible"); exit(EXIT_FAILURE); }

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

118

La fonction calloc( ) (1)


La fonction calloc( ) fait partie de la bibliothque <stdlib.h>. Cette fonction permet galement de rserver dynamiquement de lespace mmoire pour des variables. Remarques:

La fonction malloc( ) initialise alatoirement les cases mmoire alloues. La fonction calloc( ) initialise les cases mmoire alloues 0.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

119

La fonction calloc( ) (2)


Exemple:
float * p; p = (float*)calloc (3 , sizeof(float)); if( p == NULL ) { fprintf(stderr,"Allocation impossible"); exit(EXIT_FAILURE); }

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

120

La fonction free( ) (1)


La fonction free( ) fait partie de la bibliothque <stdlib.h>. Cette fonction a un effet inverse celui produit par les fonctions malloc( ) et calloc( ): Elle permet de librer un espace mmoire dj allou.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

121

La fonction free( ) (2)


Exemple:
int * entier; entier = (int*)malloc (sizeof(int)); if( entier == NULL ) { fprintf(stderr,"Allocation impossible"); } else { *entier = 3; printf("%d",*entier); free(entier); entier = NULL; }

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

122

La fonction realloc( ) (1)


La fonction realloc( ) appartient la bibliothque <stdlib.h>. Cette fonction permet de changer la taille dun bloc mmoire dj allou. Elle est particulirement utile pour un tableau dynamique:

Augmentation de la taille du tableau. Rduction de la taille du tableau.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

123

La fonction realloc( ) (2)


Exemple:
int * tabEntier; tabEntier = (int*)calloc ( 3 , sizeof(int) ); if ( tabEntier == NULL ) { fprintf(stderr,"Allocation impossible"); exit(EXIT_FAILURE); } tabEntier[0] = 1; tabEntier[1] = 2; tabEntier[2] = 3;

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

124

La fonction realloc( ) (3)


Exemple -Suite:
int * temp; temp = (int*)realloc (tabEntier, 4 * sizeof(int ) ); if ( temp == NULL ) { fprintf(stderr,"Rallocation impossible"); free(tabEntier); exit(EXIT_FAILURE); } else { tabEntier = temp; } tabEntier[3] = 4; for ( i = 0 ; i < 3 ; i++ ) { printf(" tabEntier[%d] = %d \n", i , tabEntier[i] ); } Pr. Mohamed NAIMI | Cours_algo_sd | ESTB 125

Rcapitulatif (1)
int * t = malloc(3*sizeof(int));

int * t = calloc(3, sizeof(int));

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

126

Rcapitulatif (2)
free(t);
t
*t

t = NULL;

t = realloc(4*sizeof(int));

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

127

Listes linaires chanes

Introduction (1)
Une liste est un ensemble fini dlments de mme type. Un lment dune liste est parfois appel nud. Les lments dune liste sont ordonns selon leur place (leur rang dans la liste). En C, chaque lment de la liste (sauf le dernier) correspond une structure contenant deux champs:

Une donne de type quelconque. Un pointeur sur llment suivant de la liste.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

129

Introduction (2)
Le deuxime champ du dernier lment de la liste contient la valeur NULL. La liste est dtermine par un pointeur sur son premier lment. La liste vide est reprsente par le pointeur constant NULL. Le nombre total dlments est appel longueur de la liste. La longueur dune liste vide est 0.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

130

Dclaration dune liste


Exemple de dclaration dune liste:
typedef float type_val; typedef struct scomp { type_val val; struct scomp *suiv; } type_comp; typedef type_comp *adr_comp;

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

131

Reprsentation dune liste (1)


Reprsentation des lments de la liste:

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

132

Reprsentation dune liste (2)


Reprsentation de la liste:

prem est un pointeur, de type adr_comp, contenant ladresse du premier lment de la liste: adr_comp *prem; Le champ suiv du dernier lment de la liste contient la valeur NULL.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

133

Affichage des lments dune liste (1)


Laccs aux lments dune liste chane est squentiel:

Passage par tous les lments qui prcdent llment auquel on souhaite accder. Laccs aux lments dun tableau est direct.

Remarque:

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

134

Affichage des lments dune liste (2)


Lappel de la fonction afficher_liste(prem) permet dafficher tous les lments de la liste:
void afficher_liste(adr_comp l) { while(l!=NULL) { printf("%f",l->val); l=l->suiv; } printf("\n"); }

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

135

Calcul de la longueur dune liste


La valeur spcifique (NULL) du champ suiv du dernier lment de la liste permet de reprer la fin de celle-ci. Lappel de la fonction longueur_liste(prem) permet de calculer la longueur de la liste:
int longueur_liste(adr_comp l) { int n=0; while(l!=NULL) { l=l->suiv; n++; } return(n); }

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

136

Insertion dun lment au dbut dune liste (1)


Lappel inserer_premier(&prem,n_val) permet dinsrer la valeur n_val au dbut de la liste:
void inserer_premier(adr_comp *prem,type_val val) { adr_comp nouv; nouv=(adr_comp)malloc(sizeof(type_comp)); nouv->val=val; nouv->suiv=*prem; *prem=nouv; }

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

137

Insertion dun lment au dbut dune liste (2)


Exemple:

Lappel inserer_premier(&prem,5.0) permet dinsrer la valeur 5.0 au dbut de la liste reprsente dans lexemple prcdent.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

138

Insertion dun lment au milieu dune liste (1)


Contrairement un tableau, linsertion dun lment au milieu dune liste ne ncessite que la modification des liens avec llment prcdent et llment suivant.

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

139

Insertion dun lment au milieu dune liste (2)


La fonction suivante permet dinsrer un nouvel lment (dont la valeur du premier champ est prcise dans le deuxime argument) juste aprs llment dont ladresse est prcise dans le premier argument.
void inserer_apres(adr_comp prec,type_val val) { adr_comp nouv; nouv=(adr_comp)malloc(sizeof(type_comp)); nouv->val=val; nouv->suiv=prec->suiv; prec->suiv=nouv; }

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

140

Insertion dun lment au milieu dune liste (3)


Exemple:

Soit X une variable de type adr_comp, pointant sur llment de valeur 10.0 de lexemple prcdent. L'appel de inserer_apres(X,15.0) donnera le rsultat suivant:

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

141

Recherche de llment prcdent un lment donn dans une liste


Le cas chant, la fonction suivante retourne ladresse de llment qui prcde llment dont ladresse est prcise dans le deuxime argument. Sinon, elle retourne la valeur NULL:
adr_comp rech_prec(adr_comp prem, adr_comp suivant) { while(prem->suiv!=suivant && prem!=NULL) prem=prem->suiv; return(prem); }

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

142

Recherche dun lment dordre i dans une liste


Supposons que le premier lment de la liste est numrot 0. La fonction suivante retourne ladresse du (i + 1)me lment si la taille de la liste le permet. Sinon, elle retourne la valeur NULL:
adr_comp rech_indice(adr_comp l, int i) { int j; for(j=0;j<i && l!=NULL;j++) l=l->suiv; return(l); }

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

143

Recherche dun lment dans une liste


La fonction suivante permet de renvoyer ladresse dun lment dont la valeur correspond celle prcise dans le deuxime argument si tel est le cas. Sinon, elle retourne la valeur NULL:
adr_comp rech_val(adr_comp l, type_val v) { while(l!=NULL && l->val!=v) l=l->suiv; return(l); }

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

144

Suppression du premier lment dune liste


La fonction suivante permet de supprimer le premier lment dune liste non vide:
void suppr_premier(adr_comp *prem) { adr_comp a_virer; if(*prem==NULL) { puts("rien supprimer"); return; } a_virer=*prem; *prem=(*prem)->suiv; free(a_virer); }
Pr. Mohamed NAIMI | Cours_algo_sd | ESTB 145

Suppression de llment suivant un lment donn dans une liste


La fonction suivante permet de supprimer llment qui suit llment dont ladresse est donne en argument:
void suppr_suivant(adr_comp prec) { adr_comp a_virer; if(prec==NULL || prec->suiv==NULL) { puts("rien supprimer"); return; } a_virer=prec->suiv; prec->suiv=a_virer->suiv; free(a_virer); }
Pr. Mohamed NAIMI | Cours_algo_sd | ESTB 146

Suppression complte dune liste


La fonction suivante permet de supprimer tous les lments dune liste:
void suppr_tout(adr_comp prem) { adr_comp deuxieme; while(prem!=NULL) { deuxieme=prem->suiv; free(prem); prem=deuxieme; } }

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

147

Cration dune liste (1)


La fonction suivante permet de crer une liste dont les lments seront ordonns dans lordre de leur saisie:
adr_comp saisie_liste(void) { adr_comp prem=NULL,prec,actu; /* premier, prcdent, actuel */ type_val v; int e;

Pr. Mohamed NAIMI | Cours_algo_sd | ESTB

148

Cration dune liste (2)


do { printf("entrez votre prochaine valeur, un caractre non valide pour finir :"); e=scanf("%f",&v); if(e<=0)break; /* scanf rend le nombre de variables lues sans erreur */ actu=(adr_comp)malloc(sizeof(type_comp)); actu->val=v; if(prem==NULL) prem=actu; else prec->suiv=actu; prec=actu; } while(1); actu->suiv=NULL; return(prem); } Pr. Mohamed NAIMI | Cours_algo_sd | ESTB 149