PHP基于双向链表与排序操作实现的会员排名功能示例

三月 06, 2019 | views
Comments 0

本文实例讲述了PHP基于双向链表与排序操作实现的会员排名功能。分享给大家供大家参考,具体如下:

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。如果不清楚概念的请自行百度。

  1. <?php 
  2. /** 
  3.  * 双向链表实现用户排行榜 
  4.  * 
  5.  * 仅用于体现思想逻辑,不具备实际参考价值 
  6.  * @author 疯狂老司机 
  7.  * @date 2016-07-07 
  8.  */ 
  9. class Rank{ 
  10.   /** 
  11.    * @var 指向前一个节点的引用 
  12.    */ 
  13.   public $pre = null; 
  14.   /** 
  15.    * @var 指向后一个节点的引用 
  16.    */ 
  17.   public $next = null; 
  18.   /** 
  19.    * @var 用户排行id 
  20.    */ 
  21.   public $id
  22.   /** 
  23.    * @var 用户名称 
  24.    */ 
  25.   public $username
  26.   public function __construct($id = ''$username = ''){ 
  27.     $this->id = $id
  28.     $this->username = $username
  29.   } 
  30.   /** 
  31.    * 添加成员节点方法 
  32.    * 
  33.    * @access public 
  34.    * @param obj head 初始节点 
  35.    * @param obj rank 成员节点 
  36.    */ 
  37.   public static function addRank($head$rank){ 
  38.     $cur = $head// 辅助节点 
  39.     $isExist = false; //这是一个标志位 
  40.     while($cur->next != null){ 
  41.       if($cur->next->id > $rank->id){ 
  42.         break
  43.       }else if($cur->next->id == $rank->id){ 
  44.         $isExist = true; 
  45.         echo'<br/>不能添加相同的id'
  46.       } 
  47.       $cur = $cur->next; 
  48.     } 
  49.     if(!$isExist){ 
  50.       if($cur->next != null){ 
  51.         $rank->next = $cur->next; 
  52.       } 
  53.       $rank->pre = $cur
  54.       if($cur->next != null){ 
  55.         $cur->next->pre = $rank
  56.       } 
  57.       $cur->next = $rank
  58.     } 
  59.   } 
  60.   /** 
  61.    * 删除成员节点方法 
  62.    * 
  63.    * @access public 
  64.    * @param obj head 初始节点 
  65.    * @param obj rankid 用户排行id 
  66.    */ 
  67.   public static function delRank($head$rankid){ 
  68.     $cur = $head->next; 
  69.     $isFind = flase; // 标记位 
  70.     while($cur != null){ 
  71.       if($cur->id == $rankid){ 
  72.         $isFind = true; 
  73.         break
  74.       } 
  75.       $cur = $cur->next; 
  76.     } 
  77.     if($isFind){ 
  78.       if($cur->next != null){ 
  79.         $cur->next->pre = $cur->pre; 
  80.       } 
  81.       $cur->pre->next = $cur->next; 
  82.       echo '<br/>要删除的成员id是'.$cur->id; 
  83.     }else
  84.       echo'<br/>要删除的成员没有'
  85.     } 
  86.   } 
  87.   /** 
  88.    * 遍历所有节点并输出显示 
  89.    * 
  90.    * @access public 
  91.    * @param obj head 初始节点 
  92.    */ 
  93.   public static function showRank($head){ 
  94.     $cur = $head->next; // 不打印空节点 
  95.     while($cur->next != null){ 
  96.       echo'<br/>id='.$cur->id.' '.'username='.$cur->username; 
  97.       $cur = $cur->next; 
  98.     } 
  99.     echo'<br/>id='.$cur->id.' '.'username='.$cur->username; 
  100.   } 
  101. //创建一个初始节点 
  102. $head=new Rank(); 
  103. //创建一个成员 
  104. $rank=new Rank(1,'老王'); 
  105. Rank::addRank($head,$rank); 
  106. $rank=new Rank(2,'小明'); 
  107. Rank::addRank($head,$rank); 
  108. $rank=new Rank(6,'大熊'); 
  109. Rank::addRank($head,$rank); 
  110. $rank=new Rank(3,'静香'); 
  111. Rank::addRank($head,$rank); 
  112. $rank=new Rank(56,'孙二娘'); 
  113. Rank::addRank($head,$rank); 
  114. echo '<br/>成员排行榜.....'
  115. Rank::showRank($head); 
  116. echo'<br/>'
  117. echo '<br/>删除后的成员排行榜.....'
  118. Rank::delRank($head,3); 
  119. Rank::showRank($head); 
  120. echo'<br/>'
  121. echo'<br/>下面测试删除最前面的和最后面的成员<br/>'
  122. echo '<br/>删除后的成员排行榜.....'
  123. Rank::delRank($head,1); 
  124. Rank::showRank($head); 
  125. echo'<br/>'
  126. echo '<br/>删除后的成员排行榜.....'
  127. Rank::delRank($head,56); 
  128. Rank::showRank($head); 
  129. ?> 

运行结果:

成员排行榜.....

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=大熊



zend