<?php
//确定编码格式
header('content-Type: text/html; charset=utf-8');
/*
* 类名:LNode
* 功能:线性表的链式存储实现
* 日期:2010-09-27
* 修改:无
* 作者:刘士龙
*/
class LNode {
/* 类的成员属性的声明 */
private $mElem; //存储数据元素
private $mNext; //存储下一个数据元素的地址
/*
* 函数名:__construct
* 功 能:构造函数
* 参 数:无
* 返回值:无
*/
public function __construct() {
$this->mElem = NULL;
$this->mNext = NULL;
} //__construct()
/*
* 函数名:__desstruct
* 功 能:析构函数
* 参 数:无
* 返回值:无
*/
public function __destruct() {
$p = $this; //从头结点开始
while ($p->mNext) {
$q = $p->mNext;
free($p);
$p = $q;
} //while
$this = NULL;
} //__destruct()
/*
* 函数名:ClearList
* 功 能:清空单链表
* 参 数:无
* 返回值:无
*/
public function clearList() {
$this->mNext = NULL;
} //clearList()
/*
* 函数名:ListEmpty
* 功 能:判断单链表是否为空表
* 参 数:无
* 返回值:bool (true表示为空表)
*/
public function ListEmpty() {
return $this->mNext == NULL;
} //ListEmpty()
/*
* 函数名:ListLength
* 功 能:求单链表的元素个数
* 参 数:无
* 返回值:int
*/
public function ListLength() {
$length = 0;
while ($this->mNext) {
$this->mNext = $this->mNext->mNext;
++$length;
} //while
return $Length;
} //ListLength()
/*
* 函数名:GetElem
* 功 能:取单链表中第i个元素(位序),并赋值给元素e
* 参 数:i(待取元素的位序),&e(取得的元素)
* 返回值:bool(操作是否成功)
*/
public function GetElem($i, &$e) {
//若当前单链表为空表或不存在第i个元素,则操作失败
if (0 == $this->ListLength() || $i < 1 || $i > $this->ListLength())
return false;
//返回获得的第i个元素
$k = 1; $p = $this->mNext; //$p初始指向第一个结点(首元结点)
while ($p && $k < $i) {
$p = $p->mNext;
++$k;
} //while
$e = $p->mElem;
return true;
} //GetElem()
/*
* 函数名:LocateElem
* 功 能:返回待查找元素e在单链表中的位序
* 参 数:fp(变量函数,遍历函数的函数,本质上为一个函数指针);e(待定位的元素)
* 返回值:int(元素e在单链表中的位序,若返回-1则表示不存在该元素)
*/
public function LocateElem($e, $fp) {
$p = $this->mNext; //$p指向第一个元素
$pos = 0;
while ($p) {
if (0 == $fp($e, $p->mElem)) {
return 1 + $pos;
} //if
$p = $p->mNext;
++$pos;
} //while
return -1;
} //LocateElem()
/*
* 函数名:PriorElem
* 功 能:返回待查找元素e在单链表中的前驱元素
* 参 数:e(待定位的元素),pre_e为元素e在单链表中的前驱元素
* 返回值:bool(操作是否成功)
*/
public function PriorElem($e, &$pre_e = 0) {
//先找到当前元素的位序
$pos = $this->LocateElem($e, 'compare');
//查找当前元素的前驱
retrun $this->GetElem($pos-1, $pre_e);
} //PriorElem()
/*
* 函数名:NextElem
* 功 能:返回待查找元素e在单链表中的直接后继元素
* 参 数:e(待定位的元素),next_e为元素e在单链表中的直接后继元素
* 返回值:bool(操作是否成功)
*/
public function NextElem($e, &$next_e = 0) {
//先找到当前元素的位序
$pos = $this->LocateElem($e, 'compare');
//查找当前元素的前后继
retrun $this->GetElem($pos+1, $next_e);
} //LocateElem()
/*
* 函数名:ListInsert
* 功 能:向单链表中插入一个元素e
* 参 数:i(待插入元素的位序),e(待插入的元素)
* 返回值:无
*/
public function ListInsert($i, $e) {
$p = $this; //p指向头结点
$index = 1;
while ($p->mNext && $index < $i) {
$p = $p->mNext;
++$index;
} //while
//生成一个新结点
$newNode = new LNode();
$newNode->setElem($e);
//开始插入
$newNode->setNext($p->mNext);
$p->mNext = $newNode;
} //ListInsert()
/*
* 函数名:ListDelete
* 功 能:删除单链表中的一个元素,并用变量e返回
* 参 数:i(待删除元素的位序),e(返回删除的元素)
* 返回值:bool(操作是否成功)
*/
public function ListDelete($i, &$e) {
/* 若没有传入$e,则初始为0 */
if (!isset($e)) $e = 0;
//先找到第i-1个结点
$p = $this; //p指向头结点
$index = 1;
while ($p->mNext && $index < $i) {
$p = $p->mNext;
++$index;
} //while
//删除第i个元素
$q = $p->mNext;
$p->mNext = $q->mNext;
unset($q);
return false;
} //ListDelete()
/*
* 函数名:ListTraverse
* 功 能:遍历单链表中的每个元素
* 参 数:fp(变量函数,遍历函数的函数,本质上为一个函数指针)
* 返回值:无
*/
public function ListTraverse($fp) {
$p = $this->mNext;
while ($p) {
$fp($p->mElem);
$p = $p->mNext;
} //while
echo '<br />';
} //ListTraverse()
/*
* 函数名:setElem
* 功 能:设置单链表的mElem属性的值
* 参 数:value(待设置的值)
* 返回值:无
*/
public function setElem($value) {
$this->mElem = $value;
} //setElem()
/*
* 函数名:setNext
* 功 能:设置单链表的mNext属性的值
* 参 数:value(待设置的值)
* 返回值:无
*/
public function setNext($value) {
$this->mNext = $value;
} //setElem()
} //class SeqList
function visit($e) {
echo "$e ";
} //visit
function compare($x, $y) {
return $x - $y;
} //compare()
//main函数
$L = new LNode();
for ($i = 1; $i <= 5; ++$i) {
$L->ListInsert($i, $i);
} //for
$L->ListTraverse('visit');
?>