[Ada] Tri de liste (pointeurs)

dj_titeuf Messages postés 17 Date d'inscription samedi 22 mai 2004 Statut Membre Dernière intervention 23 juillet 2009 - 13 mai 2009 à 20:31
dj_titeuf Messages postés 17 Date d'inscription samedi 22 mai 2004 Statut Membre Dernière intervention 23 juillet 2009 - 16 mai 2009 à 19:52
Bonsoir,

Je cherche à réaliser un petit programme, dont voici les spécificités:

- Saisir des valeurs entières comprises dans un certain intervalle fournies par l'utilisateur. Rentrer 0 met fin à la saisie;
- Ranger ces valeurs dans une liste chaînée dans l'ordre croissant: valeur négatives en début de liste, positives en fin;
- Afficher la liste.

Je pense avoir réussi à faire le premier point. De plus, l'insertion des valeurs dans une liste ainsi que son affichage semble fonctionner (test unitaire réalisé). En revanche, j'ai des difficultés à faire le tri des valeurs dans la liste. J'essaye de me représenter la situation avec des schémas, un peu en vain. Pourriez-vous m'expliquer comment faire svp?

Je vous poste ce que j'ai déjà fait, afin d'utiliser les mêmes notations lors des éventuelles explications:

with Ada.Integer_Text_IO, Ada.Text_IO;
use Ada.Integer_Text_IO, Ada.Text_IO;

procedure Prog_1 is

   -- Declaration des types et sous-types

   subtype Entiers is Integer range -50..50;

   type Element;
   type Liste is access Element;

   type Element is
      record
         Val  : Entiers;
         Suiv : Liste;
      end record;

   procedure Saisir (
         Ma_Liste :    out Liste) is

      N         : Entiers;
      Continuer : Boolean := False;

   begin

      Continuer := True;

      Put("Veuillez rentrer les valeurs de votre liste, comprises entre -50 et 50; taper 0 terminera la saisie.");

      while Continuer = True loop

         New_Line(2);
         Get(N);
         Skip_Line;

         if N = 0 then

            Continuer := False;

         end if;

      end loop;

   end Saisir;

   procedure Inserer (
         Ma_Liste : in out Liste;
         Valeur   : in     Entiers) is

      Aux : Liste := Ma_Liste;

   begin

      if Ma_Liste = null then

         Ma_Liste := new Element'(Valeur, null);

      else

         Inserer(Aux.All.Suiv, Valeur);
         Ma_Liste := Aux;

      end if;

   end Inserer;

   procedure Afficher (
         Ma_Liste : in     Liste) is

      Aux : Liste := Ma_Liste;

   begin

      Put("La liste que vous venez d'entrer est la suivante: ");

      New_Line(2);

      while Aux /= null loop

         Put(Aux.All.Val,1);
         New_Line;
         Aux := Aux.All.Suiv;

      end loop;

   end Afficher;

   -- Structure du programme principal

   Ma_Liste : Liste;
   Valeur: Entiers;

begin

   --Ma_Liste := new Element'(3,new Element'(-5,null));   <==TEST D'AFFICHAGE OK

   Saisir(Ma_Liste);
   Inserer(Ma_Liste, Valeur);
   Afficher(Ma_Liste);

end Prog_1;

Par ailleurs, si je constate que l'affichage fonctionne correctement avec l'exemple 3,-5 pour le test, je remarque qu'il n'en est pas de même lorsque je fais passe par la procédure de saisie: en effet, un nombre très grand s'affiche à la place de mes valeurs rentrées: d'où vient le problème?

Merci d'avance!

1 réponse

dj_titeuf Messages postés 17 Date d'inscription samedi 22 mai 2004 Statut Membre Dernière intervention 23 juillet 2009
16 mai 2009 à 19:52
Bonjour,

Je constate que je n'ai pas eu de réponses en masse... Peut-être mon sujet n'est-il pas posté au bon endroit? Si tel est le cas, n'hésitez pas à m'en faire part!
0
Rejoignez-nous