Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Рекурсивно создать связный список


Автор: klifleopard 10.6.2010, 13:38
Здравствуйте. Недавно начал изучать Perl поэтому извиняюсь за банальный вопрос - как рекурсивно построить связный список? Есть нерабочий пример:

Код

#Главная программа
if (defined $head) {undef $head;}
while ($value = <>)
{ insert ($head, $value);
}
print "\n";
 list_print ($head);
#Добавление в список

sub insert ()
{ my ($item, $p)= shift @_;

  unless ($item)
  { $item ={};                          #Анонимный хеш, создаем запись
    $item->{INFO}= $p;
    $item->{NEXT}=undef;   #Последний элемент в списке
    $_[0]=$item;
    return;
  }
 if ($item->{INFO} == $p)
 {warn "Такое значение уже есть в списке!\n";}
 else
 {insert ($item->{NEXT},$p);}
}

#Печать списка
sub list_print ()
 {  my ($item) = shift @_;
  unless ($item) { return;}
  else
  {   print "$item->{INFO}";
   list_print ($item->{NEXT});  }}


Может кто нибудь прокомментировать данный код и сказать что неправильно?  smile

Автор: arto 10.6.2010, 14:18
для чего это вам?

Автор: klifleopard 10.6.2010, 14:32
Цитата(arto @ 10.6.2010,  14:18)
для чего это вам?

Лабораторную такую дали. Ошибку увидел - shift в первой строке подпрограммы insert() явно лишний. В принципе задачу считаю решенной, но если есть идеи как усовершенствовать данный алгоритм, буду им только рад. smile

Автор: shamber 10.6.2010, 22:16
Цитата(klifleopard @  10.6.2010,  14:32 Найти цитируемый пост)
shift в первой строке подпрограммы insert() явно лишний.

необязательно, можно и только shift оставить.

Автор: klem4 15.6.2010, 20:53
Если интересно, немного намека на ооп

Код

#!/usr/bin/perl -w
use strict;

    my $list = new List;

    $list->_push(1);
    $list->_push(2);
    $list->_print;

    print "\n";

    $list->_push( $_ ) for ( qw[ a b c d ] );
    $list->_print;

package Node;

sub new
{
    my ( $class, $value ) = @_;
    my $self =
    {
        value   => $value,
        _next   => undef
    };

    bless $self, $class;
}
1;

package List;

sub new
{
    my $class = shift;
    my $self =
    {
        head    => undef,
        _last   => undef
    };

    bless $self, $class;
}

sub _push
{
    my ( $self, $value ) = @_;
    my $node = new Node( $value );

    if ( $self->{head} )
    {
        $self->{_last}->{_next} = $node;
        $self->{_last} = $node;
    }
    else
    {
        $self->{head}  = $node;
        $self->{_last} = $node;
    }
}

sub _print
{
    my $self = shift;
    my $head = $self->{head};

    while ( $self->{head} )
    {
        print $self->{head}->{value}, "\n";
         $self->{head} = $self->{head}->{_next};
    }

    $self->{head} = $head;
}

1;


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)