线性表的链式存储:用一组任意的存储单元存储线性表中的数据元素。用这种方法存储的线性表简称线性链表。

链式存储线性表的特点:存储链表中结点的一组任意的存储单元可以是连续的,也可以是不连续的,甚至是零散分布在内存中的任意位置上的。链表中结点的逻辑顺序和物理顺序不一定相同。

PHP实现单链表

<?php

/**

*单链表的基本操作

*1.初始化单链表 __construct()

*2.清空单链表 clearSLL()

*3.返回单链表长度 getLength()

*4. 判断单链表是否为空 getIsEmpty()

*5.头插入法建表 getHeadCreateSLL()

*6.尾插入法建表 getTailCreateSLL()

*7.返回第$i个元素 getElemForPos()

*8.查找单链表中是否存在某个值的元素 getElemIsExist()

*9.单链表的插入操作 getInsertElem()

*10.遍历单链表中的所有元素 getAllElem()

*11.删除单链中第$i个元素 getDeleteElem()

*12.删除单链表中值为$value的前$i($i>=1)个结 点 getDeleteElemForValue()

*13.删除单链表所有重复的值 getElemUnique()

**/

header("content-type:text/html;charset=gb2312");

class LNode{

public $mElem;

public $mNext;

public function __construct(){

$this->mElem=null;

$this->mNext=null;

}

}

