PHP数据结构之三 线性表中的单链表的PHP实现
线性表的链式存储:用一组任意的存储单元存储线性表中的数据元素。用这种方法存储的线性表简称线性链表。
链式存储线性表的特点:存储链表中结点的一组任意的存储单元可以是连续的,也可以是不连续的,甚至是零散分布在内存中的任意位置上的。链表中结点的逻辑顺序和物理顺序不一定相同。
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实现的更多相关文章
- javascript实现数据结构与算法系列:线性表的静态单链表存储结构
有时可借用一维数组来描述线性链表,这就是线性表的静态单链表存储结构. 在静态链表中,数组的一个分量表示一个结点,同时用游标(cur)代替指针指示结点在数组中的相对位置.数组的第0分量可看成头结点,其指 ...
- 正整数构成的线性表存放在单链表中,编写算法将表中的所有的奇数删除。(C语言)
/* 正整数构成的线性表存放在单链表中,编写算法将表中的所有的奇数删除 */ #include <stdio.h> #include <stdlib.h> typedef st ...
- 线性表概述及单链表的Java实现
一.线性表概述 线性表是指一组数据元素之间具有线性关系的元素序列,它表现为:除第一个元素没有直接前驱元素.最后一个元素没有直接后继元素外,其余所有元素都有且仅有一个直接前驱元素和直接后继元素. 根据存 ...
- 线性表:实现单链表和子类栈(Stack)及单向队列(Queue) [C++]
刚刚开始学习c++.之前c的内容掌握的也不多,基本只是一本概论课的程度,以前使用c的struct写过的链表.用python写过简单的数据结构,就试着把两者用c++写出来,也是对c++的class,以及 ...
- PHP数据结构之二 线性表中的顺序表的PHP实现
线性表 (一)基本特点:最基本.最简单.最常用的一种数据结构 在这种结构中: 1.存在一个唯一的被称为“第一个”的数据元素: 2.存在一个唯一的被称为“最后一个”的数据元素: 3.除第一个元素外,每个 ...
- javascript实现数据结构:线性表--简单示例及线性表的顺序表示和实现
线性表(linear list)是最常用且最简单的一种数据结构.一个线性表是n个数据元素的有限序列.在稍复杂的线性表中,一个数据元素可以由若干个数据项(item)组成. 其中: 数据元素的个数n定义为 ...
- javascript实现数据结构:线性表--线性链表(链式存储结构)
上一节中, 线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素,它的存储位置可用一个简单,直观的公式来表示.然后,另一方面来看,这个特点也造成这种存储 ...
- Java数据结构之线性表
从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...
- 数据结构之线性表(python版)
数据结构之线性表(python版) 单链表 1.1 定义表节点 # 定义表节点 class LNode(): def __init__(self,elem,next = None): self.el ...
随机推荐
- CSS样式:覆盖规则
规则一:由于继承而发生样式冲突时,最近祖先获胜. CSS的继承机制使得元素可以从包含它的祖先元素中继承样式,考虑下面这种情况: <html> <head> <title& ...
- 剑指offer--23.合并两个排序的链表
时间限制:1秒 空间限制:32768K 热度指数:421239 本题知识点: 链表 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. class ...
- 深度学习(六十五)移动端网络MobileNets
- ADO.Net入门(2)
(转载) 作者:可米小子 出处:http://liuhaorain.cnblogs.com 1. 什么是连接池? 在上篇文章<你必须知道的ADO.NET(四) 品味Connection对象> ...
- 前端之jQuery02
文档操作 重点:创建标签,jQuery里面没有这个方法 内部(子标签) 添加到指定元素内部后面 $(A).append(B): // B作为A的最后一个儿子元素:(把B追加到A) $(A).appen ...
- (效果二)js实现两个变量值的交换
ES5: var a = 12,b=13,c; c = a; a = b; b = c; console.log(a,b);//13,12 通过设置第三方变量交换赋值来实现 ES6 var a = ...
- HelloWorld 模块
helloworld.c 代码 #include <linux/init.h> #include <linux/module.h> MODULE_LICENSE("D ...
- STL源码解析之vector自实现
最近仔细阅读了下侯捷老师的<STL源码剖析>的前三章内容:空间配置器.迭代器.traits技术,为了加强理解和掌握,特参照源码自实现Vector,以下对相关重点知识进行说明. 1. vec ...
- rtrim,dirname,魔术常量用法
$str = "Hello World!!!"; echo $str . "<br>"; echo rtrim($str,"!d" ...
- #51单片机#8位数码管(74HC595芯片)的使用方法
数码管基本属性:1.采用2片595驱动数码管,需要单片机3路IO口,根据数码管动态扫描原理进行显示:2.宽工作电压3.3V到5V:3.PCB板尺寸:71mm*22mm4.数码管型号:0.36 4位共阳 ...