(Résolu] Comment manipuler une liste chainée

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

(Résolu] Comment manipuler une liste chainée

Message par Micoute »

Bonjour à tous,

j'ai un petit problème, je souhaiterais que, quand 2 éléments d'une liste structurée ont la même valeur, on puisse concaténer les 2 éléments.

Par exemple :
\Quand$ = "15/05/2013"
\Qui$ = "Moi"
\Quoi$ = "Programmer"

\Quand$ = "15/05/2013"
\Qui$ = "Elle"
\Quoi$ = "Faire la vaisselle
J'aimerais que ça devienne
"15/05/2013" + #LF$ + "Moi" + #LF$ + "Programmer" + #LF$ + "Elle" + #LF$ + "Faire la vaisselle"
Je vous remercie tous pour votre aide.
Dernière modification par Micoute le jeu. 16/mai/2013 12:18, modifié 1 fois.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Comment manipuler une liste chainée

Message par Ar-S »

Une solution.

Code : Tout sélectionner


 
 Structure Truc
    Qui.s
    Quand.s 
    Quoi.s 
  EndStructure

  Global Dim A_Faire.Truc(1) ; 2 emplacements dans le tableau

  ; Ici la position '0' du tableau A_Faire() concernera Monsieur
  
  A_Faire(0)\Qui = "Monsieur doit "
  A_Faire(0)\Quand = "13-05-2013 " 
  A_Faire(0)\Quoi = "programmer "

; Ici la position '1' du tableau A_Faire() concernera Monsieur
  
  A_Faire(1)\Qui = "Madame doit "
  A_Faire(1)\Quand = "13-05-2013 " 
  A_Faire(1)\Quoi = "sortir Pepette "

; --------------------------------------

; PROCEDURE

Procedure.s TaskCheck(LaDate.s)
Shared tache.b

tache = 0
      ; Vérifier si des tâches sont prévues à cette date
      If LaDate = A_Faire(0)\Quand 
            tache + 1
            Formule.s = A_Faire(0)\Quand + #LF$ + A_Faire(0)\Qui + #LF$ + A_Faire(0)\Quoi
      EndIf      
      
      If LaDate = A_Faire(1)\Quand 
            tache + 1
            Formule.s = A_Faire(1)\Quand + #LF$ + A_Faire(1)\Qui + #LF$ + A_Faire(1)\Quoi
      EndIf
            
      If tache = 2
            Formule.s = A_Faire(0)\Quand + #LF$ + A_Faire(0)\Qui + #LF$ + A_Faire(0)\Quoi + #LF$ + A_Faire(1)\Qui + #LF$ + A_Faire(1)\Quoi
      ElseIf tache = 0
            Formule.s = "Pas de tâche de programmée"
      EndIf

      ProcedureReturn Formule.s   
EndProcedure

; ------------------------------

; -------Programme-------

DateRecuperee.s = "13-05-2013 "
Debug TaskCheck(DateRecuperee.s)

DateRecuperee.s = "14-05-2013 "
Debug TaskCheck(DateRecuperee.s)

; test  avec seulement une date de valide
 A_Faire(1)\Quand = "15-05-2013 " 
 
DateRecuperee.s = "15-05-2013 "
Debug TaskCheck(DateRecuperee.s)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Comment manipuler une liste chainée

Message par Micoute »

Bonsoir Ar-s et merci beaucoup,

J'avais déjà pensé à utiliser un tableau, mais le problème c'est que je ne peux pas savoir combien il y a de données dans ma BDD, je ne vais quand même pas faire une liste pour calculer longueur = ListSize(Activites()) et Dim Tableau(Longueur), ce serait un peu débile.

C'est pour cette raison que j'aurais préféré une liste, car il suffit de mettre un AddElement et la liste s'agrandit toute seule,
peut-être que je pourrais filtrer ma BDD pour la mettre dans l'ordre chronologique ? Mais le problème c'est que je ne sais pas comme comparer un élément de la liste avec un autre de la même liste, sinon je reprendrais la procédure.

En tout cas, merci encore et peut-être que quelqu'un d'autre connaît-il la réponse.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Comment manipuler une liste chainée

Message par comtois »

tu as regardé l'exemple de la doc pour la commande PushListPosition() ? à mon avis c'est ce qu'il te faut.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Demivec
Messages : 91
Inscription : sam. 18/sept./2010 18:13

Re: Comment manipuler une liste chainée

Message par Demivec »

Code : Tout sélectionner

Structure Truc
  Qui.s
  Quand.s 
  Quoi.s 
EndStructure

NewList Faire.Truc() 

DataSection
  tache:
  ;Qui, Quand, Quoi
  Data.s "Fred", "13-05-2013", "programme"
  Data.s "Freak", "13-06-2013", "programme"
  Data.s "Fred", "13-06-2013", "debug"
  Data.s "Fred", "13-06-2013", "dormir"
  Data.s "Fred", "13-05-2013", "dormir"
  Data.s "Fred", "13-05-2013", "manger"
  Data.s "Freak", "13-06-2013", "debug"
  
  Data.s "XXX Fin XXX", "XXX Fin XXX", "XXX Fin XXX"
EndDataSection

Restore tache
Repeat
  AddElement(Faire())
  Read.s Faire()\Qui
  Read.s Faire()\Quand
  Read.s Faire()\Quoi
Until Faire()\Qui = "XXX Fin XXX"
DeleteElement(Faire())
  
SortStructuredList(Faire(), #PB_Sort_Ascending, OffsetOf(Truc\Quand), #pb_string)
Define premQuand.s, enumerer.s

If FirstElement(Faire())
  premQuand = Faire()\Quand
  enumerer = premQuand + #LF$ + Faire()\Qui + #LF$ + Faire()\Quoi
EndIf 

While NextElement(Faire())
  If premQuand = Faire()\Quand
    enumerer + #LF$ + Faire()\Qui + #LF$ + Faire()\Quoi
  Else
    Debug enumerer
    premQuand = Faire()\Quand
    enumerer = premQuand + #LF$ + Faire()\Qui + #LF$ + Faire()\Quoi
  EndIf
Wend

If enumerer
  Debug enumerer
EndIf
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Comment manipuler une liste chainée

Message par Micoute »

Bonjour Demivec et merci énormément,

oui, c'est bien ça que je cherchais à faire, mais c'était trop simple et c'est surement pour ça qu je n'y ai même pas pensé.

Merci encore pour ce partage.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Demivec
Messages : 91
Inscription : sam. 18/sept./2010 18:13

Re: Comment manipuler une liste chainée

Message par Demivec »

Micoute a écrit :Bonjour Demivec et merci énormément,

oui, c'est bien ça que je cherchais à faire, mais c'était trop simple et c'est surement pour ça qu je n'y ai même pas pensé.

Merci encore pour ce partage.
De rien :)
Répondre