Flux rss
Collection CommentÇaMarche.net
Bookmark Ajouter aux favoris / Partager

La notion de structure autoréferrentielle

Une structure autoréferrentielle (parfois appelée structure récursive) correspond à une structure dont au moins un des champs contient un pointeur vers une structure de même type. De cette façon on crée des éléments (appelés parfois noeuds ou liens) contenant des données, mais, contrairement à un tableau, celles-ci peuvent être éparpillées en mémoire et reliées entre elles par des liens logiques (des pointeurs), c'est-à-dire un ou plusieurs champs dans chaque structure contenant l'adresse d'une ou plusieurs structures de même type.

  • Lorsque la structure contient des données et un pointeur vers la structure suivante on parle de liste chaînée
  • Lorsque la structure contient des données, un pointeur vers la structure suivante, et un pointeur vers la structure précédente on parle de liste chaînée double
  • Lorsque la structure contient des données, un pointeur vers une première structure suivante, et un pointeur vers une seconde, on parle d'arbre binaire

Qu'est-ce qu'une liste chaînée ?

Une liste chaînée est une structure comportant des champs contenant des données et un pointeur vers une structure de même type. Ainsi, la structure correspondant à une liste chaînée contenant une chaîne de 15 caractères et un entier ressemble à ceci :

struct Nom_de_la_liste {
char Chaine[16];

int Entier;

struct Nom_de_la_liste * pSuivant;

};
On représente généralement cette structure de la manière suivante :

Chaîne
Entier
Pointeur vers suivant

Une liste chaînée se représente donc de la façon suivante :

Liste chaînée simple

En réalité la déclaration de la structure et la récursivité de celle-ci grâce à des pointeurs est nécessaire car cela crée une chaîne d'enregistrements liés par des liens logiques, mais cela n'est pas suffisant. En effet, il est nécessaire de conserver une « trace » du premier enregistrement afin de pouvoir accéder aux autres, c'est pourquoi un pointeur vers le premier élément de la liste est indispensable. Ce pointeur est appelé pointeur de tête. D'autre part, étant donné que le dernier enregistrement ne pointe vers rien, il est nécessaire de donner à son pointeur la valeur NULL :

Liste chaînée simple

Pour créer une liste chaînée en langage C, il s'agit dans un premier temps de définir la structure de données, ainsi qu'un pointeur vers une structure du type de celle définie précédemment, afin de pointer vers la tête de la liste, c'est-à-dire le premier enregistrement :

struct Liste {
char Chaine[16];

struct Liste * pSuivant;

};

struct Liste *Nouveau;

struct Liste *Tete;

Tete = NULL;

Ajout d'un premier élément

Une fois la structure et les pointeurs définis, il est possible d'ajouter un premier maillon à la liste chaînée, puis de l'affecter au pointeur Tete. Pour cela il est nécessaire :

  • d'allouer la mémoire nécessaire au nouveau maillon grâce à la fonction malloc, selon la syntaxe suivante :
    Nouveau = (Liste*)malloc(sizeof(struct Liste));
  • d'assigner au champ « pointeur » du nouveau maillon, la valeur du pointeur vers le maillon de tête :
    Nouveau->pSuivant = Tete;
  • définir le nouveau maillon comme maillon de tête :
    Tete = Nouveau;

  • Il est conseillé de tester la valeur renvoyée en retour par la fonction malloc() afin de savoir si l'allocation dynamique de mémoire s'est déroulée correctement.

Ajout d'un élément en fin de liste

L'ajout d'un élément à la fin de la liste chaînée est similaire, à la différence près qu'il faut définir un pointeur (appelé généralement pointeur courant) afin de parcourir la liste jusqu'à atteindre le dernier maillon (celui dont le pointeur possède la valeur NULL). Les étapes à suivre sont donc :

  • la définition d'un pointeur courant :
    struct Liste * pCourant;
  • le parcours de la liste chaînée jusqu'au dernier noeud :
    if (Tete != NULL) {
    pCourant = Tete;
    
    while (pCourant->pSuivant != NULL) pCourant = pCourant->pSuivant;
    
    }
  • l'allocation de mémoire pour le nouvel élément :
    Nouveau = (Liste*)malloc(sizeof(struct Liste));
  • faire pointer le pointeur courant vers le nouveau noeud, et le nouveau noeud vers NULL :
    pCourant->pSuivant = Nouveau;
    
    Nouveau->pSuivant = NULL;