class SingleLinkedList{

//头结点数据

public $mElem;

//下一结点指针

public $mNext;

//单链表长度

public static $mLength=0;

/**

*初始化单链表

*

*@return void

*/

public function __construct(){

$this->mElem=null;

$this->mNext=null;

}

/**

*清空单链表

*

*@return void

*/

public function clearSLL(){

if(self::$mLength>0){

while($this->mNext!=null){

$q=$this->mNext->mNext;

$this->mNext=null;

unset($this->mNext);

$this->mNext=$q;

}

self::$mLength=0;

}

}

/**

*返回单链表长度

*

*@return int

*/

public static function getLength(){

return self::$mLength;

}

/**

*判断单链表是否为空

*

*@return bool 为空返回true,不为空返回false

*/

public function getIsEmpty(){

if(self::$mLength==0 && $this->mNext==null){

return true;

}else{

return false;

}

}

/**

*头插入法建表

*

*@param array $sarr 建立单链表的数据

*@return void

*/

public function getHeadCreateSLL($sarr){

$this->clearSLL();

if(is_array($sarr)){

foreach($sarr as $value){

$p=new LNode();

$p->mElem=$value;

$p->mNext=$this->mNext;

$this->mNext=$p;

self::$mLength++;

}

}else{

return false;

}

}

/**

*尾插入法建表

*

*@param array $sarr 建立单链表的数据

*@return void

*/

public function getTailCreateSLL($sarr){

$this->clearSLL();

if(is_array($sarr)){

$q=$this;

foreach($sarr as $value){

$p=new LNode();

$p->mElem=$value;

$p->mNext=$

q->mNext;

$q->mNext=$p;

$q=$p;

self::$mLength++;

}

}else{

return false;

}

}

/**

*返回第$i个元素

*

*@param int $i 元素位序,从1开始

*@return mixed

*/

public function getElemForPos($i){

$i=(int)$i;

if($i>self::$mLength || $i < 1){

return null;

}

$j=1;

$p=$this->mNext;

while($j<$i){

$q=$p->mNext;

$p=$q;

$j++;

}

return $p;

}

/**

*查找单链表中是否存在某个值的元素

*如果有返回该元素结点,否则返回null

*

*@param mixed $value 查找的值

*@return mixed

*/

public function getElemIsExist($value){

$p=$this;

while($p->mNext != null && strcmp($p->mElem,$value)!==0){

$p=$p->mNext;

}

if(strcmp($p->mElem,$value)===0){

return $p;

}else{

return null;

}

}

/**

*查找单链表中是否存在某个值的元素

*如果有返回该元素位序,否则返回-1

*

*@param mixed $value 查找的值

*@return mixed

*/

public function getElemPosition($value){

$p=$this;

$j=0;

while($p->mNext != null && strcmp($p->mElem,$value)!==0){

$j++;

$p=$p->mNext;

}

if(strcmp($p->mElem,$value)===0){

return $j;

}else{

return -1;

}

}

/**

*单链表的插入操作

*

*@param int $i 插入元素的位序,即在什么位置插入新的元素,从1开始

*@param mixed $e 插入的新的元素值

*@return boolean 插入成功返回true,失败返回false

*/

public function getInsertElem($i,$e){

if($i>self::$mLength || $i<1){

return false;

}

$j=1;

$p=$this;

while($p->mNext!=null && $j<$i){

$p=$p->mNext;

$j++;

}

$q=new LNode();

$q->mElem=$e;

$q->mNext=$p->mNext;

$p->mNext=$q;

self::$mLength++;

return true;

}

/**

*遍历单链表中的所有元素

*

*@return array 包括单链中的所有元素

*/

public function getAllElem(){

$slldata=array();

if($this->getIsEmpty()){

}else{

$p=$this->mNext;

while($p->mNext!=null){

$slldata[]=$p->mElem;

$p=$p->mNext;

}

$slldata[]=$p->mElem;

}

return $slldata;

}

/**

*删除单链中第$i个元素

*@param int $i 元素位序

*@return boolean 删除成功返回true,失败返回false

*/

public function getDeleteElem($i){

$i=(int)$i;

if($i>self::$mLength || $i<1){

return false;

}

$p=$this;

$j=1;

while($j<$i){

$p=$p->mNext;

$j++;

}

$q=$p->mNext;

$p->mNext=$q->mNext;

$q=null;

unset($q);

self::$mLength--;

}

/**

*删除单链表中值为$value的前$i($i>=1)个结 点

*

*@param mixed 待查找的值

*@param $i 删除的次数,即删除查找到的前$i个

@return void

*/

public function getDeleteElemForValue($value,$i=1){

if($i>1){

$this->getDeleteElemForValue($value,$i-1);

}

$vp=$this->getElemPosition($value);

$this->getDeleteElem($vp);

}

/**

*删除单链表所有重复的值

*

*@return void

*/

public function getElemUnique(){

if(!$this->getIsEmpty()){

$p=$this;

while($p->mNext!=null){

$q=$p->mNext;

$ptr=$p;

while($q->mNext!=null){

if(strcmp($p->mElem,$q->mElem)===0){

$ptr->mNext=$q->mNext;

$q->mNext=null;

unset($q->mNext);

$q=$ptr->mNext;

self::$mLength--;

}else{

$ptr=$q;

$q=$q->mNext;

}

}

if(strcmp($p->mElem,$q->mElem)===0){

$ptr->mNext=null;

self::$mLength--;

}

$p=$p->mNext;

}

}

}

}

?>

