免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2341 | 回复: 6
打印 上一主题 下一主题

[数据结构] PHP实现数据结构链表的时候出现的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-09-17 23:21 |只看该作者 |倒序浏览
我根据Pascal的链表代码改编成PHP代码,使用了引用类型来代替指针类型。
此段代码主要是是一个链表插入函数insert()
根据数据的大小,来判断插入的位置,小的放在前面,大的放在后面。
目前有问题的代码,我已经表明出来了——不能插入在表首。数据将被忽略。


  1. <?
  2. error_reporting(E_ALL);
  3. DEFINE('NIL' , NULL);
  4. DEFINE('n' , 4);

  5. $x = stdin();

  6. new_link($head);
  7. $head['value'] = $x;

  8. for($i = 1 ; $i <=n ; $i ++)
  9. {
  10.         $x = stdin();
  11.         insert($head,$x);
  12. }

  13. print_r($head);

  14. $next = &$head;

  15. echo $next['value']."\n";
  16. do
  17. {
  18.         $next = & $next['link'];
  19.         echo $next['value']."\n";
  20. }while(($next['link'] != NIL));

  21. //初始化链表
  22. function new_link(&$var)
  23. {
  24.         $var = array(
  25.                 'value' =>; NULL ,
  26.                 'link' =>; NIL
  27.         );
  28. }

  29. function insert(&$head,$value)
  30. {
  31.         new_link($q);
  32.         $q['value'] = $value;
  33.         if($value <= $head['value'])
  34.         {
  35. /*有问题的代码*/
  36.                                                                                                 //插入表前
  37.                                                                                                 $q['link'] = &$head;
  38.                                                                                                 unset($head);
  39.                                                                                                 $head = &$q;
  40. /*有问题的代码*/
  41.         }
  42.         else
  43.         {
  44.                 //找出表中合适的位置
  45.                 $next = &$head;
  46.                 while($value >; $next['value'] && $next['link'] != NIL)
  47.                 {
  48.                         $last = &$next;
  49.                         $next = &$next['link'];
  50.                 }
  51.                 if($value <= $next['value'])
  52.                 {
  53.                         //插入表中间
  54.                         $last['link'] = &$q;
  55.                         $q['link'] = &$next;
  56.                 }
  57.                 else
  58.                 {
  59.                         //插入表尾
  60.                         $next['link'] = &$q;
  61.                         $q['link'] = NIL;
  62.                 }

  63.         }
  64.         unset($q);

  65. }

  66. //以下是输入输出处理

  67. //获得输入流
  68. function stdin($length='255')
  69. {
  70.         if (!isset($GLOBALS['StdinPointer'])){
  71.                 $GLOBALS['StdinPointer']=fopen("php://stdin","r");
  72.         }
  73.         $line=fgets($GLOBALS['StdinPointer'],$length);
  74.         return trim($line);
  75. }

  76. //输出流
  77. function stdout($msg)
  78. {
  79.         if (!isset($GLOBALS['StdoutPointer'])){
  80.                 $GLOBALS['StdoutPointer']=fopen("php://stdout","w");
  81.         }
  82.         fputs($GLOBALS['StdoutPointer'],$msg);
  83. }

  84. //输出错误信息
  85. function stderr($msg)
  86. {
  87.         if (!isset($GLOBALS['StderrPointer'])){
  88.                 $GLOBALS['StderrPointer']=fopen("php://stderr","w");
  89.         }
  90.         fputs($GLOBALS['StderrPointer'],$msg);
  91. }
  92. ?>;
复制代码


运行方式在PHPCLI下,不能在Webserver上运行。


  1. //插入表前
  2. $q['link'] = &$head;
  3. //此时$head的数据被两个变量指向,一个是$head,一个是$q['link']
  4. unset($head);
  5. //把$head到$head的数据的引用关系取消,否则对$head操作同时也对$q['link']操作
  6. $head = &$q;
  7. //建立$head到$q内容的引用关系
复制代码


请教哪里出错了?

测试数据: 2 6 5 4 7没问题
但是:4 3 5 6 1就不行了,比4大的才能够出现

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
2 [报告]
发表于 2005-09-18 13:12 |只看该作者

[数据结构] PHP实现数据结构链表的时候出现的问题

请参看:
http://w.yi.org/ftp/FAPM/PHP/php_manual_zh/language.references.arent.html
原帖由 "引用不是什么" 发表:

如前所述,引用不是指针。这意味着下面的结构不会产生你预期的效果:


  1. <?php
  2. function foo (&$var)
  3. {
  4.     $var =& $GLOBALS["baz"];
  5. }
  6. foo($bar);
  7. ?>;
复制代码




这将使 foo 函数中的 $var 变量在函数调用时和 $bar 绑定在一起,但接着又被重新绑定到了 $GLOBALS["baz"] 上面。不可能通过引用机制将 $bar 在函数调用范围内绑定到别的变量上面,因为在函数 foo 中并没有变量 $bar(它被表示为 $var,但是 $var 只有变量内容而没有调用符号表中的名字到值的绑定)。

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
3 [报告]
发表于 2005-09-18 13:13 |只看该作者

[数据结构] PHP实现数据结构链表的时候出现的问题

然后你的程序如下修改:


  1. ......
  2.         $head = insert($head,$x);
  3. ......
  4.        function insert($head,$value)
  5. {
  6. ......
  7.    unset($q);
  8.    return($head);
  9. }
  10. ......
复制代码

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
4 [报告]
发表于 2005-09-18 13:15 |只看该作者

[数据结构] PHP实现数据结构链表的时候出现的问题

我是如何发现问题所在的:
1、看过引用的一些说明,然后做了如下测试:

2、然后你的原来的程序如下修改进行测试:

  1. ......
  2.         insert($head,$x);
  3.         print_r($head);
  4. ......
  5.        function insert($head,$value)
  6. {
  7. ......
  8.         unset($q);
  9.         print_r($head);
  10. }
  11. ......   
复制代码


3、测试结果表明,当function(insert)结束时,$head因为进行二次的引用操作,其结果恰恰如手册的说明。

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
5 [报告]
发表于 2005-09-18 13:20 |只看该作者

[数据结构] PHP实现数据结构链表的时候出现的问题

结论:
1、手册是对的
2、手册很重要
3、多看手册是很必要的

论坛徽章:
0
6 [报告]
发表于 2005-09-18 19:15 |只看该作者

[数据结构] PHP实现数据结构链表的时候出现的问题

干嘛用PHP来做,流程不够清晰。引用的作用和C中的指针是类似但绝不是一回事!用C++写很简单的,如下:

  1. #include "iostream.h"

  2. struct nodeStruct {
  3.         int data;
  4.         struct nodeStruct *next;
  5. }

  6. typedef struct nodeStruct * NODE;

  7. function insert( NODE *p, int num )
  8. {
  9.         NODE prev;
  10.         nodeStruct newNode = malloc( sizeof( nodeStruct ));
  11.         newNode->;data = num;
  12.        
  13.         while( num>;p->;data && p->;next )
  14.         {
  15.                 prev = p;
  16.                 p = p->;next;
  17.         }
  18.        
  19.         prev->;next = newNode;
  20.         newNode->;next = p;
  21.        
  22.         return;
  23. }

  24. void main( void )
  25. {
  26.         int num;
  27.         nodeStruct node;
  28.         node->;data = node->;next = NULL;
  29.        
  30.         for( int i=0; i<5; i++ )
  31.         {
  32.                 cin<<num;
  33.                 insert( node, num );
  34.         }
  35.         //        打印node
  36.         NODE p = node;
  37.         while( p->;next )
  38.         {
  39.                 cout<<"\n"<<node->;data;
  40.                 p = p->;next;
  41.         }
  42. }

复制代码


是不是简洁多了?实际代码未来得及调试。

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
7 [报告]
发表于 2005-09-18 20:41 |只看该作者

[数据结构] PHP实现数据结构链表的时候出现的问题

原帖由 "powerpolly" 发表:

是不是简洁多了?实际代码未来得及调试。


你这个就是多此一举了。
既然使用PHP来实现,那么这个时候去考虑C++,有点牛头不对马嘴了。

可能Pascal来实现最合适了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP