2013년 10월 21일 월요일

JAVA LINKED LIST 전화번호부(순환연결리스트) 예제

JAVA LINKED LIST 전화번호부(순환연결리스트) 예제

//별도의 헤더노드를 따로 두지 않고 시작노드만 참조하고 있는 예제
class ChainNode  {             
private PersonalData element;          //Node안에 저장된 item(Object)
private ChainNode next;                  //다음  Node를 가리키는 Reference

ChainNode() {}   
    ChainNode(PersonalData newElement) {
element = newElement;
next = null;
    }

    ChainNode(PersonalData newElement, ChainNode nextNode) {
element = newElement;
next = nextNode;
    }
 
    public void setElement(PersonalData newItem) {
element = newItem;
    }

    public PersonalData getElement() {
return element;
    }

    public void setNext(ChainNode nextNode) {
next = nextNode;
    }

    public ChainNode getNext() {
return next;
    }
}


class PersonalData {
    String name;
    String number;
   
    public PersonalData(String name, String number){
      this.name = name;
      this.number = number;     
    }
       
    public String getName() {
      return name;
    }

    public String getNumber() {
      return number; 
    }   
public void setNumber(String number) {
      this.number = number;
    }
   
    public boolean equals(Object o){     
      return name.equals(((PersonalData)o).getName());
    }
public String toString(){
      return name+"씨의 전화번호는" +number +" 입니다";
    }
}



//원형리스트를 이용한 전화번호부
//headerNode를 별도로 만들지 않고, 
// 시작노드를 headerNode로 지칭
public class PersonalDataManager {
    // The Node of the list
    private ChainNode headerNode;         

public void add(PersonalData element) {
        ChainNode tn = new ChainNode();
        tn.setElement(element);
//맨처음 insert되는 경우
if (headerNode == null) {
            tn.setNext(tn);
            headerNode = tn;
        } else {                         
    //headerNode가 가리키는것 이전까지 찾는다.
ChainNode p = findPrev(headerNode.getElement());
            tn.setNext(headerNode);
            p.setNext(tn);
        }
    }

public void change(String name, String tel)  {
PersonalData p = search(name);
if (p != null){
p.setNumber(tel);
}
}

public PersonalData search(String name)  {
        ChainNode p = headerNode;
do {
p = p.getNext();
if (p.getElement().getName().equals(name)){
return p.getElement();
}
} while (p != headerNode);
System.out.println("data not found...");
return null;
}

    //주어진 data노드의 이전노드를 Return
    private ChainNode findPrev(PersonalData element) {
headerNode.setElement(element);
        ChainNode p = headerNode;
        if (p == null)
            throw new IllegalArgumentException();
        do {
if (p.getNext().getElement().getName().equals(element.getName())) return p;
            p = p.getNext();
        } while (p != headerNode);
        throw new IllegalArgumentException();
    }

public synchronized void remove(String name) {
PersonalData element = search(name);
        ChainNode prev = findPrev(element);
ChainNode p = prev.getNext();

        if (p == p.getNext()) {  // Last Object on the list
headerNode = null;
 return;
}
prev.setNext(p.getNext());
//맨앞의 노드가 지워지는 경우엔 headerNode를 다시 set
if (headerNode == p) headerNode = p.getNext();
    }

public void printAll() {
ChainNode p = headerNode;
        if (p == null)  throw new IllegalArgumentException();
System.out.println("----- 전화번호부 리스트 -----");
        do {
System.out.println(p.getElement());
            p = p.getNext();
        } while (p != headerNode);
}
}



class TelephonebookMain {
    public static void main(String[] args) {
        PersonalDataManager manager = new PersonalDataManager();
        manager.add(new PersonalData("aaa", "333-3333"));
        manager.add(new PersonalData("bbb", "444-4444"));
        manager.add(new PersonalData("ccc", "555-5555"));
manager.add(new PersonalData("ddd", "666-7777"));
       
        //변경을 적용
        print(manager.search("bbb"));
        manager.change("ccc","777-7777");
        print(manager.search("ccc")); 
        manager.remove("aaa");     

manager.printAll();
    }
    public static void print(PersonalData p){
        System.out.println(p);       
    }
}

---------------------------------------------------

//헤드노드를 별도로 두는 경우의 예제
public class PersonalDataManager {
    // The Node of the list
    private ChainNode headerNode;         
public PersonalDataManager() {
headerNode = new ChainNode();
        headerNode.setNext(headerNode);
}

public void add(PersonalData element) {
        ChainNode tn = new ChainNode();
        tn.setElement(element);
//맨처음 insert되는 경우
if (headerNode.getNext() == headerNode) {
            tn.setNext(headerNode);
            headerNode.setNext(tn);
        } else {                         
    //headerNode가 가리키는것 이전까지 찾는다.
//headerNode.setElement(element);
ChainNode p = findPrev(element);
            tn.setNext(headerNode);
            p.setNext(tn);
        }
    }

public void change(String name, String tel)  {
PersonalData p = search(name);
if (p != null){
p.setNumber(tel);
}
}

public PersonalData search(String name)  {
        ChainNode p = headerNode;
do {
p = p.getNext();
if (p.getElement().getName().equals(name)){
return p.getElement();
}
} while (p != headerNode);
System.out.println("data not found...");
return null;
}

    //주어진 data노드의 이전노드를 Return
    private ChainNode findPrev(PersonalData element) {
headerNode.setElement(element);
        ChainNode p = headerNode;
        if (p == null)
            throw new IllegalArgumentException();
        do {
if (p.getNext().getElement().getName().equals(element.getName())) return p;
            p = p.getNext();
        } while (p != headerNode);
        throw new IllegalArgumentException();
    }

public synchronized void remove(String name) {
PersonalData element = search(name);
        ChainNode prev = findPrev(element);
ChainNode p = prev.getNext();
        if (prev.getElement().getName().equals(p.getElement().getName()) && p.getNext() == headerNode) {
headerNode.setNext(headerNode);
headerNode.setElement(null);
return;
        }
prev.setNext(p.getNext());
    }

public void printAll() {
ChainNode p = headerNode.getNext();
        if (p == null)  throw new IllegalArgumentException();
System.out.println("----- 전화번호부 리스트 -----");
        do {
System.out.println(p.getElement());
            p = p.getNext();
        } while (p != headerNode);
System.out.println("");
}
}


댓글 없음:

댓글 쓰기