Problème avec Liste chainée et les POINTEURS !

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
dd1971
Messages : 14
Inscription : mar. 09/janv./2007 16:53

Problème avec Liste chainée et les POINTEURS !

Message par dd1971 »

Je viens d'apprendre à utiliser les listes chainées, mais je bloque sur une chose : J'arrive à la créer, à ajouter en fin de liste, mais dès que je veux par exemple ajouter à la position deux (juste après le head ou la tete) ca coince, est ce que quelqu'un aurait la gentillesse de me filer un coup de pouce.

Merci !

Voilà :

Code : Tout sélectionner

;####################

Structure Repertoire 
  nom.s
  age.w
  *next.Repertoire
EndStructure

NewList MaListe.Repertoire()

;initialisation d'une liste 
Define.Repertoire *head, *element
*head = AllocateMemory(SizeOf(Repertoire))
*head\next = #Null

;---------;ajoute element à la liste (1)
*element = AllocateMemory(SizeOf(Repertoire))
*head\next = *element
*element\next=#Null

;remplissage
*element\nom = "Titi"

*element = *head
While *element\Next
  *element = *element\next 
Wend

;--------;ajoute element à la liste (fin de liste : (2))
*element\next  = AllocateMemory(SizeOf(Repertoire))
*element =*element\next
*element\next=#Null

;remplissage
*element\nom = "Toto"

;--------;ajoute element à la liste (3)
*element\next  = AllocateMemory(SizeOf(Repertoire))
*element =*element\next
*element\next=#Null

;remplissage
*element\nom = "Lolo"

;######### C'EST ICI QUE JE COINCE ################

;----- Ajoute en Deuxième position
*element = AllocateMemory(SizeOf(Repertoire))

;????
*element\next = *head\Next
*head\next = *element

;remplissage
*element\nom = "Nono"  ;----------->Nono SE MET en 1er alors qu'il devrait etre en seconde position
                        ;--Où est l'erreur ? SVP
;##################################################

;liste les elements
*element = *head
While *element\Next
     *element = *element\next 
     Debug *element\nom 
     
Wend
erix14
Messages : 480
Inscription : sam. 27/mars/2004 16:44
Contact :

Message par erix14 »

Je t'ai fait un code qui pourrait t'aider :

Code : Tout sélectionner

Structure Repertoire
	nom.s
	age.w
	*next.Repertoire
EndStructure
Global *head.Repertoire, *element.Repertoire

Procedure AddElement_(nom.s, age.w)
	If *element = #Null
		*element = AllocateMemory(SizeOf(Repertoire))
		*head = *element
	Else
		*element\next = AllocateMemory(SizeOf(Repertoire))
		*element = *element\next
	EndIf
	*element\nom = nom
	*element\age = age
	*element\next = #Null
EndProcedure

Procedure InsertElement_(Position.l, nom.s, age.w)
	Protected *element.Repertoire = *head
	While Position And *element
		*Old.Repertoire = *element
		Position - 1 : *element = *element\next
	Wend
	If *element
		*insert.Repertoire = AllocateMemory(SizeOf(Repertoire))
		*insert\nom = nom
		*insert\age = age
		*insert\next = *element
		If *Old
			*Old\next = *insert
		Else
			*head = *insert
		EndIf
	Else
		AddElement_(nom, age)
	EndIf
EndProcedure

AddElement_("Titi", 10)
AddElement_("Toto", 12)
AddElement_("Lolo", 15)
;/ Ajout en deuxième position (la liste commence à 0)
InsertElement_(2, "Nono", 13)
;liste les elements
*element = *head
While *element
	Debug *element\nom
	*element = *element\next
Wend
dd1971
Messages : 14
Inscription : mar. 09/janv./2007 16:53

Structure du code ci-dessus, et pointeurs

Message par dd1971 »

Merci Rix14!

Là où c'est génial dans ta programmation , c'est que tu as pensé meme au cas ou on insere alors que la liste est vide (ca peut toujours servir).

Une petite question, pour ceux qui programment depuis longtemps :
Avec les pointeurs, il y a "l'exercice" des listes chainées pour apprendre à les maitriser, des arbres binaires, mais il y aurait il autre chose (de ce style)

Merci.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Re: Structure du code ci-dessus, et pointeurs

Message par Dr. Dri »

dd1971 a écrit :Merci Rix14!

Là où c'est génial dans ta programmation , c'est que tu as pensé meme au cas ou on insere alors que la liste est vide (ca peut toujours servir).
J'aime bien ce genre de phrase, on sent que t'as cherché à comprendre ce que faisais le code

Dri :D
dd1971
Messages : 14
Inscription : mar. 09/janv./2007 16:53

Message par dd1971 »

En fait je coince sur une chose. Je sais ca peut paraitre bete mais pour "position-1" comment le compilateur sait qu'il sagit de la chaine ?

Pour ce qui est de la phrase, c'est vrai que je suis admiratif des "mozart" du code. Pour moi une programme bien fait est une "oeuvre rationnelle", et les bons (quand le code est concis, commenté et bien structuré) sont pour moi des artistes. En France (hm !) on parle des arts de la table et on ne pense jamais aux génies de l'informatique qui révolutionnent notre quotidien. D'ailleurs souvent ils sont en plus très humain et très spirituels (Steeve Jobs à ses début a été ramassé des pomme pendant un an en Inde.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

c'est transmit en paramètre nan ?

Dri
dd1971
Messages : 14
Inscription : mar. 09/janv./2007 16:53

Message par dd1971 »

Oui mais...

si je prend x.trucmachin l'ordi c'est de quoi je parle, mais la je ne comprend pas, position n'est rien d'autre qu'une variable locale (enfin a premiere vue). En fait voila, pour utiliser le bon terme, il n'y a aucun typage pour position et le compilateur sait qu'il sagit de la liste chainée. Et encore autre chose quand l'élément est insérré est ce que le pointeur continu jusqu'au bout de la liste ?

Merci
Répondre