added a simple LinkedList

This commit is contained in:
hyunghwan.chung
2017-03-04 05:48:23 +00:00
parent 90f46cc1fe
commit 1ebfe8d5e9
6 changed files with 281 additions and 80 deletions

View File

@ -588,3 +588,141 @@ extend Apex
^Association new key: self value: object
}
}
## -------------------------------------------------------------------------------
class Link(Object)
{
dcl prev next value.
method(#class) new: value
{
| x |
x := self new.
x value: value.
^x
}
method prev { ^self.prev }
method next { ^self.next }
method value { ^self.value }
method prev: link { self.prev := link }
method next: link { self.next := link }
method value: value { self.value := value }
}
class LinkedList(Collection)
{
dcl first last tally.
method initialize
{
self.tally := 0.
}
method size
{
^self.tally
}
method first
{
^self.first
}
method last
{
^self.last
}
method insertLink: link at: pos
{
if (pos isNil)
{
(* add link at the back *)
if (self.tally == 0)
{
self.first := link.
self.last := link.
link prev: nil.
}
else
{
link prev: self.last.
self.last next: link.
self.last := link.
}.
link next: nil.
}
else
{
(* insert the link before pos *)
link next: pos.
link prev: pos prev.
if (pos prev notNil) { pos prev next: link }
else { self.first := link }.
pos prev: link
}.
self.tally := self.tally + 1.
^link
}
method insert: value at: pos
{
^self insertLink: (Link new: value) at: pos
}
method addFirst: value
{
^self insert: value at: self.first
}
method addLast: value
{
^self insert: value at: nil
}
method addFirstLink: link
{
^self insertLink: link at: self.first
}
method addLastLink: link
{
^self insertLink: link at: nil
}
method removeLink: link
{
if (link next notNil) { link next prev: link prev }
else { self.last := link prev }.
if (link prev notNil) { link prev next: link next }
else { self.first := link next }.
self.tally := self.tally - 1.
}
method removeFirst
{
^self removeLink: self.first
}
method removeLast
{
^self removeLink: self.last
}
method do: block
{
| link next |
link := self.first.
while (link notNil)
{
next := link next.
block value: link value.
link := next.
}
}
}

View File

@ -187,65 +187,105 @@ class Number(Magnitude)
self primitiveFailed.
}
method to: end by: step do: aBlock
method to: end by: step do: block
{
| i |
i := self.
(*
(step > 0)
ifTrue: [
[ i <= end ] whileTrue: [
aBlock value: i.
block value: i.
i := i + step.
].
]
ifFalse: [
[ i >= end ] whileTrue: [
aBlock value: i.
block value: i.
i := i - step.
].
].
*)
if (step > 0)
{
while (i <= end)
{
block value: i.
i := i + step.
}
}
else
{
while ( i => end)
{
block value: i.
i := i - step.
}
}
}
method to: end do: aBlock
method to: end do: block
{
^self to: end by: 1 do: aBlock.
^self to: end by: 1 do: block.
}
method priorTo: end by: step do: aBlock
method priorTo: end by: step do: block
{
| i |
i := self.
(*
(step > 0)
ifTrue: [
[ i < end ] whileTrue: [
aBlock value: i.
block value: i.
i := i + step.
].
]
ifFalse: [
[ i > end ] whileTrue: [
aBlock value: i.
block value: i.
i := i - step.
].
].
*)
if (step > 0)
{
while (i < end)
{
block value: i.
i := i + step.
}
}
else
{
while ( i > end)
{
block value: i.
i := i - step.
}
}
}
method priorTo: end do: aBlock
method priorTo: end do: block
{
^self priorTo: end by: 1 do: aBlock.
^self priorTo: end by: 1 do: block.
}
method abs
{
self < 0 ifTrue: [^self negated].
^self.
(*self < 0 ifTrue: [^self negated].
^self.*)
^if (self < 0) { self negated } else { self }
}
method sign
{
self < 0 ifTrue: [^-1].
(* self < 0 ifTrue: [^-1].
self > 0 ifTrue: [^1].
^0.
^0.*)
^if (self < 0) { -1 }
elsif (self > 0) { 1 }
else { 0 }
}
}
@ -281,26 +321,12 @@ class(#liword) LargeInteger(Integer)
class(#liword) LargePositiveInteger(LargeInteger)
{
method abs
{
^self.
}
method sign
{
^1.
}
method abs { ^self }
method sign { ^1 }
}
class(#liword) LargeNegativeInteger(LargeInteger)
{
method abs
{
^self negated.
}
method sign
{
^-1.
}
method abs { ^self negated }
method sign { ^-1 }
}