使用PHP 5.3.10,我创建了一个链接列表类,并试图保存一个足球运动员列表。
调用add
函数后,对象似乎从未保留任何信息。var_dump($playerList)
对我的头和尾指针都返回NULL。或者,如果我将其替换为var_dump($playerList->count)
,无论我将var_dump
计数语句放在哪里,它都不会打印任何内容。
我已经看了手册,但没有找到语法错误。我的直觉告诉我mysql_fetch_array
正在做一些奇怪的事情。如下所述,我的测试表明,当我调用playerList->add()
时,值实际上正在传递。总之,下面是我的简单代码:
/* Populates lists with available players. */
function populateList($sql)
{
$playerList = new PlayerList();
while ($row = mysql_fetch_array($sql, MYSQL_NUM))
{
$playerList->add(new Player($row[0], $row[1], $row[2], $row[3], $row[4]));
}
var_dump($playerList);
}
和我的链表类:
include 'PlayerNode.php';
class PlayerList
{
public $head;
public $tail;
public $count;
function PlayerList()
{
$head = null;
$tail = null;
$count = 0;
}
function add($player)
{
$count ++;
$node = new PlayerNode($player);
//First time in
if ($head == null)
{
$head = $node;
$tail = $node;
$head->nextPtr = null;
}
// All other times
else
{
$tail->nextPtr = $node;
$tail = $node;
$node->nextPtr = null;
}
$count++;
}
}
我可以将var_dump($node)
和echo语句放在链表类中,并观察到PlayerNode
工作正常。
但是,另一个奇怪的观察…if($head==null)
ALWAYS的计算结果也为true。这两者有关联吗?
单链表首插入:我们可以很容易地将元素插入到列表的头部。那么我们该怎么做呢?创建一个新节点,将新节点的下一个点设置为当前头节点,并将头变量(在类中)设置为新节点。即使链表为空,此方法也有效。注意,在发送head变量指向新节点之前,我们将next的新节点点设置为head节点。
单链表尾部插入:我们也可以很容易地在链表的尾部插入元素,只要我们为链表的尾部节点保留一个引用。创建一个新节点,将新节点的next设置为null,将尾节点的next设置为指向新节点,将尾变量设置为指向新元素。注意,在将tail变量更改为指向新节点之前,我们设置了前一个尾部节点的next。
在所有其他时间将新节点添加到头部或尾部。
// All other times if head
else{
$temp = $head;
$head = $node;
$node->nextPtr = $temp;
count ++;
}