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 相关文章推荐
使用sockets:从新闻组中获取文章(二)
Oct 09 PHP
深入探讨PHP中的内存管理问题
Aug 31 PHP
浅析php变量修饰符static的使用
Jun 28 PHP
解析link_mysql的php版
Jun 30 PHP
php实现的太平洋时间和北京时间互转的自定义函数分享
Aug 19 PHP
php将access数据库转换到mysql数据库的方法
Dec 24 PHP
学习php设计模式 php实现装饰器模式(decorator)
Dec 07 PHP
PHP经典算法集锦【经典收藏】
Sep 14 PHP
php微信公众号开发之简答题
Oct 20 PHP
php判断电子邮件是否正确方法
Dec 04 PHP
TP5(thinkPHP5框架)实现显示错误信息及行号功能的方法
Jun 03 PHP
php pdo连接数据库操作示例
Nov 18 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过程中的一些注意点的总结
2013/10/25 PHP
Laravel 创建可以传递参数 Console服务的例子
2019/10/14 PHP
悄悄用脚本检查你访问过哪些网站的代码
2010/12/04 Javascript
javascript 闭包
2011/09/15 Javascript
JS实现商品倒计时实现代码
2013/05/03 Javascript
jquery mobile界面数据刷新的实现方法
2016/05/28 Javascript
jQuery插件扩展extend的简单实现原理
2016/06/24 Javascript
jquery动态创建div与input的实例代码
2016/10/12 Javascript
详解Nodejs的timers模块
2016/12/22 NodeJs
loading动画特效小结
2017/01/22 Javascript
vue中mint-ui环境搭建详细介绍
2017/04/06 Javascript
利用JS实现scroll自定义滚动效果详解
2017/10/17 Javascript
微信小程序实现获取自己所处位置的经纬度坐标功能示例
2017/11/30 Javascript
基于vue中解决v-for使用报红并出现警告的问题
2018/03/03 Javascript
vue.js实现格式化时间并每秒更新显示功能示例
2018/07/07 Javascript
vue-cli 3.0 版本与3.0以下版本在搭建项目时的区别详解
2018/12/11 Javascript
详解基于webpack&amp;gettext的前端多语言方案
2019/01/29 Javascript
Angular 多级路由实现登录页面跳转(小白教程)
2019/11/19 Javascript
Python中多线程的创建及基本调用方法
2016/07/08 Python
python3中函数参数的四种简单用法
2018/07/09 Python
python操作小程序云数据库实现简单的增删改查功能
2019/06/06 Python
Django时区详解
2019/07/24 Python
flask 实现token机制的示例代码
2019/11/07 Python
vue常用指令代码实例总结
2020/03/16 Python
Python学习之os模块及用法
2020/06/03 Python
用python实现一个简单计算器(完整DEMO)
2020/10/14 Python
英国奢侈品网站:MatchesFashion
2016/12/16 全球购物
意大利大型购物中心:Oliviero.it
2017/10/19 全球购物
美国职棒大联盟的官方手套、球和头盔:Rawlings
2020/02/15 全球购物
毕业研究生的自我鉴定
2013/11/30 职场文书
求职简历推荐信范文
2013/12/02 职场文书
优秀团支部事迹材料
2014/02/08 职场文书
司法助理专业自荐书
2014/06/13 职场文书
网吧七夕活动策划方案
2014/08/31 职场文书
祝寿主持词
2015/07/02 职场文书
idea以任意顺序debug多线程程序的具体用法
2021/08/30 Java/Android