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

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

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. Android OpenCSV

    OpenCSV https://sourceforge.net/projects/opencsv/ 使用参考 http://stackoverflow.com/questions/16672074/i ...

  2. Golang Printf、Sprintf 、Fprintf 格式化

    /* %v 输出结构体 {10 30} %+v 输出结构体显示字段名 {one:10 tow:30} %#v 输出结构体源代码片段 main.Point{one:10, tow:30} %T 输出值的 ...

  3. 头文件string.h中的函数及使用方法

    来源:http://blog.csdn.net/tsyj810883979/article/details/5116817 字符串拷贝1 @函数名称:   strdup函数原型:   char *st ...

  4. 多进程(了解):守护进程,互斥锁,信号量,进程Queue与线程queue(生产者与消费者模型)

    一.守护进程 主进程创建守护进程,守护进程的主要的特征为:①守护进程会在主进程代码执行结束时立即终止:②守护进程内无法继续再开子进程,否则会抛出异常. 实例: from multiprocessing ...

  5. RPi 3.5寸 电阻屏

    /***************************************************************************** * RPi 3.5寸 电阻屏 * 说明: ...

  6. springboot 不同环境不同的配置

    前言 我们在开发Spring Boot应用时,通常同一套程序会被应用和安装到几个不同的环境,比如:开发.测试.生产等.其中每个环境的数据库地址.服务器端口等等配置都会不同,如果在为不同环境打包时都要频 ...

  7. 如何调试Excel VBA代码

    Excel VBA出错时给出的错误信息极少,需要充分利用各种工具来进行调试. 1.编译错误 常见的编译错误有: 错误的源代码格式,比如if后面缺少then:在编辑器中该行会变成红色. 错误的语法结构, ...

  8. Qt5.4中遇到找不到头文件<QApplication>等。

    从新学习Qt时,重装了Qt5.4,当运行Hello World例子时,遇到了下列的情况 <span style="font-size:18px;">#include & ...

  9. liunx基础(5)

    第十三单元 硬盘分区.格式化及文件系统的管理二 1. 文件系统的挂载与卸载(详见linux系统管理P406)1) 掌握挂载的定义:挂载指将一个设备(通常是存储设备)挂接到一个已存在的目录上.2) 掌握 ...

  10. java图形用户界面添加背景颜色不成功的解决方案

    总结:背景颜色不成功,那么使用这个方法试试.getContentpane(); package clientFrame; import java.awt.Color; import java.awt. ...