Help: LinkedLists with Type's

BlitzMax Forums/BlitzMax Beginners Area/Help: LinkedLists with Type's

Num3(Posted 2005) [#1]
Can someone point me out how to create a linkedlist with my own type?

Something like this...

Type PLAYER
 Field x,y,z
EndType

Me:PLAYER=Createlist()



teamonkey(Posted 2005) [#2]
Type PLAYER
 Field x,y,z
EndType

Me:TList = CreateList()
MyPlayer:PLAYER = New PLAYER

ListAddLast Me, MyPlayer



Bot Builder(Posted 2005) [#3]
What exactly are you trying to do? If you want a linked list of all the players then you would do:

Type Player						'Caps looks like shouting
	Global List:TList=New TList	'Specific to type decleration, not instances

	Method New()				'Automatically called, its the constructor
		List.AddLast(self)		'Adds the created Player to the list of players
	EndMethod

	Field x#,y#,z#				'# is for floating point variables
End Type

Me:Player=New Player			'Auto-calls new method



Num3(Posted 2005) [#4]
I'm trying to create a linked list where i can add players that have their own type's (x,y,z).

Listadd()-> element (player x,y,z)


So that later on i can parse the entire list with 'for eachin' and place them on screen according to their x,y,z, and also sort the list according to the Z-order...


ImaginaryHuman(Posted 2005) [#5]
An alternative you might want to consider (not that linked lists are wrong) is using an array of types instead of a list, and doing a little extra management yourself.

Something like...

Type Player
   Field x:Int
   Field y:Int
   Field z:Int
   Field AnimFrame:Int
   Field LifeForce:Int
   Field PlayerIDNumber:Int
End Type

Const MaxNumberOfPlayers:Int=8
Local PlayerArray:Player[MaxNumberOfPlayers]
Local TotalPlayers:Int=0

'Add a player
PlayerArray[TotalPlayers]=New Player
PlayerArray[TotalPlayers].x=50
PlayerArray[TotalPlayers].y=100
PlayerArray[TotalPlayers].z=400
PlayerArray[TotalPlayers].AnimFrame=1
PlayerArray[TotalPlayers].LifeForce=100
PlayerArray[TotalPlayers].PlayerIDNumber=TotalPlayers
TotalPlayers:+1

'Remove a player
TotalPlayers:-1
Local PlayerToRemove:Int=3 'whatever number player
PlayerArray[PlayerToRemove]=PlayerArray[TotalPlayers]
PlayerArray[TotalPlayers]=Null
'Could do a Release or FlushMem on PlayerArray[TotalPlayers]

If that suits your needs then all well and good. Couple of drawbacks though ... if you wanted to be able delete a player and then add a new player, you probably would want to add the new player with the ID number of a deleted player. To do that you may need an additional array to keep track of which player number is mapped to which entry in the PlayerArray. Also if you want to sort the players you'd have to write your own sort routine. *sorry* - maybe not suited to every application. You might also want a `mapping` array that keeps track of which player is stored at which index in the player array.


tonyg(Posted 2005) [#6]
This *might* be what you're after and I'm not sure how well coded it is.
It creates a 'mainlist' and then 2 sub-object lists. Each object appears on it's own list and the mainlist.
You can do a for/eachin the mainlist for all objects (or certain sub-objects) or the sub-object lists.
Imagine the mainlist is all your players...
Type objects
  Field x:Int
  Field y:Int
  Field legs:Int
End Type
Type human Extends objects
  Field name:String
  Field sex:String
  Global humanlist:tlist
Function create(x:Int,y:Int,legs:Int,name:String,sex:String)
     If humanlist=Null humanlist=CreateList()
     newhuman:human = New human
        newhuman.x = x
        newhuman.y = y
        newhuman.legs = legs
        newhuman.name = name
        newhuman.sex = sex
        humanlist.addlast(newhuman)
       objectlist.addlast(newhuman)
End Function
End Type
Type furn Extends objects
  Field material:String
  Global furnlist:tlist
  Function create(x:Int,y:Int,legs:Int,material:String)
   If furnlist=Null furnlist = CreateList()
   newfurn:furn = New furn
      newfurn.x = x
      newfurn.y = y
      newfurn.legs = legs
      newfurn.material = material
      furnlist.addlast(newfurn)
     objectlist.addlast(newfurn)
   End Function
End Type
Global objectlist:tlist
objectlist=CreateList()
human.create(100,100,2,"Bob","Male")
human.create(100,100,2,"Jane","Female")
furn.create(100,100,4,"Wood")
Print "Number of objects in mainlist " + CountList(objectlist)
Print "Cycling through ALL objects in mainlist"
For Local s:objects=EachIn objectlist
   Print s.x + " " + s.y + " " + s.legs
   s.x = s.x + 1
Next
Print "Cycling only humans in mainlist"
For Local w:human = EachIn objectlist
   Print w.legs
   w.legs = w.legs + 1
Next
Print "Cycling all humans in humanlist"
For Local t:human= EachIn human.humanlist
   Print t.name + " " + t.x + " " + t.legs
Next
Print "Cycling all furniture in furniturelist"
For Local m:furn = EachIn furn.furnlist
  Print m.material + " " + m.x + " " + m.legs
Next