Source for file Single.php
Documentation is available at Single.php
/* vim: set expandtab shiftwidth=4 tabstop=4 softtabstop=4 foldmethod=marker textwidth=80: */
* This package implements a singly linked list structure. Each node
* (Structures_LinkedList_SingleNode object) in the list
* (Structures_LinkedList_Single) knows the the next node in the list.
* Unlike an array, you can insert or delete nodes at arbitrary points
* If your application normally traverses the linked list in a forward-only
* direction, use the singly-linked list implemented by
* {@link Structures_LinkedList_Single}. If, however, your application
* needs to traverse the list backwards, or insert nodes into the list before
* other nodes in the list, use the double-linked list implemented by
* {@link Structures_LinkedList_Double} to give your application better
* performance at the cost of a slightly larger memory footprint.
* Structures_LinkedList_Single implements the Iterator interface so control
* structures like foreach($list as $node) and while($list->next()) work
* To use this package, derive a child class from
* Structures_LinkedList_SingleNode and add data to the object. Then use the
* Structures_LinkedList_Single class to access the nodes.
* LICENSE: Copyright 2006 Dan Scott
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may obtain
* a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* @package Structures_LinkedList_Single
* @author Dan Scott <dscott@laurentian.ca>
* @copyright 2006 Dan Scott
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @version CVS: $Id: Single.php,v 1.7 2007/02/25 04:53:33 dbs Exp $
* @link http://pear.php.net/package/Structures_LinkedList_Single
* @example single_link_example.php
* @todo Add some actual error conditions
require_once 'PEAR/Exception.php';
// {{{ class Structures_LinkedList_Single
* The Structures_LinkedList_Single class represents a linked list structure
* composed of {@link Structures_LinkedList_SingleNode} objects.
* @package Structures_LinkedList_Single
* @author Dan Scott <dscott@laurentian.ca>
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @link http://pear.php.net/package/Structures_LinkedList_Single
* Current node in the linked list
* @var Structures_LinkedList_SingleNode
* Root node of the linked list
* @var Structures_LinkedList_SingleNode
* The linked list contains no nodes
public static $messages = array (
self ::ERROR_EMPTY => 'No nodes in this linked list'
// {{{ Constructor: function __construct()
* Structures_LinkedList_Single constructor
* @param Structures_LinkedList_SingleNode $root root node for the
function __construct(Structures_LinkedList_SingleNode $root = null )
// {{{ Destructor: function __destruct()
* Structures_LinkedList_Single destructor
* If we do not destroy all of the references in the linked list,
* we will quickly run out of memory for large / complex structures.
* @param Structures_LinkedList_SingleNode $root root node for the
* Starting with root node, set last node = root_node
* if next node exists, delete last node reference to next node
while (($next_node = $last_node->next ()) !== false ) {
$last_node->setNext (null );
// {{{ function current()
* Returns the current node in the linked list
* @return Structures_LinkedList_SingleNode current node in the linked list
* Sets the pointer for the linked list to the root node
* @return Structures_LinkedList_SingleNode root node in the linked list
* Sets the pointer for the linked list to the root node
* @return Structures_LinkedList_SingleNode root node in the linked list
* Stub for Iterator interface that simply returns the current node
* @return Structures_LinkedList_SingleNode current node in the linked list
* Stub for Iterator interface that simply returns the current node
* @return Structures_LinkedList_SingleNode current node in the linked list
* Sets the pointer for the linked list to the next node and
* @return Structures_LinkedList_SingleNode next node in the linked list
// {{{ function previous()
* Sets the pointer for the linked list to the previous node and
* @return Structures_LinkedList_SingleNode previous node in the linked list
$this->current = $this->_getPreviousNode ();
// {{{ protected function _getTailNode()
* Returns the tail node of the linked list.
* This is an expensive operation!
* @param Structures_LinkedList_SingleNode $new_node New node to append
* @return bool Success or failure
while (($y = $tail_node->next ()) !== false ) {
// {{{ private function _getPreviousNode()
* Returns the node prior to the current node in the linked list.
* This is an expensive operation for a singly linked list!
* @return Structures_LinkedList_SingleNode Previous node
private function _getPreviousNode ($node = null )
while (($y = $prior_node->next ()) !== false ) {
// {{{ function appendNode()
* Adds a {@link Structures_LinkedList_SingleNode} object to the end of
* @param Structures_LinkedList_SingleNode $new_node New node to append
* @return bool Success or failure
public function appendNode(Structures_LinkedList_SingleNode $new_node)
// This is just a special case of insertNode()
// {{{ function insertNode()
* Inserts a {@link Structures_LinkedList_SingleNode} object into the linked
* list, based on a reference node that already exists in the list.
* @param Structures_LinkedList_SingleNode $new_node New node to add to
* @param Structures_LinkedList_SingleNode $existing_node Reference
* @param bool $before Insert new node before or after the existing node
* @return bool Success or failure
public function insertNode(Structures_LinkedList_SingleNode $new_node, Structures_LinkedList_SingleNode $existing_node, $before = false )
// Now add the node according to the requested mode
$previous_node = $this->_getPreviousNode ($existing_node);
$previous_node->setNext ($new_node);
$new_node->setNext ($existing_node);
$next_node = $existing_node->next ();
$new_node->setNext ($next_node);
$existing_node->setNext ($new_node);
// {{{ function prependNode()
* Adds a {@link Structures_LinkedList_SingleNode} object to the start
* @param Structures_LinkedList_SingleNode $new_node Node to prepend
* @return bool Success or failure
public function prependNode(Structures_LinkedList_SingleNode $new_node)
// This is just a special case of insertNode()
// {{{ function deleteNode()
* Deletes a {@link Structures_LinkedList_SingleNode} from the list.
* @param Structures_LinkedList_SingleNode $node Node to delete.
public function deleteNode(Structures_LinkedList_SingleNode $node)
/* If this is the root node, and there are more nodes in the list,
* make the next node the new root node before deleting this node.
/* If this is the current node, make the next node the current node.
* If that fails, null isn't such a bad place to be.
// {{{ class Structures_LinkedList_SingleNode
* The Structures_LinkedList_SingleNode class represents a node in a
* {@link Structures_LinkedList_Single} linked list structure.
* @package Structures_LinkedList_Single
* @author Dan Scott <dscott@laurentian.ca>
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @link http://pear.php.net/package/Structures_LinkedList_Single
* Next node in the linked list
* @var Structures_LinkedList_SingleNode
// {{{ Constructor: function __construct()
* Structures_LinkedList_SingleNode constructor
// {{{ Destructor: function __destruct()
* Removes node from the list, adjusting the related nodes accordingly.
* This is a problem if the node is the root node for the list.
* At this point, however, we do not have access to the list itself. Hmm.
* Return the next node in the linked list
* @return Structures_LinkedList_SingleNode next node in the linked list
// {{{ function previous()
* Return the previous node in the linked list
* Stub method for Structures_LinkedList_DoubleNode to override.
* @return Structures_LinkedList_SingleNode previous node in the linked list
// {{{ function setNext()
* Sets the pointer for the next node in the linked list to the
* @param Structures_LinkedList_SingleNode $node new next node in
* @return Structures_LinkedList_SingleNode new next node in the linked list
public function setNext(Structures_LinkedList_SingleNode $node = null )
// {{{ function setPrevious()
* Sets the pointer for the next node in the linked list to the
* Stub method for Structures_LinkedList_DoubleNode to override.
* @param Structures_LinkedList_SingleNode $node new next node in
* @return Structures_LinkedList_SingleNode new next node in the linked list
public function setPrevious(Structures_LinkedList_SingleNode $node = null )
Documentation generated on Wed, 27 Aug 2008 23:30:35 -0400 by phpDocumentor 1.4.0. PEAR Logo Copyright © PHP Group 2004.
|