PHP基于双向链表与排序操作实现的会员排名功能示例


Posted in PHP onDecember 26, 2017

本文实例讲述了PHP基于双向链表与排序操作实现的会员排名功能。分享给大家供大家参考,具体如下:

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。如果不清楚概念的请自行百度。

<?php
/**
 * 双向链表实现用户排行榜
 *
 * 仅用于体现思想逻辑,不具备实际参考价值
 * @author 疯狂老司机
 * @date 2016-07-07
 */
class Rank{
  /**
   * @var 指向前一个节点的引用
   */
  public $pre = null;
  /**
   * @var 指向后一个节点的引用
   */
  public $next = null;
  /**
   * @var 用户排行id
   */
  public $id;
  /**
   * @var 用户名称
   */
  public $username;
  public function __construct($id = '', $username = ''){
    $this->id = $id;
    $this->username = $username;
  }
  /**
   * 添加成员节点方法
   *
   * @access public
   * @param obj head 初始节点
   * @param obj rank 成员节点
   */
  public static function addRank($head, $rank){
    $cur = $head; // 辅助节点
    $isExist = false; //这是一个标志位
    while($cur->next != null){
      if($cur->next->id > $rank->id){
        break;
      }else if($cur->next->id == $rank->id){
        $isExist = true;
        echo'<br/>不能添加相同的id';
      }
      $cur = $cur->next;
    }
    if(!$isExist){
      if($cur->next != null){
        $rank->next = $cur->next;
      }
      $rank->pre = $cur;
      if($cur->next != null){
        $cur->next->pre = $rank;
      }
      $cur->next = $rank;
    }
  }
  /**
   * 删除成员节点方法
   *
   * @access public
   * @param obj head 初始节点
   * @param obj rankid 用户排行id
   */
  public static function delRank($head, $rankid){
    $cur = $head->next;
    $isFind = flase; // 标记位
    while($cur != null){
      if($cur->id == $rankid){
        $isFind = true;
        break;
      }
      $cur = $cur->next;
    }
    if($isFind){
      if($cur->next != null){
        $cur->next->pre = $cur->pre;
      }
      $cur->pre->next = $cur->next;
      echo '<br/>要删除的成员id是'.$cur->id;
    }else{
      echo'<br/>要删除的成员没有';
    }
  }
  /**
   * 遍历所有节点并输出显示
   *
   * @access public
   * @param obj head 初始节点
   */
  public static function showRank($head){
    $cur = $head->next; // 不打印空节点
    while($cur->next != null){
      echo'<br/>id='.$cur->id.' '.'username='.$cur->username;
      $cur = $cur->next;
    }
    echo'<br/>id='.$cur->id.' '.'username='.$cur->username;
  }
}
//创建一个初始节点
$head=new Rank();
//创建一个成员
$rank=new Rank(1,'老王');
Rank::addRank($head,$rank);
$rank=new Rank(2,'小明');
Rank::addRank($head,$rank);
$rank=new Rank(6,'大熊');
Rank::addRank($head,$rank);
$rank=new Rank(3,'静香');
Rank::addRank($head,$rank);
$rank=new Rank(56,'孙二娘');
Rank::addRank($head,$rank);
echo '<br/>成员排行榜.....';
Rank::showRank($head);
echo'<br/>';
echo '<br/>删除后的成员排行榜.....';
Rank::delRank($head,3);
Rank::showRank($head);
echo'<br/>';
echo'<br/>下面测试删除最前面的和最后面的成员<br/>';
echo '<br/>删除后的成员排行榜.....';
Rank::delRank($head,1);
Rank::showRank($head);
echo'<br/>';
echo '<br/>删除后的成员排行榜.....';
Rank::delRank($head,56);
Rank::showRank($head);
?>

运行结果:

成员排行榜.....
id=1 username=老王
id=2 username=小明
id=3 username=静香
id=6 username=大熊
id=56 username=孙二娘

删除后的成员排行榜.....
要删除的成员id是3
id=1 username=老王
id=2 username=小明
id=6 username=大熊
id=56 username=孙二娘

下面测试删除最前面的和最后面的成员

删除后的成员排行榜.....
要删除的成员id是1
id=2 username=小明
id=6 username=大熊
id=56 username=孙二娘

