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
用PHP产生动态的影像图
Oct 09 PHP
手把手教你使用DedeCms的采集的图文教程
Mar 11 PHP
php 友好URL的实现(吐血推荐)
Oct 04 PHP
基于Zend的Config机制的应用分析
May 02 PHP
PHP利用str_replace防注入的方法
Nov 10 PHP
php设计模式之命令模式使用示例
Mar 02 PHP
php foreach正序倒序输出示例代码
Jul 01 PHP
PHP获取当前所在目录位置的方法
Nov 26 PHP
PHP生成唯一订单号的方法汇总
Apr 16 PHP
PHP入门教程之面向对象基本概念实例分析
Sep 11 PHP
PHP实现cookie跨域session共享的方法分析
Aug 23 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
Zend Framework动作助手FlashMessenger用法详解
2016/03/05 PHP
PHP PDOStatement::columnCount讲解
2019/01/30 PHP
建议大家看下JavaScript重要知识更新
2007/07/08 Javascript
window.onload 加载完毕的问题及解决方案(下)
2009/07/09 Javascript
基于jQuery的公告无限循环滚动实现代码
2012/05/11 Javascript
js数组的操作详解
2013/03/27 Javascript
原生js ActiveXObject获取execl里面的值
2013/11/01 Javascript
js中document.write使用过程中的一点疑问解答
2014/03/20 Javascript
JavaScript中的this关键字使用方法总结
2015/03/13 Javascript
JS获取iframe中longdesc属性的方法
2015/04/01 Javascript
Javascript 正则表达式校验数字的简单实例
2016/11/02 Javascript
Angular X中使用ngrx的方法详解(附源码)
2017/07/10 Javascript
web前端开发中常见的多列布局解决方案整理(一定要看)
2017/10/15 Javascript
vue使用codemirror的两种用法
2019/08/27 Javascript
[03:09]显微镜下的DOTA2第一期——带你走进华丽的DOTA2世界
2014/06/20 DOTA
[04:54]DOTA2-DPC中国联赛1月31日Recap集锦
2021/03/11 DOTA
python爬虫实战之爬取京东商城实例教程
2017/04/24 Python
python numpy数组的索引和切片的操作方法
2018/10/20 Python
对Python中DataFrame选择某列值为XX的行实例详解
2019/01/29 Python
如何在Python中实现goto语句的方法
2019/05/18 Python
Django工程的分层结构详解
2019/07/18 Python
Python定义函数实现累计求和操作
2020/05/03 Python
如何在Anaconda中打开python自带idle
2020/09/21 Python
如何用Matlab和Python读取Netcdf文件
2021/02/19 Python
StubHub美国:购买或出售您的门票
2019/07/09 全球购物
华为C++笔试题
2014/08/05 面试题
Shell脚本如何向终端输出信息
2014/04/25 面试题
幼儿园清明节活动总结
2014/07/04 职场文书
秋季运动会演讲稿
2014/09/16 职场文书
项目备案申请报告
2015/05/15 职场文书
2015年生活老师工作总结
2015/05/27 职场文书
Golang的继承模拟实例
2021/06/30 Golang
Linux下使用C语言代码搭建一个简单的HTTP服务器
2022/04/13 Servers
nginx实现多geoserver服务的负载均衡
2022/05/15 Servers
MySQL8.0 Undo Tablespace管理详解
2022/06/16 MySQL
5个实用的JavaScript新特性
2022/06/16 Javascript