Qu'est-ce qu'une liste chaînée double ?

Une liste chaînée double est basée sur le même principe que la liste chaînée simple, à la différence près qu'elle contient non seulement un pointeur vers le maillon suivant mais aussi un pointeur vers le maillon précédent, permettant de cette façon le parcours de la liste dans les deux sens. Ainsi, la structure correspondant à une liste chaînée double contenant une chaîne de 15 caractères et un entier ressemble à ceci :

struct Liste {
char Chaine[16];

int Entier;

struct Liste * pSuivant;

struct Liste * pPrecedent
};

On représente généralement cette structure de la manière suivante :

Données
Pointeur vers suivant
Pointeur vers précédent

Une liste chaînée double se représente donc de la façon suivante :

Liste chaînée double

Dernière modification le mardi 14 octobre 2008 à 17:40:26.Ce document intitulé « Langage C - Les listes chaînées » issu de Comment Ça Marche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.

Langage C - Les chaînes de caractères Qu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C, une chaîne... www.commentcamarche.net/contents/c/cstring.php3
Langage C : listes chainées J'ai écrit un programme comprenant une liste d'entiers que l'on classe au moment de leur insertion. Je voudrais completer ce programme en ajoutant une fonction de recherche (savoir si un element se treouve ou non dans la liste.) et inserer un element... www.commentcamarche.net/forum/affich-4281-langage-c-listes-chainees
[langage C]remplacer chaine de caractere Bonjour, j'aimerais savoir s'il est possible de faire en langage C ceci: j'ai par exemple un fichier test.txt dans lequel il se trouve la chaine de caractere suivante: toto est il possible de remplacer cette chaine de caractere par une autre... www.commentcamarche.net/forum/affich-3184665-langage-c-remplacer-chaine-de-caractere
Les piles en langage CLes piles Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la pile IV. Opérations sur les piles A. Initialisation B. Insertion d'un élément dans la pile C. Ôter un élément de la pile D. Affichage... www.commentcamarche.net/faq/sujet-8283-les-piles-en-langage-c
Liste simplement chaînéeLISTES SIMPLEMENT CHAINÉES Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la liste IV. Opérations sur les listes chaînées A. Initialisation B. Insertion d'un élément dans la liste 1. Insertion... www.commentcamarche.net/faq/sujet-7444-liste-simplement-chainee
Langage C pointeurs, creation de liste. (Résolu)Bonjour a tous. Voila, je rencontre quelaues petits preoblemes en langage C. Le but est de creer des fiches afin de creer une listes les contenant. Il faut ensuite afficher ce que l on a entre dans chaque fiche, puis afficher enfin le nombre de fiches... www.commentcamarche.net/forum/affich-2170245-langage-c-pointeurs-creation-de-liste
Langage c liste chainee urgent please (Résolu)Bonjour, Bonjour, svp j'ai un travail a faire avant le 22h d'aujourd'hui c'est que il faut que je réalise les taches suivants en liste chainée (langage c) : on a une structure article compose de int ref et float prix manipulant les... www.commentcamarche.net/forum/affich-5186734-langage-c-liste-chainee-urgent-please
Cours des files et pile et listes chainéesbonjour , je cherche un cours de langage c qui contient des parties bien detaillé sur les piles les files et les listes chainées.... et merci a tous les personnes qui veulent m'aidez d'apprendre cette partie www.commentcamarche.net/forum/affich-2532032-cours-des-files-et-pile-et-listes-chainees
Langage C - Les variablesLe concept de variable Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. Les variables en langage C sont typées, c'est-à-dire que les données contenues dans... www.commentcamarche.net/contents/c/cvar.php3
Langage C++ - Les types de donnéesLes types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître... www.commentcamarche.net/contents/cpp/cpptype.php3
Langage C - Les types de donnéesLes types de données Les données manipulées en langage C sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître l'occupation mémoire (le... www.commentcamarche.net/contents/c/ctype.php3