That line just says... 

* If $head is true, then leave it alone, else set it to the value of 
  $link
  (aka: $head ||= $link _is the same as_ $head = $head || $link)
simran.

On Tue, 2002-12-10 at 13:34, Mark Goland wrote:
> Ok I got it working now, thanx much Jason. Only question I have is regarding
> this.
> 
>     >$head ||= $link;
> 
> What is this line doing ??
> 
> Mark
> ----- Original Message -----
> From: "Jason Tiller" <[EMAIL PROTECTED]>
> To: "perl" <[EMAIL PROTECTED]>
> Sent: Monday, December 09, 2002 3:16 PM
> Subject: Re: linked list's
> 
> 
> > Hi, Mark, :)
> >
> > On Sun, 8 Dec 2002, Mark Goland wrote:
> >
> > > I am having problems printing this doubly list. the bug statment
> > > prints the expacted so I think I have the list setup right, but I
> > > cant get this list to print in reverse... any ideas ??
> >
> > > #!/usr/bin/perl -w
> >
> > # Always do this.
> > use strict;
> > use warnings;
> >
> > > $debug=1;
> >
> > > for($i=1;$i<10;$i++){
> > >       $list = {value=>$i,prev=>$list,next=>${prev} };
> > >  print "prev=$prev\tlist=$list\n" if( $debug);
> > >       $prev= $list;
> > >
> > > }
> >
> > Since $prev and $list are global variables and you always set $prev to
> > list in the loop, how do you expect to go backwards ("reverse") with
> > your second iterator?  $prev == $list at the end of every iteration!
> > The only way to go backwards would be to store the head of the list
> > like so:
> >
> > my $head;
> >
> > for( my $i = 1;... ) {
> >    $list = ...;
> >    $head ||= $list;
> >    ...
> > }
> >
> > That sets head equal to the first list member you create.
> >
> > However, you have a larger problem.  You can't possibly go backwards
> > because your first element has both ->{next} *and* ->{prev}
> > undefined.  This shouldn't be the case in a double-linked list.
> >
> > Also, your algorithm is incorrect.  If you slightly change the debug
> > output statement to look like this:
> >
> > printf "\$list->{prev} = %s \t \$list->{next} = %s\n",
> >    $list->{prev},
> >    $list->{next} if $debug;
> >
> > You'll see the problem.  Here's a sample run:
> >
> > $ ./bob.pl
> > Use of uninitialized value in printf at ./bob.pl line 12.
> > Use of uninitialized value in printf at ./bob.pl line 12.
> > $list->{prev} =          $list->{next} =
> > $list->{prev} = HASH(0xa04116c)          $list->{next} = HASH(0xa04116c)
> > $list->{prev} = HASH(0xa066678)          $list->{next} = HASH(0xa066678)
> > $list->{prev} = HASH(0xa066630)          $list->{next} = HASH(0xa066630)
> > $list->{prev} = HASH(0xa0665e8)          $list->{next} = HASH(0xa0665e8)
> > $list->{prev} = HASH(0xa0665a0)          $list->{next} = HASH(0xa0665a0)
> > $list->{prev} = HASH(0xa066558)          $list->{next} = HASH(0xa066558)
> > $list->{prev} = HASH(0xa066510)          $list->{next} = HASH(0xa066510)
> > $list->{prev} = HASH(0xa0664c8)          $list->{next} = HASH(0xa0664c8)
> >
> > Umm, ->{prev} and ->{next} are the SAME FOR EVERY ELEMENT.  So, you've
> > in a sense created a single linked list with an additional, un-needed
> > data member for each element.
> >
> > The problem is that when creating a linked list, you never know the
> > address (er, reference in perl) of the *next* element.  So, in your
> > loop you have to "look back" and set the previous element's ->{next}
> > "pointer" (again, "reference" in perl) to the current element.  Your
> > algorithm didn't do this; hence the single linked list you created.
> >
> > Try this on for size:
> >
> > my ($head, $tail);
> >
> > my $link;
> > for( my $i = 1; $i < 10; ++$i ) {
> >    $link = { value => $i,
> >              next => undef,
> >              prev => $link };
> >    $head ||= $link;
> >    $link->{prev}->{next} = $link if $link->{prev};
> > }
> > $tail = $link;
> >
> > Let me know if you have any questions.
> >
> > ---Jason
> >
> >
> > --
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> >


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to