Rubyの魔神 このページをアンテナに追加 RSSフィード

   「Ruby」は宝石の魔神のイメージ(The Jinn of the Ruby)
   [VB] [VB6] [C#] [Android] [電子工作] [個人メモ] [仕事メモ] [アイデア] [TstLink] [CE] [LTSA] [自動化] [Qt] [OCaml] [TOOLS]
   [3Dプリンタ] [RAA] [Forge]   [機能別索引] [逆引きRuby] [マニュアル] [るびま] [標準ライブラリ] [るりまサーチ] [Try! Ruby] [PRaggerまとめ] [ピジョン・ブラッド]
   [Rubyコーディング規約] [プログラミングのオキテ] [Rubyist SNS] [TOOLBIS]
   [RubyネットワークProg] [druby] [コードなにがし] [RDocテンプレ] [Ruby/Tkサンプル]
   [WAVE] [Xperia] [github] [twitterなど] [Java] [EA] [マクロ]

2013-09-18

連結リスト

連結リスト - Rubyの魔神 を含むブックマーク はてなブックマーク - 連結リスト - Rubyの魔神 連結リスト - Rubyの魔神 のブックマークコメント

連結リスト

お気楽 Ruby プログラミング入門

演算子の実装なども参考になります。


Rubyでリスト構造の実装

Rubyでリスト構造の実装 - バリケンのRuby日記 - Rubyist

こちらも参考にしてList

class List
	def initialize
		@cdr = nil
		@car = nil
	end
	attr_accessor :cdr,:car
	
	def add_last(x)
		a = self
		a = a.car until a.car.nil?
		a.car = List.new
		a.car.cdr = x
	end
	
	def size
		a = self
		i = 0
		i += 1 while a = a.car
		return i
	end
	
	def each
		a = self.car
		self.size.times do
			yield a.cdr
			a = a.car
		end
	end
	
	def empty?
		@car.nil? 
	end
	
	def at(n)
		if n == -1 
			a = self
		else
			a = self.car
			n.times do
				a = a.car if not a.nil? 
			end
		end
		a
	end
	
	def insert!(n,data)
		a = self.at(n - 1)
		if a
			b = List.new
			b.car = a.car
			b.cdr = data
			a.car = b
		end
	end
	
	def delete_at!(n)
		a = self.at(n - 1)
		if a and a.car
			a.car = a.car.car
		end
	end
	
	def to_a
		a = []
		each {|x|
			a << x
		}
		a
	end

	def to_s
		"(" << to_a.join(",") << ")"
	end

	def inspect
		sprintf("#<List:%#x>", self.object_id)
	end
	
	def [](n)
		at(n)
	end
	
	def []=(n,value)
		a = at(n)
		a.cdr = value if a
	end

	def +(other)
		n = other.size
		a = other.car
		n.times do
			add_last(a.cdr)
			a = a.car if not a.nil? 
		end	
		self
	end

end

x = List.new
puts x.empty?
x.add_last("Ruby")
x.add_last("Haskell")
x.add_last("Java")
x.add_last("Perl")
x.add_last("Python")
puts x.empty?

puts x.size

p x.at(0).cdr
p x.at(1).cdr
p x.at(2).cdr
p x.at(3).cdr
p x.at(4).cdr
#p x.at(5).cdr

x.insert!(1,"C")

x.each do |i|
	puts i
end

puts "---"
x.delete_at!(0)

x.each do |i|
	puts i
end

p x.to_a
p x.to_s
p x

x[0] = "Pascal"

p x[0].cdr

p x.to_s

y = List.new
y.add_last("a")
y.add_last("b")
y.add_last("c")

z = x + y

p z.to_s

トラックバック - http://ruby.g.hatena.ne.jp/garyo/20130918