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连接SQLSERVER 注意事项(附dll文件下载)
Jun 28 PHP
codeigniter教程之上传视频并使用ffmpeg转flv示例
Feb 13 PHP
php获取本周星期一具体日期的方法
Apr 20 PHP
PHP微信开发之二维码生成类
Jun 26 PHP
CodeIgniter中使用Smarty3基本配置
Jun 29 PHP
PHP截取IE浏览器并缩小原图的方法
Mar 04 PHP
PHP的邮件群发系统phplist配置方法详细总结
Mar 30 PHP
微信支付开发发货通知实例
Jul 12 PHP
php数据库操作model类(使用__call方法)
Nov 16 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
Aug 28 PHP
深入理解PHP中mt_rand()随机数的安全
Oct 12 PHP
Laravel5.1框架路由分组用法实例分析
Jan 04 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
十大催泪虐心动漫,你能坚持看到第几部?
2020/03/04 日漫
解析如何修改phpmyadmin中的默认登陆超时时间
2013/06/25 PHP
php获取客户端IP及URL的方法示例
2017/02/03 PHP
Javascript与vbscript数据共享
2007/01/09 Javascript
myEvent.js javascript跨浏览器事件框架
2011/10/24 Javascript
实现局部遮罩与关闭原理及代码
2013/02/04 Javascript
关于JS字符串函数String.replace()
2013/04/07 Javascript
原生js的弹出层且其内的窗口居中
2014/05/14 Javascript
JavaScript设计模式之单件模式介绍
2014/12/28 Javascript
jQuery中empty()方法用法实例
2015/01/16 Javascript
JS或jQuery获取ASP.NET服务器控件ID的方法
2015/06/08 Javascript
jqGrid用法汇总(全经典)
2016/06/28 Javascript
BootstrapTable请求数据时设置超时(timeout)的方法
2017/01/22 Javascript
微信小程序实现倒计时补零功能
2018/07/09 Javascript
Javascript中弹窗confirm与prompt的区别
2018/10/26 Javascript
layui使用数据表格实现购物车功能
2019/07/26 Javascript
vue 封装 Adminlte3组件的实现
2020/03/18 Javascript
[02:02:38]VG vs Mineski Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
[01:01:01]完美世界DOTA2联赛循环赛 GXR vs FTD BO2第一场 10.29
2020/10/29 DOTA
python抓取某汽车网数据解析html存入excel示例
2013/12/04 Python
常用python编程模板汇总
2016/02/12 Python
用Eclipse写python程序
2018/02/10 Python
解决python 无法加载downsample模型的问题
2018/10/25 Python
python实现的批量分析xml标签中各个类别个数功能示例
2019/12/30 Python
基于python监控程序是否关闭
2020/01/14 Python
解决PyCharm IDE环境下,执行unittest不生成测试报告的问题
2020/09/03 Python
BeautifulSoup获取指定class样式的div的实现
2020/12/07 Python
CSS3实现翘边的阴影效果的代码示例
2016/06/13 HTML / CSS
快速创建 HTML5 Canvas 电信网络拓扑图的示例代码
2018/03/21 HTML / CSS
Nayomi官网:沙特阿拉伯王国睡衣和内衣品牌
2020/12/19 全球购物
params有什么用
2016/03/01 面试题
初中英语教学反思
2014/01/25 职场文书
公司总经理工作职责管理办法
2014/02/28 职场文书
生活小常识广播稿
2014/09/16 职场文书
职场新人知识:如何制定一份合理的工作计划?
2019/09/11 职场文书
React Fragment介绍与使用详解
2021/11/11 Javascript