PHP实现线性表的链式存储

 

<?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&nbsp;&nbsp;&nbsp;";

} //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');

 

 

?>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值