您的位置:首页 > 理论基础 > 数据结构算法

php学习第一章:PHP基础语法(三)数据结构与算法:2、单向链表

2012-11-21 16:39 1126 查看
参考资料:传智播客韩顺平老师一周玩转算法公开课视频

实例:用php单向链表实现水浒英雄排行

<?php
header('content-type:text/html;charset=utf-8');
/**
* 定义水浒英雄排行类
* 可以想像成有一个线性表:Heros = (h1,h2,h3……) $head的位置就是h1前面的那个位置
*/
class Heros{
/**
* @var int $id 编号
*/
public $id;

/**
* @var string $name 真实姓名
*/
public $name;

/**
* @var string $nickname 外号
*/
public $nickname;

/**
* @var object $head hero类的一个实例的下一个对象
*/
public $next;

function __construct($id = '', $name = '', $nickname = '')
{
$this->id = $id;
$this->name = $name;
$this->nickname = $nickname;
}

}

/**
* 添加水浒英雄
* @param object $head Heros类的空对象(栈顶)
* @param object $hero Heros类的一个实例
*/
function addHero($head, $hero)
{
//定义一个当前实例,先初始化
$current = $head;
//定义一个变量代表是否是重复值
$flag = false;
while($current->next != null)
{
if($current->next != null){
break;
}
else if($current->next->id = $hero->next->id)
{
$flag = true;
}
$current = $current->next;
}
if(!$flag)
{
$hero->next = $current->next;
$current->next = $hero;
}

}

/**
* 修改英雄信息
* @param object $head Heros类的空对象(栈顶)
* @param object $hero Heros类的一个实例
*/
function updateHero($head, $hero)
{
$current = $head;
while($current->next != null)
{
if($current->next->id = $hero->id)
{
break;
}
$current = $current->next;
}
if($current->next == null)
{
echo '您要修改的编号为'.$hero->id.'的英雄不存在!';
}
else{
$current->next->name = $hero->name;
$current->next->nickname = $hero->nickname;
}
}

/**
* 删除某个英雄
* @param object $head Heros类的空对象(栈顶)
* @param int $id 英雄编号
*/
function delHero($head, $id)
{
$current = $head;
while($current->next != null)
{
if($current->next->id = $id)
{
$flag = true;
break;
}
$current = $current->next;
}
if(!$flag)
{
$current->next = $current->next->next;
}
else{
echo '您要删除的编号为'.$hero->id.'的英雄不存在!';
}
}

/**
* 显示英雄排行榜
* @param object $head Heros类的空对象(栈顶)
*/
function showHeros($head)
{
$current = $head;
while($current->next != null)
{
echo '第'.$current->next->id.'位,姓名:'.$current->next->name.'外号:'.$current->next->nickname.'<br/>';
$current = $current->next;
}
}

$head = new Heros();
$h1 = new Heros(1,'宋江','及时雨');
addHero($head,$h1);
$h2 = new Heros(2,'卢俊义','玉麒麟');
addHero($head,$h2);
$h3 = new Heros(3,'吴用','智多星');
addHero($head,$h3);
showHeros($head);

?>


一、内存分配(c)

  因为php底层是c

  用上面的例子来说:



关于内存分配的一点说明:

1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。

一般来说:内存分配根据以下规则:

(1)基本数据类型一般放在栈区

(2)复合数据类型一般放在堆区

二、案例说明:

  对象实例化的数据在堆区,但其名称在栈区,其结构如下:

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