Doubly-linked list/Element definition: Difference between revisions

From Rosetta Code
Content added Content deleted
(Perl)
No edit summary
Line 43: Line 43:
slot data = [];
slot data = [];
enddefine;
enddefine;

==[[Ruby]]==
[[Category:Ruby]]

class ListNode
attr_accessor :val, :nxt, :prv
def initialize(mval,mprv=nil,mnxt=nil)
self.val=mval
self.prv=mprv
self.nxt=mnxt
end
def each(&b)
yield val
nxt.each(&b) if nxt
self
end
include Enumerable
end

Revision as of 01:23, 30 September 2007

Task
Doubly-linked list/Element definition
You are encouraged to solve this task according to the task description, using any language you may know.

Define the data structure for a doubly-linked list element. The element should include a data member to hold its value and pointers to both the next element in the list and the previous element in the list. The pointers should be mutable.

Ada

type Link;
type Link_Access is access Link;
type Link is record
  Next : Link_Access := null;
  Prev : Link_Access := null;
  Data : Integer;
end record;

C

struct link {
  struct * link next;
  struct * link prev;
  int data;
};

Perl

Just use an array. You can traverse and splice it any way. Linked lists are way too low level.

However, if all you got is a algorithm in a foreign language, you can use references to accomplish the translation.

my %node = (
    data => 'say what',
    next => \%foo_node,
    prev => \%bar_node,
);
$node{next} = \%quux_node;  # mutable

Pop11

uses objectclass;
define :class Link;
    slot next = [];
    slot prev = [];
    slot data = [];
enddefine;

Ruby

 class ListNode
   attr_accessor :val, :nxt, :prv
   def initialize(mval,mprv=nil,mnxt=nil)
     self.val=mval
     self.prv=mprv
     self.nxt=mnxt
   end
   def each(&b)
     yield val
     nxt.each(&b) if nxt
     self
   end
   include Enumerable
 end