删除后的成员排行榜.....
要删除的成员id是56
id=2 username=小明
id=6 username=大熊

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php addslashes和mysql_real_escape_string
Jan 24 PHP
PHP开发不能违背的安全规则 过滤用户输入
May 01 PHP
PHP 5.3和PHP 5.4出现FastCGI Error解决方法
Feb 12 PHP
PHP实现支持SSL连接的SMTP邮件发送类
Mar 05 PHP
PHP 微信支付类 demo
Nov 30 PHP
屏蔽PHP默认设置中的Notice警告的方法
May 20 PHP
Yii2中DropDownList简单用法示例
Jul 18 PHP
利用Laravel事件系统如何实现登录日志的记录详解
May 20 PHP
ThinkPHP3.1.x修改成功与失败跳转页面的方法
Sep 29 PHP
php/JS实现的生成随机密码(验证码)功能示例
Jun 06 PHP
PHP7数组的底层实现示例
Aug 25 PHP
PHP随机生成中文段落示例【测试网站内容时使用】
Apr 26 PHP
thinkphp5 URL和路由的功能详解与实例
Dec 26 #PHP
php-msf源码详解
Dec 25 #PHP
关于 Laravel Redis 多个进程同时取队列问题详解
Dec 25 #PHP
源码分析 Laravel 重复执行同一个队列任务的原因
Dec 25 #PHP
浅析PHP中的闭包和匿名函数
Dec 25 #PHP
thinkphp5 加载静态资源路径与常量的方法
Dec 24 #PHP
PHP读取并输出XML文件数据的简单实现方法
Dec 22 #PHP
You might like
PHP实践教程之过滤、验证、转义与密码详解
2017/07/24 PHP
php 可变函数使用小结
2018/06/12 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
PHP常量DIRECTORY_SEPARATOR原理及用法解析
2020/11/10 PHP
破除网页鼠标右键被禁用的绝招大全
2006/12/27 Javascript
js中访问html中iframe的文档对象的代码[IE6,IE7,IE8,FF]
2011/01/08 Javascript
Jquery插件之打造自定义的select标签
2011/11/30 Javascript
javascript学习(二)javascript常见问题总结
2013/01/02 Javascript
JQuery操作tr和td内容的方法实例
2013/03/06 Javascript
JS获取当前网址、主机地址项目根路径
2013/11/19 Javascript
JavaScript中获取高度和宽度函数总结
2014/10/08 Javascript
6种javascript显示当前系统时间代码
2015/12/01 Javascript
node.js学习之交互式解释器REPL详解
2016/12/08 Javascript
浅谈在vue中用webpack打包之后运行文件的问题以及相关配置方法
2018/02/21 Javascript
nodejs实现解析xml字符串为对象的方法示例
2018/03/14 NodeJs
JavaScript常见事件处理程序实例总结
2019/01/05 Javascript
TypeScript中的方法重载详解
2019/04/12 Javascript
IntelliJ IDEA编辑器配置vue高亮显示
2019/09/26 Javascript
深入浅析vue全局环境变量和模式
2020/04/28 Javascript
django使用图片延时加载引起后台404错误
2017/04/18 Python
Python实现运行其他程序的四种方式实例分析
2017/08/17 Python
Python程序员面试题 你必须提前准备!
2018/01/16 Python
Python 占位符的使用方法详解
2019/07/10 Python
python pip源配置,pip配置文件存放位置的方法
2019/07/12 Python
Python内置加密模块用法解析
2019/11/25 Python
美国休闲服装品牌:J.Crew Factory
2017/03/04 全球购物
Theflamel意大利:女士奢华服装、鞋子和配件
2020/01/11 全球购物
一些高难度的SQL面试题
2016/11/29 面试题
买房子个人收入证明
2014/01/16 职场文书
创业计划书撰写原则
2014/01/25 职场文书
企业后勤岗位职责
2014/02/28 职场文书
2014年党员干部四风问题自我剖析材料
2014/09/29 职场文书
2014年宣传工作总结
2014/11/18 职场文书
星际争霸:毕姥爷vs解冻01
2022/04/01 星际争霸
Redis特殊数据类型HyperLogLog基数统计算法讲解
2022/06/01 Redis
错误码NET::ERR_CERT_DATE_INVALID证书已过期解决方法?
2022/07/07 数码科技