Programmation et structures de données
1MI
16
TYPE STRUCTURÉ
Il est souvent pratique de regrouper logiquement plusieurs variablesen une seule variable
composée. On parle alors de structure oud’enregistrement.
Retenir
Un type enregistrement ou type structuré est un type T de variable v obtenu en
juxtaposant plusieurs variables v1; v2; … ayant chacune un type T1;T2; …
les différentes variables vi sont appelées champs de v elles sont repérées par un
identificateur de champ
si v est une variable de type structuré T possédant le champch, alors la variable v:ch
est une variable comme les autres :(type, adresse, valeur)
Les structures permettent de rassembler des valeurs de type différent. Par exemple, pour
uneadresse, on a besoin du numéro (int) et du nom de la rue (char).
1. Déclaration
En algorithmique
nom_de_type= structure:
nom_du_champ_1 :
type_du_champ_1;
nom_du_champ_2 :
type_du_champ_2;
...
Déclaration de variable
structurée :
v: nom_de_type;
En langage C
structnom_de_struct {
nom_du_champ_1 : type_du_champ_1;
nom_du_champ_2 : type_du_champ_2;
...
};
Déclaration de variable structurée :
structnom_de_struct v;
Ou avec une définition de type :
typedefstructnom_de_structnom_type;
nom_type v;
Chaque élément déclaré à l’intérieur de la structure est appelé un champ. Le nom donné à la
structure est appelé étiquette de structure. Ici, on a en fait déclaré un type de structure, pas
une variable.
On déclare les variables associées à une structure de cette manière :
struct adresse chez_pierre ,chez_julie ;
Car si la structure d’une adresse est toujours la même (numéro et nom de la rue),
chez_pierreetchez_julie, qui sont des structadressedifférentes, n’habitent pas au même
endroit.
On peut initialiser une structure lors de sa déclaration :
struct adresse chez_pierre={ 15 , "rue_Dugommier" } ;
Exemple de déclaration de type structuré
typedef structs_date {
charnom_jour[9]; // lundi, mardi, ..., dimanche
intnum_jour; // 1, 2, ..., 31
int mois; // 1, 2, ..., 12
intannee;
}
Programmation et structures de données
1MI
17
typedef structs_date date = {"vendredi", 21, 10, 2011};
2. Manipulation
On accède aux données contenues dans les champs d’une structure et faisant suivre le nom de
la
strucure par un point "." et le nom du champ voulu :
chez_julie.numero=19 ;
strcpy(chez_julie.rue,"avenue Pasteur") ;
Si 2 structures ont le même type, on peut effectuer :
chez_pierre=chez_julie ; /* Pierre a emménagé chez Julie ! */
Mais on ne peut pas comparer 2 structures (avec == ou !=).
Rem :
On suppose déclarées des variables v;w d’un type structuré.
On dispose donc de variables
v.nom_du_champ_ide type type_du_champ_i
Toute opération valide sur une variable de type type_du_champ_iest valide sur
v.nom_du_champ_i.
De plus, l’affectation v = w est valide. Elle est équivalente auxaffectations :
v.nom_du_champ_1 = w.nom_du_champ_1
v.nom_du_champ_2 = w.nom_du_champ_2
……….
3. Tableau de structure
On déclare un tableau de structure de la même façon qu’un tableau de variables simples : le
nombre d’éléments est précisé entre crochets.
struct adresse pers[100] ;
Cette déclaration nécessite que la structure adresseait déjà été déclarée avant. persest alors un
tableau dont chaque élément est une structure de type adresse. Et pers[i].ruefait référence au
champ "rue" de la i
eme
personne de la structure pers.
Exemple
#include<stdio.h>
typedef struct point
{
double abs;
double ord;
};
intmain()
{
point p[10];
int i;
p[0].ord = 0;
p[0].abs = 1;
for(i = 1 ; i < 10 ; i++)
{ p[i].ord = p[i - 1].ord + 1.;
p[i].abs = p[i - 1].abs + 2.; }
for(i = 0 ; i < 10 ; i++)
{ printf("p[%d] = (%f, %f)\n", i, p[i].abs, p[i].ord); }
}
Programmation et structures de données
1MI
18
4. Structure de structure
On peut utiliser une structure comme champ d’une autre structure. Dans la lignée des
exemples précédents, on peut définir une structure adressequi pourra être utilisée dans la
structure repertoire.
Elle peut également être utilisée dans une autre structure.
typedef struct adresse {
intnumero ;
char rue[50] ; } ;
structrepertoire {
char nom[20] ;
char prenom[20] ;
struct adresse maison ; } ; /* déclaration d’un champ structure */
/* de type ’adresse’ appelé ’maison’ */
structrepertoiremonrepertoire[100] ;
strcpy(monrepertoire[0].nom,"Cordier") ;
strcpy(monrepertoire[0].prenom,"Julie") ;
monrepertoire[0].maison.numero = 19 ;
strcpy(monrepertoire[0].maison.rue,"avenue_Pasteur") ;
strcpy(monrepertoire[1].nom,"Durand") ;
strcpy(monrepertoire[1].prenom,"Pierre") ;
monrepertoire[1].maison.numero = 15 ;
strcpy(monrepertoire[1].maison.rue,"rue_Dugommier") ;
Lorsqu’un tableau fait partie des champs d’une structure, on peut accéder aux valeurs de ce
tableau
par :
char initiale ;
initiale=monrepertoire[1].prenom[0] ; /* initiale de Pierre */
Programmation et structures de données
1MI
19
Les listes chaînées
1. Définition
Une liste chaînée est une structure linéaire qui n'a pas de dimension fixée à sa création. Ses
éléments de même type sont éparpillés dans la mémoire et reliés entre eux par des pointeurs.
Sa dimension peut être modifiée selon la place disponible en mémoire. La liste est accessible
uniquement par sa tête de liste c’est-à-dire son premier élément.
Pour les listes chaînées la séquence est mise en œuvre par le pointeur porté par chaque
élément qui indique l'emplacement de l'élément suivant. Le dernier élément de la liste ne
pointe sur rien (Nil).
On accède à un élément de la liste en parcourant les éléments grâce à leurs pointeurs.
Chaque élément de la liste contient :
- des informations sur l’élément
- un pointeur sur un autre élément de la liste, ou un pointeur NULL s’il n’y a pas d’élément
suivant.
2. Représentation en mémoire d’une liste
Soit la liste chaînée suivante (@ indique que le nombre qui le suit représente une adresse) :
Adresses @ : 3 @ : 24 @ : 8 @ : 31
Données
Pointeurs
En allocation dynamique, les emplacements mémoires sont dispersés en mémoire centrale.
L’espace est réservé au fur et à mesure des créations des éléments de la liste. La seule limite
étant la taille de la mémoire centrale.
Pour accéder au troisième élément de la liste il faut toujours débuter la lecture de la liste par
son premier élément dans le pointeur duquel est indiqué la position du deuxième élément.
Dans le pointeur du deuxième élément de la liste on trouve la position du troisième élément…
Pour ajouter, supprimer ou déplacer un élément il suffit d'allouer une place en mémoire et de
mettre à jour les pointeurs des éléments.
Il existe différents type de listes chainées :
Il existe différents types de listes chaînées :
listes simplement chainées (comme ci-dessus) constituée d'éléments reliés entre eux
par des pointeurs.
Liste chaînée ordonnée où l'élément suivant est plus grand que le précédent.
L'insertion et la suppression d'élément se font de façon à ce que la liste reste triée.
Liste doublement chaînée où chaque élément dispose non plus d'un mais de deux
pointeurs pointant respectivement sur l'élément précédent et l'élément suivant. Ceci
permet de lire la liste dans les deux sens, du premier vers le dernier élément ou
inversement.
Liste circulaire où le dernier élément pointe sur le premier élément de la liste. S'il
s'agit d'une liste doublement chaînée alors de premier élément pointe également sur le
dernier.
Les piles
Voici
24
une
8
liste
31
Nil
Programmation et structures de données
1MI
20
Les files
3.listes simplement chainées
Une liste chaînée simple est composée :
d'un ensemble d'éléments tel que chacun :
est rangé en mémoire à une certaine adresse,
contient une donnée (Info),
contient un pointeur, souvent nommé Suivant, qui contient l'adresse de
l'élémentsuivant dans la liste,
d'une variable, appelée Tête, contenant l'adresse du premier élément de la liste chaînée.
Le pointeur du dernier élément contient la valeur Nil. Dans le cas d'une liste vide le pointeur
de latête contient la valeur Nil. Une liste est définie par l'adresse de son premier élément.
Exemple :
Le 1
er
élément de la liste vaut 12 à l'adresse 3 (début de la liste chaînée)
Le 2
eme
élément de la liste vaut 14 à l'adresse 4 (car le pointeur de la cellule d’adresse 3 est
égal à 4)
Le 3
eme
élément de la liste vaut 10 à l'adresse 2 (car le pointeur de la cellule d’adresse 4 est
égal à 2)
Le 4
e
élément de la liste vaut 24 à l'adresse 1 (car le pointeur de la cellule d’adresse 2 est égal
à 1)
Si P a pour valeur 3 Si P a pour valeur 2
P^.Info a pour valeur 12P^.Info a pour valeur 10
P^.Suivant a pour valeur 4 P^.Suivant a pour valeur 1
3.1. Traitements de base d'utilisation d'une liste chaînée simple
Il faut commencer par définir un type de variable pour chaque élément de la chaîne. En
langagealgorithmique ceci se fait comme suit :
Type Element = Structure
valeur : entier
Suivant : Element
Fin structure
Type Liste = ^Element
Variables Tete, P : Liste
Typedefstructelement {
Intvaleur;
element *Suivant;
};
typedef element *Liste;
int main()
{
ListeTete,P;
}
1 / 13 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !