列表中的双面参考

时间:2019-03-07 09:46:29

标签: perl hash reference

我才刚刚开始学习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];
}

1 个答案:

答案 0 :(得分:4)

首先,您要构建的内容称为doubly linked list

让我告诉您使用链接列表的最大技巧:创建一个虚拟的“ head”节点和一个虚拟的“ tail”节点。您不会打印它们的值,但是拥有它们将大大减少代码中特殊情况的数量,从而使其更加简单!

核心是三个“指针”(引用)。

  • $head指向列表的第一个节点。
  • $tail指向列表的最后一个节点。
  • $cursor最初指向$tail中的节点。新节点将插入到该节点之前。

在处理+时,需要处理两种不同的情况:

  • $cursor == $tail:错误!光标移到列表末尾。
  • $cursor != $tail:将$cursor指向其所引用节点之后的节点。

处理-时,需要处理两种不同的情况:

  • $cursor->{prev} == $head:错误!光标移到列表的开头。
  • $cursor->{prev} != $head:将$cursor指向其引用的节点之前的节点。

在处理插入节点时,由于虚拟节点而无需执行任何检查!