Construire une liste à l'arache

Construire une liste à l'arache - Ada - Programmation

Marsh Posté le 18-03-2009 à 11:26:26    

Bonjour,
 
Dans le cadre de l'étude des propriété d'un texte, j'écris vite fait un petit programme qui utilise la structure suivante.
 

Code :
  1. type T_Node;
  2.      type Node_Access is access T_Node;
  3.      type T_Node is
  4.         record
  5.            Word : Unbounded_String;
  6.            Next : Node_Access := null;
  7.            Prev : Node_Access := null;
  8.            Up   : Node_Access := null;
  9.            Down : Node_Access := null;
  10.         end record;


 
que j'encapsule dans un type article

Code :
  1. type T_Knowledge is
  2.         record
  3.            Matrix : Node_Access;
  4.         end record;


 
 
Je veux réaliser une sorte de maillage avec les mots. Chaque nouveau mot est ajouter à la liste Matrix alors que les mots déjà dans la liste son ajouté dans la dimention transversale.
A vrai ldire, je sais pas vraiment ou j'en suis.
Mon problème est qu'a l'ajout de la seconde phrase avec Add le programme ne trouve pas de null en New_List.Next pour finir l'ajout.
 
 
la trace du programme....
 
J'ai deux phrase terminant par un point. A l'ajout de la première pas de problème.
A l'ajout de la seconde, le programme boucle entre le dernier mot et le point final.
J'ai remarquer qu'a l'ajout de la seconde phrase la procedure String_To_List bouclait égélement faute de trouver un null en next (fin de list) ; Pourtant cette même phrase est correctement transformé au début de la procedure Add ... Me semble t-il :/
 
Si vous avez du temps pour me dire en gros, ce que je dois faire pour m'y retrouver un peu. Merci.
 
 
J'ajoute les expression (les phrases) dans Matrix par l'intermédiare de la procedure String_To_List, avec la procedure Add suivante
 

Code :
  1. procedure Add(Expr      : in String;
  2.                        Knowledge : in out T_knowledge) is
  3.  
  4.         New_List : Node_access := String_To_List(Expr);
  5.         Next : Node_Access;
  6.      begin
  7.  
  8.         if Knowledge.Matrix = null then
  9.            knowledge.Matrix := New_List;
  10.         else
  11.            while New_List /= null loop
  12.               Next := Knowledge.Matrix;
  13.               while Next.next /= null and then
  14.                 Next.Word /= New_List.Word loop
  15.                  Next := Next.Next;
  16.               end loop;
  17.               if Next.Word /= New_List.Word then
  18.                  while Next.Next /= null loop
  19.                     Next := Next.Next;
  20.                  end loop;
  21.                  Next.Next := New_List;
  22.               else
  23.                  while Next.up /= null loop
  24.                     Next := Next.up;
  25.                  end loop;
  26.                  Next.up := New_List;
  27.                  Next.up.down := Next;
  28.               end if;
  29.               New_List := New_List.Next;
  30.            end loop;
  31.         end if;
  32.      end Add;


 
Voici la procedure string_To_List.
 

Code :
  1. function String_To_List(Expr : in String) return Node_access is
  2.  
  3.  
  4.         New_List : Node_Access;
  5.         New_Node : Node_access;
  6.         Top  : Positive := 1;
  7.         Bot  : Natural := 0;
  8.         Char : Character;
  9.      begin
  10.  
  11.         for Position in Expr'Range loop
  12.            Char := Expr(position);
  13.            if Is_Letter(char) or
  14.              Is_digit(char) then
  15.               Bot := Bot + 1;
  16.            elsif Is_Special(Char) then
  17.               case char is
  18.                  when ' ' =>
  19.                     if Bot >= Top then
  20.                        New_Node := new T_Node;
  21.                        New_Node.Word := To_Unbounded_String(Expr(Top..Bot));
  22.                        Link(New_List, New_Node);
  23.                        Top := Position+1;
  24.                        Bot := Position;
  25.                     else
  26.                        Top := Top + 1;
  27.                        Bot := Bot + 1;
  28.                     end if;
  29.                  when '.' =>
  30.                     if Position < Expr'Length then
  31.                        if Is_Digit(Expr(Position + 1)) then
  32.                           Bot := Bot + 1;
  33.                        else
  34.                           New_Node := new T_Node;
  35.                           New_Node.Word := To_Unbounded_String(Expr(Top..Bot));
  36.                           Link(New_List, New_Node);
  37.                           New_Node := new T_Node;
  38.                           New_Node.Word := To_Unbounded_String(Expr(position..position));
  39.                           Link(New_List, New_Node);
  40.                           Top := Position+1;
  41.                           Bot := Position;
  42.                        end if;
  43.                     else
  44.                        New_Node := new T_Node;
  45.                        New_Node.Word := To_Unbounded_String(Expr(Top..Bot));
  46.                        Link(New_List, New_Node);
  47.                        New_Node := new T_Node;
  48.                        New_Node.Word := To_Unbounded_String(Expr(position..position));
  49.                        Link(New_List, New_Node);
  50.                     end if;
  51.                  when others =>
  52.                     New_Node := new T_Node;
  53.                     New_Node.Word := To_Unbounded_String(Expr(Top..Bot));
  54.                     Link(New_List, New_Node);
  55.                     New_Node := new T_Node;
  56.                     New_Node.Word := To_Unbounded_String(Expr(position..position));
  57.                     Link(New_List, New_Node);
  58.                     Top := Position+1;
  59.                     Bot := Position;
  60.               end case;
  61.            else
  62.               Put(Character'Val(7));
  63.            end if;
  64.         end loop;
  65.         return New_List;
  66.      end String_To_List;


 
Et la procedure Link
 

Code :
  1. procedure Link(List : in out Node_Access;
  2.                     pointer : in Node_access) is
  3.         Next : Node_Access := List;
  4.      begin
  5.         if list = null then
  6.            list := Pointer;
  7.         else
  8.            while Next.Next /= null loop
  9.               Next := Next.Next;
  10.            end loop;
  11.            Next.Next := Pointer;
  12.            Pointer.prev := Next;
  13.         end if;
  14.  
  15.      end Link;


Message édité par Profil supprimé le 18-03-2009 à 11:31:13
Reply

Marsh Posté le 18-03-2009 à 11:26:26   

Reply

Marsh Posté le 18-03-2009 à 11:44:55    

Je récapitule mon problème...
A la ligne 11 de la procedure Add ... New_List n'est jamais null.
Merci.

Reply

Marsh Posté le 18-03-2009 à 12:00:20    

Bon désolé pou le dérangement.
 
Aux ligne 21 et 26 il faut créer un nouveau noeud an affectant := new T_Node ' (New_List); si non, on ajoute sans cesse la fin de la liste à la fin de la même liste. Si j'ai bien suivi.
 
Pour quoi, je trouve toujours après avoir posté alors que ça fait deux jour que je planche ?  [:rhetorie du chaos]

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed