/**

*

* 1. 类LNode用作创建单链表时,生成新的节点。

* 2. 类SingleLinkList用于创建单链表以及对单链表的一些操作方法(实例化此类就相当于创建了一个空链表)

* 3. CreateListHead: 具有$num个数据元素的单链表的创建——头插法

* 4. CreateListTail: 具有$num个数据元素的单链表的创建——尾插法

* 5. DestroyList: 销毁单链表

* 6. ClearList:清空单链表

* 7. ListEmpty:判断单链表是否为空

* 8. ListLength:返回单链表数据元素的个数

* 9. GetElem:返回单链表中指定位置的数据元素

* 10. LocateElem:查找指定元素在单链表中的位序

* 11. PriorElem:获取指定元素的前面一个元素

* 12. NextElem:获取指定元素的后面一个元素

* 13. ListInsert:在指定位置之前插入一个数据元素

* 14. ListDelete: 删除指定位置的数据元素

* 15. ListTraverse: 遍历单链表的所有数据元素

*

*/

class LNode{

public $data;

public $next;

public function __construct($data=null){

$this->data=$data;

$this->next=null;

}

}

class SingleLinkList{

public $data;

public $next;

public function __construct(){

$this->data=null;

$this->next=null;

}

//具有$num个数据元素的单链表的创建——头插法

public function CreateListHead($num){

for($i=0;$i

$node=new LNode();

$node->data=mt_rand(100,200);

$node->next=$this->next;

$this->next=$node;

}

}

//具有$num个数据元素的单链表的创建——尾插法

public function CreateListTail($num){

$tail=$this;

for($i=0;$i

$node=new LNode();

$node->data=mt_rand(100,200);

$tail->next=$node;

$tail=$node;

}

$node->next=null;

}

//销毁单链表

public function DestroyList(){

//$this相当于头指针,它指向的是头结点,$this->next相当于第一个结点

//之所以需要将$this赋值给$that,是因为$this无法用作变量进行赋值

$that=$this;

while($that){

$node=$that->next;

unset($that);

$that=$node;

}

}

//将单链表清空

public function ClearList(){

$p=$this->next;

while($p){

$node=$p->next;

unset($node);

$p=$node;

}

$this->next=null;

}

//判断单链表是否为空

public function ListEmpty(){

if($this->next){

return false;

}else{

return true;

}

}

//返回单链表中数据元素的个数

public function ListLength(){

$count=0;//初始化变量

$p=$this->next;

while($p){

$count++;

$p=$p->next;

}

return $count;

}

//返回指定位置的数据元素

public function GetElem($pos){

$count=1;

$p=$this->next;

while($p && $count

$count++;

$p=$p->next;

}

if(!$p || $pos

return 'ERROR';

}

return $p->data;

}

//    或者

public function GetElem2($pos){

$count=0;

$p=$this->next;

while($p){

$count++;

if($count==$pos){

return $p->data;

}

$p=$p->next;

}

return 'ERROR';

}

//查找指定元素在单链表中的位序

public function LocateElem($elem){

$count=0;

$p=$this->next;

while($p){

$count++;

if($p->data==$elem){

return $count;

}

}

return 'ERROR';

}

//获取指定元素的前面一个元素

public function PriorElem($elem){

$p=$this->next;

if($p && $p->data=$elem){

return $p->data.'已经是第一个元素,已无前驱元素';

}

while($p && $p->next){

$q=$p->next;

if($q->data==$elem){

return $p->data;

}

$p=$q;

}

return 'ERROR';

}

//获取指定元素的后面一个元素

public function NextElem($elem){

$p=$this->next;

while($p && $p->next){

if($p->data==$elem){

return $p->next->data;

}

$p=$p->next;

}

if($p && $p->next==null){

return $p->data.'已经是最后一个元素,已无后继元素';

}

return 'ERROR';

}

//在指定位置之前插入一个节点元素

public function ListInsert($pos,$node){

$p=$this;

$count=0;

while($p) {

$count++;

if ($count == $pos) {

$node->next = $p->next;

$p->next = $node;

return 'OK';

}

$p=$p->next;

}

return 'ERROR';

}

//或者 这种效率会高一些

public function ListInsert2($pos,$node){

$p=$this;

$count=1;

while($p && $count

$count++;

$p=$p->next;

}

if(!$p || $count>$pos){

return 'ERROR';

}

$node->next=$p->next;

$p->next=$node;

return 'OK';

}

//删除单链表指定位置的数据元素

public function ListDelete($pos){

$count=1;

$p=$this;

while($p && $count

$count++;

$p=$p->next;

}

if(!$p || $count>$pos){

return 'ERROR';

}

$q=$p->next;

$p->next=$q->next;

unset($q);

return 'OK';

}

//    或者

public function ListDelete2($pos){

$count=0;

$p=$this;

//此处之所以使用$p->next,而不是$p作为判断条件是因为这样可以在链表为空的时候,少一次无谓的循环。

while($p->next){

$count++;

if($count==$pos){

$q=$p->next;

$p->next=$q->next;

unset($q);

return 'OK';

}

$p=$p->next;

}

return 'ERROR';

}

//单链表的遍历

public function ListTraverse(){

$arr=array();

$p=$this->next;

while($p){

$arr[]=$p->data;

$p=$p->next;

}

return $arr;

}

}

