Now there is no shortest path finding and same friend in the network will be counted redundantly.
Alumnus will be stored in one global hash

"$alumni{name, alumnusobj}"

.
Friends of each alumnus will be stored in one instance array “@friend{name}”.
There are “getter” & “setter” for instance method and variables.

Input anything except the “correct” options to see the printFriend function which is a traverse over all the friends.

#!/usr/bin/ruby
$alumni=Hash.new
module Lib
  def Lib.isAlumnus(name)
    #check if is already a alumnus before adding
    #return value: true(is), false(not)
    if $alumni.has_key?(name)
      true
    else
      false
    end
  end
 
  def Lib.getAlumnusByName(name)
    #load a name, then return Alumnus obj
    return $alumni[name]
  end
end
 
class Person
  def initialize(name)
    @name=name
  end
 
  def getName #name getter
    @name
  end
 
  def setName(name) #name setter
    #set and return name
    @name=name
  end
 
end
 
class Alumnus < Person
  include Lib
  def initialize(name)
    super(name)
    @friend=Array.new
    $alumni.store(name,self)
  end
 
  def numFriend
    @friend.length
  end
 
  def isFriend(name)
    #check if is already a friend before adding
    #return value: true(isFriend), false(notFriend)
    if @friend.include?(name)
      true
    else
      false
    end
  end
 
  def listFriend
    return @friend
  end
 
  def printFriend
  #this is the travers function can be used to list friends in total depth.
  #bug: it will create a dead loop in case of n1 -> n2 -> n3 -> n1
 
    @friend.each do |name|
      print name + " -> "
      Lib.getAlumnusByName(name).printFriend.each {|x| puts "    "+x.to_s, ", "}
      puts "; "
 
    end
 
  end
 
  def addFriend(name)
    #add friend by name
    #1. [check] to see if the name exists
    #1.1 if so, [get the id], then add array{@id,name} to the $alumni
    #1.2 if not, create an alumnus, then add array{@id, name} to the $alumni
    if isFriend(name) || @name==name  #if name is self or already, do not do anything
      puts(name +" is already a friend or yourself!")
    else  #name is not self or already a friend, now we can add it to @friend
      if !Lib.isAlumnus(name) #if name is not alumnus, create silently new alumnus using name
        Alumnus.new(name)
      end
      @friend << name#add name to @friend
      puts(name +" is now your friend!")#new friend added
    end
  end
end
 
 
option=0
while option != "q"
  puts "#######################################"
  puts "1.Create new alumnus"
  puts "2.Find alumnus by name"
  puts "3.Add friend to current alumnus"
  puts "4.List friends of current alumnus"
  puts "5.List all alumnus"
  puts "#######################################"
  puts " "
  print "Choose an option from the list: "
  option = gets
  option.chomp!
 
  case option
    when "1" then
      print "1.Enter new name please: "
      name=gets
      name.chomp!
      if !Lib.isAlumnus(name)
        a1=Alumnus.new(name)
        puts "Alumnus '"+name+"' created!"
      else
        a1=Lib.getAlumnusByName(name)
        puts "'"+name+"' is already alumnus"
      end
    when "2" then
      print "2.Look for name: "
      name=gets
      name.chomp!
      if Lib.isAlumnus(name)
        a1=Lib.getAlumnusByName(name)
        puts "'"+name+"' is already alumnus"
        puts "'"+name+"' has "+a1.numFriend.to_s+" friend(s)."
      else
        puts "No such alumnus!"
      end
    when "3" then
      if !(a1.nil?)
        print "3. Enter friend's name please: "
        name=gets
        name.chomp!
        a1.addFriend(name)
        puts "'"+a1.getName+"' has "+a1.numFriend.to_s+" friend(s)."
      else
        puts "Find a valid alumnus or create one before adding friend!"
      end
    when "4" then
      j=0
      if !(a1.nil?) 
        if a1.numFriend>0
          for i in a1.listFriend
            puts "#"+i+"# direct friend"
            puts Lib.getAlumnusByName(i).listFriend
            j+=Lib.getAlumnusByName(i).numFriend
          end
        end
        puts "'"+a1.getName+"' has "+a1.numFriend.to_s+" direct friend(s) and "+j.to_s+" networked friend(s)."
      else
        puts "Find a valid alumnus or create one before adding friend!"
      end
    when "5" then
      puts $alumni.keys
      i=$alumni.length
 
      if i==1 
        puts "There is "+i.to_s+" alumnus."
      elsif i>1 
        puts "There are "+i.to_s+" alumnus."
      else
        puts "No alumnus."
      end 
    when "q" then
      puts "#######"
      puts "Goodbye"
      puts "#######"
    else
      a1.printFriend
      puts "Wrong option!"
      puts " "
  end
end