PHP数据结构之三 线性表中的单链表的PHP实现的更多相关文章

  1. javascript实现数据结构与算法系列:线性表的静态单链表存储结构

    有时可借用一维数组来描述线性链表,这就是线性表的静态单链表存储结构. 在静态链表中,数组的一个分量表示一个结点,同时用游标(cur)代替指针指示结点在数组中的相对位置.数组的第0分量可看成头结点,其指 ...

  2. 正整数构成的线性表存放在单链表中,编写算法将表中的所有的奇数删除。(C语言)

    /* 正整数构成的线性表存放在单链表中,编写算法将表中的所有的奇数删除 */ #include <stdio.h> #include <stdlib.h> typedef st ...

  3. 线性表概述及单链表的Java实现

    一.线性表概述 线性表是指一组数据元素之间具有线性关系的元素序列,它表现为:除第一个元素没有直接前驱元素.最后一个元素没有直接后继元素外,其余所有元素都有且仅有一个直接前驱元素和直接后继元素. 根据存 ...

  4. 线性表:实现单链表和子类栈(Stack)及单向队列(Queue) [C++]

    刚刚开始学习c++.之前c的内容掌握的也不多,基本只是一本概论课的程度,以前使用c的struct写过的链表.用python写过简单的数据结构,就试着把两者用c++写出来,也是对c++的class,以及 ...

  5. PHP数据结构之二 线性表中的顺序表的PHP实现

    线性表 (一)基本特点:最基本.最简单.最常用的一种数据结构 在这种结构中: 1.存在一个唯一的被称为“第一个”的数据元素: 2.存在一个唯一的被称为“最后一个”的数据元素: 3.除第一个元素外,每个 ...

  6. javascript实现数据结构:线性表--简单示例及线性表的顺序表示和实现

    线性表(linear list)是最常用且最简单的一种数据结构.一个线性表是n个数据元素的有限序列.在稍复杂的线性表中,一个数据元素可以由若干个数据项(item)组成. 其中: 数据元素的个数n定义为 ...

  7. javascript实现数据结构:线性表--线性链表(链式存储结构)

    上一节中, 线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素,它的存储位置可用一个简单,直观的公式来表示.然后,另一方面来看,这个特点也造成这种存储 ...

  8. Java数据结构之线性表

    从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...

  9. 数据结构之线性表(python版)

    数据结构之线性表(python版) 单链表 1.1  定义表节点 # 定义表节点 class LNode(): def __init__(self,elem,next = None): self.el ...

随机推荐

  1. 【python】命令行解析工具argparse用法

    python的命令行参数 之前有用到optget, optparse, 现在这些都被弃用了. import argparse parser = argparse.ArgumentParser() ar ...

  2. jQuery 绑定事件总结

    目前已知有: $("..").bind("事件名",fn); $("parent").on("事件名","se ...

  3. 演示使用Metasploit入侵Windows

    我使用Kali Linux的IP地址是192.168.0.112:在同一局域网内有一台运行Windows XP(192.168.0.108)的测试电脑. 本文演示怎么使用Metasploit入侵win ...

  4. 通用线程:POSIX 线程详解,第 3 部分

    通用线程:POSIX 线程详解,第 3 部分 使用条件变量提高效率 Daniel Robbins, 总裁兼 CEO, Gentoo Technologies, Inc. 简介: 本文是 POSIX 线 ...

  5. 【前端】XHTML入门笔记

    教程/XHTML 模块/XHTML 标准属性/XHTML 事件属性 XHTML 指可扩展超文本标签语言(EXtensible HyperText Markup Language). XHTML 元素必 ...

  6. SVN客户端与服务器端搭建操作

    一.客户端的安装 1.点击安装程序 2.修改svn安装位置 3.开始安装 4.客户端安装成功 5.回到左面  右键出现svn检出 tortoiSVN  表示安装成功 Myeclipse svn插件安装 ...

  7. net core集成CAP

    net core集成CAP https://www.cnblogs.com/guolianyu/p/9756941.html 一.前言 感谢杨晓东大佬为社区贡献的CAP开源项目,传送门在此:.NET ...

  8. Windows下安装pillow、opencv库问题,亲测可行

    安装pillow 库 python -m pip install pillow 出自:http://blog.csdn.net/Riverhope/article/details/78766969 安 ...

  9. 如何理解Robot Framework

    不知不觉公众号已经有很多人关注了,小编先谢谢大家的支持-今天我们就来谈一谈我对RF的理解,因为前段时间换了工作,目前RF知识基本用不上了.其实我在上一份工作中大部分都是在反复的使用前面讲过的知识——其 ...

  10. 为什么新生代内存需要有两个Survivor区?

    对于常见的GC算法,我们都应该知道,例如:标记清除算法.复制算法.标记整理算法等.标记清除算法由于回收之后存在大量的内存碎片,存在效率和空间问题!为了解决效率问题,引出了复制算法!熟悉GC算法的小伙伴 ...