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]