您的位置:首页 > 编程语言 > PHP开发

PHP实现线性表的链式存储

2010-09-27 20:41 507 查看
<?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');

?>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: