#1740 replaced child node lists with doubly linked lists; various minor changes
--HG-- branch : gsoc2012-achievementshg/feature/gsoc2013-dfighter
parent
ec524af567
commit
2fb14c96eb
@ -0,0 +1,174 @@
|
|||||||
|
<?php
|
||||||
|
class DLL {
|
||||||
|
private $first;
|
||||||
|
private $last;
|
||||||
|
private $size;
|
||||||
|
private $avl;
|
||||||
|
|
||||||
|
function DLL() {
|
||||||
|
$this->avl = new AVLTree();
|
||||||
|
|
||||||
|
$this->first = null;
|
||||||
|
$this->last = null;
|
||||||
|
|
||||||
|
$this->size = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getIterator() {
|
||||||
|
return new NodeIterator($this->first);
|
||||||
|
}
|
||||||
|
|
||||||
|
final function getSize() {
|
||||||
|
return $this->size;
|
||||||
|
}
|
||||||
|
|
||||||
|
final function isEmpty() {
|
||||||
|
return ($this->size == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getFirst() {
|
||||||
|
return $this->first;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getLast() {
|
||||||
|
return $this->last;
|
||||||
|
}
|
||||||
|
|
||||||
|
function addNode($data,$before = null) {
|
||||||
|
if($this->findNode($data->getID()) != null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$n = new DLLnode($data);
|
||||||
|
if($before == null) {
|
||||||
|
//insert as last
|
||||||
|
if($this->last != null) {
|
||||||
|
$this->last->setChild($n);
|
||||||
|
}
|
||||||
|
$n->setParent($this->last);
|
||||||
|
$this->last = $n;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
//insert before
|
||||||
|
$b = $this->findNode($before);
|
||||||
|
if($b != null) {
|
||||||
|
if($b == $this->first) {
|
||||||
|
$this->first = $n;
|
||||||
|
}
|
||||||
|
$tmp = $b->getParent();
|
||||||
|
$b->setParent($n);
|
||||||
|
$n->setChild($b);
|
||||||
|
if($tmp != null) {
|
||||||
|
$tmp->setChild($n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if($this->first == null) {
|
||||||
|
$this->first = $n;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->avl->insert($n);
|
||||||
|
$this->size++;
|
||||||
|
|
||||||
|
#$this->avl->inorder();
|
||||||
|
#echo "<br>";
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeNode($id) {
|
||||||
|
echo "rid: ".$id."<br>";
|
||||||
|
$this->avl->inorder();
|
||||||
|
echo "<br>";
|
||||||
|
|
||||||
|
$n = $this->findNode($id);
|
||||||
|
if($n != null) {
|
||||||
|
echo "removed; ";
|
||||||
|
$p = $n->getParent();
|
||||||
|
$c = $n->getChild();
|
||||||
|
|
||||||
|
if($c != null) {
|
||||||
|
$c->setParent($p);
|
||||||
|
if($p != null) {
|
||||||
|
$p->setChild($c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if($p != null) {
|
||||||
|
$p->setChild(null);
|
||||||
|
}
|
||||||
|
$this->last = $p;
|
||||||
|
}
|
||||||
|
|
||||||
|
if($p == null) {
|
||||||
|
if($c != null) {
|
||||||
|
$c->setParent(null);
|
||||||
|
$this->first = $c;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$this->first = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->avl->remove($id);
|
||||||
|
$this->size--;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->avl->inorder();
|
||||||
|
echo "<br>";
|
||||||
|
}
|
||||||
|
|
||||||
|
function findNode($id) {
|
||||||
|
return $this->avl->find($id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*function storeOrder() {
|
||||||
|
$iter = $this->getIterator();
|
||||||
|
$i = 0;
|
||||||
|
while($iter->hasNext()) {
|
||||||
|
$curr = $iter->getNext();
|
||||||
|
$curr->StoreOrder($i);
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
|
||||||
|
class DLLnode {
|
||||||
|
private $parent;
|
||||||
|
private $child;
|
||||||
|
public $data;
|
||||||
|
|
||||||
|
function DLLNode($d) {
|
||||||
|
$this->parent = null;
|
||||||
|
$this->child = null;
|
||||||
|
$this->data = $d;
|
||||||
|
}
|
||||||
|
|
||||||
|
final function getParent() {
|
||||||
|
return $this->parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
final function setParent($p) {
|
||||||
|
$this->parent = $p;
|
||||||
|
}
|
||||||
|
|
||||||
|
final function getChild() {
|
||||||
|
return $this->child;
|
||||||
|
}
|
||||||
|
|
||||||
|
final function setChild($c) {
|
||||||
|
$this->child = $c;
|
||||||
|
}
|
||||||
|
|
||||||
|
final function getIterator() {
|
||||||
|
return new NodeIterator($this);
|
||||||
|
}
|
||||||
|
|
||||||
|
#function ListStoreOrder($i) {
|
||||||
|
# $this->data->setListOrder($i);
|
||||||
|
# $this->data->update();
|
||||||
|
#}
|
||||||
|
|
||||||
|
function getID() {
|
||||||
|
return $this->data->getID();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
@ -1,31 +1,26 @@
|
|||||||
<?php
|
<?php
|
||||||
trait Node {
|
abstract class Node {
|
||||||
/*---------------------------
|
/*---------------------------
|
||||||
This trait provides basic functionality common to nodes.
|
This class provides basic functionality common to nodes.
|
||||||
|
|
||||||
Every node has an id, and InDeX and a parent.
|
Every node has an id and a parent.
|
||||||
---------------------------*/
|
---------------------------*/
|
||||||
|
|
||||||
protected $idx;
|
|
||||||
protected $id;
|
protected $id;
|
||||||
protected $parent;
|
protected $parent;
|
||||||
|
|
||||||
final function getID() {
|
function Node() {
|
||||||
return $this->id;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final function getIdx() {
|
final function getID() {
|
||||||
return $this->idx;
|
return $this->id;
|
||||||
}
|
}
|
||||||
|
|
||||||
final function getParent() {
|
final function getParent() {
|
||||||
return $this->parent;
|
return $this->parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
final function setIdx($i) {
|
|
||||||
$this->idx = $i;
|
|
||||||
}
|
|
||||||
|
|
||||||
final function setID($id) {
|
final function setID($id) {
|
||||||
$this->id = $id;
|
$this->id = $id;
|
||||||
}
|
}
|
Loading…
Reference in New Issue