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("");
}
}
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("");
}
}
댓글 없음:
댓글 쓰기