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 相关文章推荐
一个颜色轮换的简单例子
Oct 09 PHP
基于数据库的在线人数,日访问量等统计
Oct 09 PHP
PHP 定界符 使用技巧
Jun 14 PHP
PHP 将图片按创建时间进行分类存储的实现代码
Jan 05 PHP
php设计模式 Prototype (原型模式)代码
Jun 26 PHP
浅析PHP中的UNICODE 编码与解码
Jun 29 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(五)
Jun 23 PHP
php使用curl获取https请求的方法
Feb 11 PHP
php防止网站被攻击的应急代码
Oct 21 PHP
学习php设计模式 php实现状态模式
Dec 07 PHP
几个优化WordPress中JavaScript加载体验的插件介绍
Dec 17 PHP
yii2分页之实现跳转到具体某页的实例代码
Jun 02 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
萌王史莱姆”萌王性别尴尬!那“萌战”归女组还是男?
2018/12/17 日漫
据说是雅虎的一份PHP面试题附答案
2009/01/07 PHP
Php图像处理类代码分享
2012/01/19 PHP
PIGCMS 如何关闭聊天机器人
2015/02/12 PHP
php表单加入Token防止重复提交的方法分析
2016/10/10 PHP
PHP基于方差和标准差计算学生成绩的稳定性示例
2017/07/04 PHP
详解php 使用Callable Closure强制指定回调类型
2017/10/26 PHP
Domino中运用jQuery读取视图内容的方法
2009/10/21 Javascript
jquery实现的带缩略图的焦点图片切换(自动播放/响应鼠标动作)
2013/01/23 Javascript
js获取当前月的第一天和最后一天的小例子
2013/11/18 Javascript
获取select元素被选中的文本内容的js代码
2014/01/29 Javascript
JavaScript使用concat连接数组的方法
2015/04/06 Javascript
JS实现方向键切换输入框焦点的方法
2015/08/19 Javascript
基于JS实现数字+字母+中文的混合排序方法
2016/06/06 Javascript
js将滚动条滚动到指定位置的简单实现方法
2016/06/25 Javascript
Vue2.0用户权限控制解决方案的示例
2018/02/10 Javascript
vue中引用阿里字体图标的方法
2018/02/10 Javascript
nodejs简单访问及操作mysql数据库的方法示例
2018/03/15 NodeJs
vue或react项目生产环境去掉console.log的操作
2020/09/02 Javascript
[01:36:57]【09DOTA2第一视角】小骷髅
2014/04/16 DOTA
[49:43]VG vs FNATIC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
使用Python设置tmpfs来加速项目的教程
2015/04/17 Python
Python的gevent框架的入门教程
2015/04/29 Python
详解Python sys.argv使用方法
2019/05/10 Python
Python3 实现爬取网站下所有URL方式
2020/01/16 Python
Python中logger日志模块详解
2020/08/04 Python
欧舒丹比利时官网:L’OCCITANE比利时
2017/04/25 全球购物
Myprotein加拿大官网:欧洲第一的运动营养品牌
2018/01/06 全球购物
美国体育用品商店:Academy Sports + Outdoors
2020/01/04 全球购物
Java方面的关于数组和继承的笔面试题
2015/09/18 面试题
客户接待方案
2014/02/26 职场文书
教师竞聘上岗演讲稿
2014/09/03 职场文书
秋季运动会开幕词
2015/01/28 职场文书
求职信格式范文
2015/03/19 职场文书
餐厅营销的秘密:为什么老顾客会流水?
2019/08/08 职场文书
python如何读取和存储dict()与.json格式文件
2022/06/25 Python