php数据结构链表代码,数据结构之线性表——链式存储结构之单链表(php代码实现)...相关推荐

  1. 数据结构之线性表——链式存储结构之单链表(php代码实现)

    <?php /**** 1. 类LNode用作创建单链表时,生成新的节点.* 2. 类SingleLinkList用于创建单链表以及对单链表的一些操作方法(实例化此类就相当于创建了一个空链表)* ...

  2. 线性表之链式存储结构_单链表相关算法

    在存储结构上,不需要连续的存储空间,需要上一个结点的指针域 指向下一个结点即可,找到一个结点就可以找到下一个结点. 学习教材是大话数据结构,加上自己的一些个人理解.这个算法 有点绕,需要对指针 相关内 ...

  3. 线性表的链式存储结构以及单链表的插入和删除原理实现

    线性表的链式存储结构 线性表中的每个元素最多只有一个前驱元素和一个后继元素(其逻辑结构),因此可以采用链式存储结构存储. 链表 线性表的链式存储结构称为链表.在链表中每个结点不仅包含有元素本身的信息( ...

  4. 线性表-链式存储结构

    3.6 线性表的链式存储结构 3.6.1 顺序存储结构不足的解决办法 前面我们讲的线性表的顺序存储结构.它是有缺点的,最大的缺点就是插入和删除时需要移动大量元素,这显然就需要耗费时间.能不能想办法解决 ...

  5. 数据结构——线性表之链式存储结构

    单链表: 概念: 1.由于线性表的顺序存储在插入与删除时需要移动大量元素,适用于不经常改变元素的情况,那么当我们需要经常操作元素时该怎么办,这就有了接下来的线性表的链式存储结构 2.单链表在内存的存储 ...

  6. python 单链表节点怎么快速定义_线性表链式存储结构之单链表

    线性表的链式存储结构的特点就是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以在内存中未被占用的任意位置.比起顺序存储结构每个元素只需要存储一个位置就可以了.现在链式存储结构中,除了要存储数 ...

  7. 【数据结构】 实验报告10 顺序、链式存储结构的二叉树递归遍历、层次遍历求高度

    一.实验目的和要求 (源码在最后) 要求: 两种及以上存储结构(建议 顺序存储结构和链式存储结构各一).两种及以上方法(建议 递归遍历和层次遍历方法各一).分析各代码性能. 抽象数据类型(二叉树)独立 ...

  8. 数据结构之线性表-链式存储之单链表(一)

    本人文笔较差,语文从来不及格,基础不好,写此类文章仅供自己学习,理解队列及其他知识,高手大神请略过.参考书籍 <数据结构与算法分析-Java语言描述> 1.1 单链表简介 线性表的最大的缺 ...

  9. 2.3线性表的链式存储和运算—单链表应用举例

    例2.5 已知单链表H,写一算法将其倒置.即实现如图2.22的操作.(a)为倒置前,(b)为倒置后. 算法思路:依次取原链表中的每个结点,将其作为第一个结点插入到新链表中去,指针p用来指向当前结点,p ...

最新文章

  1. 简明机器学习教程——实践篇(一):从感知机入手
  2. vs与git中间的阻拦--Git failed with a fatal error. error: open(“.vs/GBA/v16/Server/sqlite3/db.lock
  3. 如何在博客园的博客中添加可运行的JS(转载)
  4. 使用 Dockerfile 定制镜像
  5. C++ 拷贝构造函数与赋值构造函数调用时机初步01
  6. 谁拿了最多奖学金(洛谷-P1051)
  7. oracle安装pdb报错,oracle12安装后pdb创建的用户无法连接
  8. api 文件夹index.js 集合写法
  9. 大蚂蚁在64位系统下,右键没有快发的解决方案
  10. 重启中的武汉:烟火气息回来了,消费疯狂增长
  11. Java Web学习总结(36)——JavaEE知识体系及项目开发过程的总结
  12. 企业生产环境数据库备份锁表问题
  13. UVA 12299 RMQ with Shifts 线段树
  14. cs61a 2018spr hw05 的一个题目
  15. 自己建网站的步骤及方法
  16. JAVA 之父高斯林:廉颇老矣,尚能饭否?
  17. matlab中矩阵运算
  18. AI工具究竟是帮手还是对手?你怎么看,一起来聊聊吧!
  19. 苹果电脑和Windows怎么切换 苹果电脑安装双系统的利弊
  20. 介绍一款分享真实互联网薪资的小程序

热门文章

  1. 【C++】error C2512: 'Adder' : no appropriate default constructor available
  2. VLC-OFDM系统中一种改进的可变噪声比特功率分配算法
  3. Linux网络编程——浅谈 TCP 三次握手和四次挥手
  4. boost asio 简单示例
  5. Linux编译动态链接库
  6. 【正则表达式】之Possessive Quantifiers
  7. 如果通过当前元素知道父元素、同级元素
  8. 安装GitLab,Jenkins,及自动化上线
  9. crackme算法分析---CRC32算法的妙用
  10. dos拼接字符串以及截取字符串