begin process at 2013 05 23 20:03:28
  Trouver un code source :
 
dans
 
Accueil > 

Tutoriels

 > 

Tutoriaux

 > Manipulation des listes linéaires simplement chaînées

Manipulation des listes linéaires simplement chaînées


 Information sur le tutoriel

Note :
Aucune note

 Description

Salutations;

Le tutorial qui suit est destiné aux programmeurs débutants en langage C et qui sont appelés à manipuler des listes linéaires chaînées simples.

Pour éclaircir les idées, j'opte pour une démarche par l'exemple: pour chaque opération sur une liste chaînée, je vais donner une routine (fonction ou procédure) associée. Donc, vous le devinez: je ne vais point faire de la littérature sur les listes chaînées simples; ladite littérature est pléthorique sur internet.

A noter que ce petit tutorial est inspiré de ma source précédemment déposée -sous un autre pseudo- sur ce site sous le titre: "40 procédures pour la gestion d'une liste linéaire chaînée".

Aussi, ce tutorial n'est pas complet pour l'instant: il sera mis à jour au moins une fois par semaine en suivant vos suggestions (d'autres routines y seront ajoutées)

Pour simplifier les choses, je vais traiter une liste d'entiers naturels que vous pourrez ensuite adapter facilement aux besoins de votre problème.

Tutorial

1-Définition d'une liste chaînée:


struct pointeur{
        int entier;/* on s'est mis d'accord pour que notre chaîne traite des entiers*/
        struct pointeur *suivant;/* pour pointer sur l'élément suivant de la chaîne*/
       };


Le langage C nous permet de créer nos propres types; à ce titre, on va définir un type "cellule" qui nous servira de moule pour toute cellule de la chaîne qui sera implémentée:


typedef struct pointeur cellule; 

2-Création d'une liste linéaire chaînée simple:

La fonction suivante va servir à créer une liste chaînée simple. Elle va retourner la tête de la liste ainsi créée:

cellule *creation_liste_chainee_1(){


char reponse;/* confirmation ou non d'ajout d'un élément à la liste */

do{
clrscr(); /* pour effacer l'écran, il faut inclure <conio.h> */
puts("Souhaitez-vous ajouter un élément à votre liste ? (o/n) :  ");
scanf("%c",&reponse);
}while((rep!='o')&&(reponse!='n')&&(reponse!='O')&&(reponse!='N');
/*retaper si autre chose que N,O,o,n est saisi*/

 

if((reponse=='o')||(reponse=='O')) {

/*si le user souhaite effectivement saisir un élement*/
cellule*ptr_tampon=NULL;
/*il faut initialiser votre pointeur intermédiaire à NULL pour qu'il ne pointe pas aléatoirement sur un élément mémoire*/

ptr_tampon=(cell*)malloc(sizeof(cell));
/*allocation d'un espace mémoire pour la nouvelle cellule de la chaîne*/

puts("Veuillez saisir votre entier :  ");
scanf("%3d",&ptr_tampon->entier);
ptr_tampon->suivant=tete_de_liste;
tete_de_liste=ptr_tampon;
}

return tete_de_liste;/*notre fonction va retourner la tête de la liste car on en aura besoin*/
}

 

Remarque:
En effet, l'exécution de la fonction précédente a pour effet l'insertion de chaque élément au début de la liste ce qui aura pour effet d'inverser la liste d'entiers ainsi saisie.
Pour remédier à ce problème, on va implémenter une fonction qui crée la liste d'entier et insère chaque élément arrivant à la fin de la liste, comme suit:

cellule* creation_liste_chainee_2()

cellule*precedent=NULL;  // Pour le pointeur qui sauvegarde l'adresse du pointeur
           // précédent déja crée
cell*actual=NULL;     // Pour le pointeur courant
int datum;
int err;
do
 {
  puts(" Veuiellez saisir un entier (une lettre pour arreter) :  ");
  err=scanf("%d",&datum);
  if(err<=0) break; // Pour rendre le nombre de variables lues sans erreur
  actual=(cellule*)malloc(sizeof(cellule));
  actual->entier=datum;
   if(precedent==NULL)
   {
   tete_de_liste=actual;
   }else
   {
   precedent->suivant=actual;
   }
   precedent=actual;
  }while(1);  // fin de la boucle do
   actual->suivant=NULL;
   return tete_de_liste;
}

Commentaires

Commentaire de begueradj le 06/01/2010 08:22:17

Ce tutorial sur les listes chaînées simples va être mis à jour au gré de vos remarques.

Begueradj

Commentaire de CptPingu le 07/01/2010 16:05:33 administrateur CS

Pour un tutoriel, ce n'est vraiment pas terrible.
Il y a peu d'explications, juste du code commenté. Une explication générale ne peut être remplacée par une explication technique ligne à ligne.
De plus, certains morceaux de code n'ont rien à voir avec les listes chaînées:
clrscr(); /* pour effacer l'écran, il faut inclure <conio.h> */
C'est propre à une plateforme, peu utile et sans aucun rapport avec le sujet.

Il manque beaucoup de chose: insertion, suppression, inversion, possibilité de choisir le type d'élément, système d'encapsulation.
Tu n'expliques pas à quoi ça sert, tu ne fais aucun parallèle avec d'autres techniques.
Enfin, le code n'est pas propre (utilisation de malloc, mais pas de free: vive les fuites mémoires !).

Commentaire de begueradj le 10/01/2010 19:35:48

1-C'est signalé là-haut dans la description: je n'ai pas l'intention de faire de la poésie sur les listes chaînées: je veux aller au fait, une approche par l'exemple. Sur ce même site, j'ai posé une question qui reste sans solution (php-button) et j'ai trouvé qu'elle a été posé sur plusieurs sites mais sans réponses aussi: c'est pour celà que j'ai choisi de faire une démarche par l'exemple, le code: c'est plus utile que le bla bla bla !

2-"Il manque beaucoup de chose: insertion, suppression, inversion":C'est signalé là-haut dans la description: au fur et à mesure , je vais ajouter des fonctions de ce type, mais j'attends juste des remarques constructives.

3-"De plus, certains morceaux de code n'ont rien à voir avec les listes chaînées:
clrscr(); /* pour effacer l'écran, il faut inclure <conio.h> */"

Oui, printf("..."); aussi n'a rien à voir avec les listes chaînées ... bon sang, j'ai juste voulu offrir quelque chose d'utilisable, de conviviable.... sinon, par contre j'aurais dû signaler mon compilateur utilisé pour ces codes.


4-"Enfin, le code n'est pas propre (utilisation de malloc, mais pas de free: vive les fuites mémoires !)."

Oui, bonne remarque, mais qui n'est pas à sa place: si tu lis le code, tu trouveras qu'il n'y a pas de place pour un delete ou un free.

Merci

Commentaire de begueradj le 10/01/2010 19:39:33

Je pense que les commentaires et les noms explicites des variables suffiraient à expliquer l'algorithme ...

Commentaire de CptPingu le 11/01/2010 10:20:49 administrateur CS

Pas d'accord. Un tutoriel *est* une explication. Balancer un code comme cela, ne sert à rien.
Un débutant qui arrive, et qui ne connait pas les listes chaînées va se demander:
- A quoi ça sert ?
- Quels sont les avantages face à un tableau "normal"
- Comment ça fonctionne ?
Puis:
- Ok, il a compris le principe, voyons quelques explications détaillées et expliquées.

Là, le débutant arrive, voit 3 fonctions. Il ne reste pas.
S'il veut un code tout fait, il va voir les sources. Un tutoriel est là pour des explications détaillés, avec si possible des dessins.


> 1-C'est signalé là-haut dans la description: je n'ai pas l'intention de faire de la poésie sur les listes chaînées:
Alors écris des sources, pas des tutos.

> 2-je vais ajouter des fonctions de ce type, mais j'attends juste des remarques constructives.
Un tutoriel, tu prends le temps de l'écrire. Tu écris par une phrase par semaine. Ca demande de la motivation.

> 3-Oui, printf("..."); aussi n'a rien à voir avec les listes chaînées ... bon sang, j'ai juste voulu offrir quelque chose d'utilisable, de conviviable....
Printf sert à afficher, ça à un sens. Effacer l'écran et ajouter de la logique qui n'est pas propre au liste chaînées sont hors sujets.

> sinon, par contre j'aurais dû signaler mon compilateur utilisé pour ces codes.
Ecrire un tutoriel sur un sujet généraliste et le rende non portable, fallait le faire !

> 4-Oui, bonne remarque, mais qui n'est pas à sa place: si tu lis le code, tu trouveras qu'il n'y a pas de place pour un delete ou un free.
Expliquer comment allouer, mais pas comment désallouer, c'est pas super pédagogique !

> 5-Je pense que les commentaires et les noms explicites des variables suffiraient à expliquer l'algorithme ...
Et non ! Comme déjà dit, des noms de variables ne remplace par une bonne explication. Tu imagines si tu allais en cours et que le prof te disais: "Bonjour, aujourd'hui je ne vous explique rien, voici un code au tableau, les noms de variables sont explicites démerdez-vous.".

Ce n'est pas un tutoriel.

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2013
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,137 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales