- 论坛徽章:
- 0
|
我根据Pascal的链表代码改编成PHP代码,使用了引用类型来代替指针类型。
此段代码主要是是一个链表插入函数insert()
根据数据的大小,来判断插入的位置,小的放在前面,大的放在后面。
目前有问题的代码,我已经表明出来了——不能插入在表首。数据将被忽略。
- <?
- error_reporting(E_ALL);
- DEFINE('NIL' , NULL);
- DEFINE('n' , 4);
- $x = stdin();
- new_link($head);
- $head['value'] = $x;
- for($i = 1 ; $i <=n ; $i ++)
- {
- $x = stdin();
- insert($head,$x);
- }
- print_r($head);
- $next = &$head;
- echo $next['value']."\n";
- do
- {
- $next = & $next['link'];
- echo $next['value']."\n";
- }while(($next['link'] != NIL));
- //初始化链表
- function new_link(&$var)
- {
- $var = array(
- 'value' =>; NULL ,
- 'link' =>; NIL
- );
- }
- function insert(&$head,$value)
- {
- new_link($q);
- $q['value'] = $value;
- if($value <= $head['value'])
- {
- /*有问题的代码*/
- //插入表前
- $q['link'] = &$head;
- unset($head);
- $head = &$q;
- /*有问题的代码*/
- }
- else
- {
- //找出表中合适的位置
- $next = &$head;
- while($value >; $next['value'] && $next['link'] != NIL)
- {
- $last = &$next;
- $next = &$next['link'];
- }
- if($value <= $next['value'])
- {
- //插入表中间
- $last['link'] = &$q;
- $q['link'] = &$next;
- }
- else
- {
- //插入表尾
- $next['link'] = &$q;
- $q['link'] = NIL;
- }
- }
- unset($q);
- }
- //以下是输入输出处理
- //获得输入流
- function stdin($length='255')
- {
- if (!isset($GLOBALS['StdinPointer'])){
- $GLOBALS['StdinPointer']=fopen("php://stdin","r");
- }
- $line=fgets($GLOBALS['StdinPointer'],$length);
- return trim($line);
- }
- //输出流
- function stdout($msg)
- {
- if (!isset($GLOBALS['StdoutPointer'])){
- $GLOBALS['StdoutPointer']=fopen("php://stdout","w");
- }
- fputs($GLOBALS['StdoutPointer'],$msg);
- }
- //输出错误信息
- function stderr($msg)
- {
- if (!isset($GLOBALS['StderrPointer'])){
- $GLOBALS['StderrPointer']=fopen("php://stderr","w");
- }
- fputs($GLOBALS['StderrPointer'],$msg);
- }
- ?>;
复制代码
运行方式在PHPCLI下,不能在Webserver上运行。
- //插入表前
- $q['link'] = &$head;
- //此时$head的数据被两个变量指向,一个是$head,一个是$q['link']
- unset($head);
- //把$head到$head的数据的引用关系取消,否则对$head操作同时也对$q['link']操作
- $head = &$q;
- //建立$head到$q内容的引用关系
复制代码
请教哪里出错了?
测试数据: 2 6 5 4 7没问题
但是:4 3 5 6 1就不行了,比4大的才能够出现 |
|