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简单提示框alert封装函数
Aug 08 PHP
php 获取本地IP代码
Jun 23 PHP
使用pthreads实现真正的PHP多线程(需PHP5.3以上版本)
May 05 PHP
windows7下安装php的imagick和imagemagick扩展教程
Jul 04 PHP
Mac系统下使用brew搭建PHP(LNMP/LAMP)开发环境
Mar 03 PHP
php线性表的入栈与出栈实例分析
Jun 12 PHP
Thinkphp框架中D方法与M方法的区别
Dec 23 PHP
PHP一致性hash分布式算法封装类定义与用法示例
Aug 04 PHP
在laravel框架中实现封装公共方法全局调用
Oct 14 PHP
php中用unset销毁变量并释放内存
May 10 PHP
PHP程序员简单的开展服务治理架构操作详解(一)
May 14 PHP
php+mysql实现的无限分类方法类定义与使用示例
May 27 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将字符串转化成date存入数据库的两种方式
2014/04/28 PHP
mantis安装、配置和使用中的问题小结
2014/07/14 PHP
jQuery 行背景颜色的交替显示(隔行变色)实现代码
2009/12/13 Javascript
精通Javascript系列之数据类型 字符串
2011/06/08 Javascript
50款非常棒的 jQuery 插件分享
2012/03/29 Javascript
固定表格行列(expression)在IE下适用
2013/07/25 Javascript
jquery统计复选框选中示例
2013/11/05 Javascript
JS实现超简单的鼠标拖动效果
2015/11/02 Javascript
jquery表格datatables实例解析 直接加载和延迟加载
2016/08/12 Javascript
微信小程序 火车票查询实例讲解
2016/10/17 Javascript
详解vue 中使用 AJAX获取数据的方法
2017/01/18 Javascript
基于vue如何发布一个npm包的方法步骤
2019/05/15 Javascript
vue拖拽组件 vuedraggable API options实现盒子之间相互拖拽排序
2019/07/08 Javascript
详解Vue2.5+迁移至Typescript指南
2019/08/01 Javascript
WebPack工具运行原理及入门教程
2020/12/02 Javascript
[01:11:48]Fnatic vs IG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python获取指定网页上所有超链接的方法
2015/04/04 Python
Python and、or以及and-or语法总结
2015/04/14 Python
Python正则表达式常用函数总结
2017/06/24 Python
Python3.5基础之NumPy模块的使用图文与实例详解
2019/04/24 Python
python+selenium实现简历自动刷新的示例代码
2019/05/20 Python
django框架自定义模板标签(template tag)操作示例
2019/06/24 Python
基于Pytorch SSD模型分析
2020/02/18 Python
关于tf.matmul() 和tf.multiply() 的区别说明
2020/06/18 Python
纯css3实现效果超级炫的checkbox复选框和radio单选框
2014/09/01 HTML / CSS
video结合canvas实现视频在线截图功能
2018/06/25 HTML / CSS
中兴通讯全球官方网站:ZTE
2020/12/26 全球购物
人力资源管理专业毕业生推荐信
2013/11/07 职场文书
二年级学生评语大全
2014/04/23 职场文书
产品发布会策划方案
2014/05/12 职场文书
党支部特色活动方案
2014/08/20 职场文书
2014党员民主评议个人总结
2014/09/10 职场文书
共产党员批评与自我批评
2014/10/15 职场文书
Node-Red实现MySQL数据库连接的方法
2021/08/07 MySQL
JavaCV实现照片马赛克效果
2022/01/22 Java/Android
Spring Boot 的创建和运行示例代码详解
2022/07/23 Java/Android