我才刚刚开始学习Perl,我必须做一个包含参考的练习。
我必须创建一个程序,该程序构造带有两个侧面引用的列表,这些引用作为命令行参数接收。在程序的开头,列表中只有一个元素-0。要遍历该列表,使用了引用,该引用引用了当前列表中唯一的元素-0。命令行的参数将被逐一读取并添加到被引用的元素之后。添加一个参数时,引用会将一个元素向右滑动(它引用新添加的元素)。还有两个特殊元素-+和-。 +允许引用将一个元素向右移动,-允许一个元素向左移动。同样,重要的是参考不得超过列表限制。
输出是列表中正确顺序的所有参数。
其他要求是,必须使用包含指向相邻元素的链接的哈希来创建列表。另外,我不能使用数组来存储整个列表。
有一些示例可以使您更容易地理解这个概念,这是最有用的一个:
./ 3.pl A D-B C + E
0 A B C D E
我现在所拥有的只是程序的开始,它距离完成还很遥远,并且无法编译,但是我不知道该从哪里开始。我尝试寻找有关双面引用的一些信息(不确定是否正确翻译),但似乎什么也找不到。有关双面参考的任何信息或如何正确开始编写此程序的任何提示,将不胜感激。
我的代码:
#!/usr/bin/perl
use strict;
use warnings;
my $A= {
value=>'0',
prev=>'undef',
next=>'$B'
};
my $B= {
value=>'0',
prev=>'$A',
next=>'$C'
};
my $C= {
value=>'0',
prev=>'$B',
next=>'undef'
};
for my $smbl(0..#$ARGV) {
$A-> {value} = $ARGV[$smbl];
$Α-> {next} = $ARGV[$smbl+1];
}
答案 0 :(得分:4)
首先,您要构建的内容称为doubly linked list。
让我告诉您使用链接列表的最大技巧:创建一个虚拟的“ head”节点和一个虚拟的“ tail”节点。您不会打印它们的值,但是拥有它们将大大减少代码中特殊情况的数量,从而使其更加简单!
核心是三个“指针”(引用)。
$head
指向列表的第一个节点。$tail
指向列表的最后一个节点。$cursor
最初指向$tail
中的节点。新节点将插入到该节点之前。在处理+
时,需要处理两种不同的情况:
$cursor == $tail
:错误!光标移到列表末尾。$cursor != $tail
:将$cursor
指向其所引用节点之后的节点。处理-
时,需要处理两种不同的情况:
$cursor->{prev} == $head
:错误!光标移到列表的开头。$cursor->{prev} != $head
:将$cursor
指向其引用的节点之前的节点。在处理插入节点时,由于虚拟节点而无需执行任何检查!