[[TableOfContents]] = 리스트 = * 리스트란 무엇인고 하니... 저장하고 싶은 데이터와 다음 데이터를 가르키는 포인터를 구조체로 묶은 노드를 기본으로 해서 막~ 연결시켜준 것이다. {{{~cpp struct Node // 제가 c문법을 잘 모릅니다.. 책에서는 typedef인가? 이상한걸 쓰더군요. { int lalala; // 넣고 싶은 데이터 Node* Next_ptr; // 다음 데이터를 가르키는 포인터 }; }}} c 문법으로 하면. {{{~cpp typedef struct { int data; Node * link; } Node; }}} * 리스트를 사용하는 간단한 예 {{{~cpp ... Node* kkk=new Node; // 동적 생성 kkk->lalala=100; // kkk의 멤버 lalala에 100을 넣음. Node* hhh=new Node; // 새롭게 동적 생성 kkk->Next_ptr=hhh; // kkk의 멤버 Next_ptr이 다음 노드인 hhh를 가르키게 함 hhh->lalala=50; // hhh에 데이터 넣음 hhh->Next_ptr=NULL; // hhh뒤에 아무것도 없으니 다음 노드를 가르키는 포인터를 NULL로 설정함 ... ... delete kkk; // new로 한건 꼭 delete로 지워주자 delete hhh; }}} * 위와 같이 다음 또는 먼저번 노드를 가르키는 포인터가 하나만 있는 것을 Single Linked List라고 한다. * 반면에 둘 다 있는 것을 Double Linked List라 한다. * Single Linked List에서는 한 쪽으로만 이동이 가능하기 때문에 멀리 있는 노드를 찾아가는데에 시간이 좀 오래걸린다. * 이를 보완하기 위해 나온 것이 Double Linked List이다. * Double Linked List에서는 맨 마지막 노드의 다음 노드가 NULL이 아닌 맨 처음 노드를 가르킨다. * 마찬가지로 맨 처음 노드의 앞 노드는 맨 마지막 노드가 된다. * 결론적으로 Single은 체인모양 Double은 고리모양이 된다. * Double Linked List를 사용한 간단한 예(3개의 노드를 예로 듬) {{{~cpp struct Node { int lalala; Node* Next_ptr; Node* Prev_ptr; }; ... Node* Head=new Node; // 1 노드 동적 생성 Node* Mid=new Node; // 2 노드 동적 생성 Node* Tail=new Node; // 3 노드 동적 생성 Head->Next_ptr=Mid; // 1 노드의 다음 노드는 2노드 Mid->Next_ptr=Tail; // 2 노드의 다음 노드는 3노드 Tail->Next_ptr=Head; // 3 노드의 다음 노드는 1노드 Head->Prev_ptr=Tail; // 1 노드의 앞 노드는 3노드 Mid->Prev_ptr=Head; // 2 노드의 앞 노드는 1노드 Tail->Prev_ptr=Mid; // 3 노드의 앞 노드는 2노드 ... }}} * 장점 : 빠르다. (배열 같은 경우는 중간에 하나 지우고 나면 그 뒤에껄 다 앞으로 땡겨야 한다. 수행시간 절라 오래 걸린다. 하지만 리스트는 다음 노드를 가리키는 포인터만 바꿔주면 된다.) * 단점 : 잘못된 포인터에 의한 Memory Leak 이 발생할 수 있다. = 자바로 짠 링크드 리스트(c++로 짜다가 갑자기 비졀씨가 뻗어서 다 날라갔음..--; 혈압올라서 숙제로 내려던 자바 링크드 리스트를 적겠음 = {{{~cpp import java.io.*; class Node { private int ndata; public Node pNext=null; public Node(int ndata) { this.ndata=ndata; } public int getData() { return ndata; } } class MyLinkedList { private Node pHead; private Node pTail=null; private static int nNumber=0; public MyLinkedList() { pHead=new Node(0); } public void insertNode(int ndata,int nSequence) { Node pNew=new Node(ndata); if(nNumber==0) pHead.pNext=pNew; Node pTemp=new Node(0); pTemp=pHead; for(int i=0;i 그 작업이 아래에 있습니다. boolean Add_ToSpecial(int coordi, int in) //특정한 위치에 자료를 저장하는 메소드 { if(coordi <0 || coordi >= m_Node.length) //좌표는 0부터 시작됨, 입력 위치가 해당 범위를 벋어날 경우 return false; Node tempNode[] = new Node[m_Node.length+1]; //m_Node에 하나의 자료를 더 넣기 위해서 이보다 //하나의 공간이 더 많은 임시 배열을 생성한다. for(int i=0;i