<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=DataStructure%2FList</id>
	<title>DataStructure/List - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=DataStructure%2FList"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=DataStructure/List&amp;action=history"/>
	<updated>2026-05-15T06:21:14Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=DataStructure/List&amp;diff=31155&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 05:23, 7 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=DataStructure/List&amp;diff=31155&amp;oldid=prev"/>
		<updated>2021-02-07T05:23:05Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= 리스트 =&lt;br /&gt;
&lt;br /&gt;
* 리스트란 무엇인고 하니... 저장하고 싶은 데이터와 다음 데이터를 가르키는 포인터를 구조체로 묶은 노드를 기본으로 해서 막~ 연결시켜준 것이다.&lt;br /&gt;
 struct Node    // 제가 c문법을 잘 모릅니다.. 책에서는 typedef인가? 이상한걸 쓰더군요.&lt;br /&gt;
 {&lt;br /&gt;
     int lalala;    // 넣고 싶은 데이터&lt;br /&gt;
     Node* Next_ptr;   // 다음 데이터를 가르키는 포인터&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
c 문법으로 하면.&lt;br /&gt;
 typedef struct {&lt;br /&gt;
 	int data;&lt;br /&gt;
 	Node * link;&lt;br /&gt;
 } Node;&lt;br /&gt;
&lt;br /&gt;
* 리스트를 사용하는 간단한 예&lt;br /&gt;
 ...&lt;br /&gt;
 Node* kkk=new Node;   // 동적 생성&lt;br /&gt;
 kkk-&amp;amp;gt;lalala=100;      // kkk의 멤버 lalala에 100을 넣음.&lt;br /&gt;
 Node* hhh=new Node;   // 새롭게 동적 생성&lt;br /&gt;
 kkk-&amp;amp;gt;Next_ptr=hhh;    // kkk의 멤버 Next_ptr이 다음 노드인 hhh를 가르키게 함&lt;br /&gt;
 hhh-&amp;amp;gt;lalala=50;       // hhh에 데이터 넣음&lt;br /&gt;
 hhh-&amp;amp;gt;Next_ptr=NULL;   // hhh뒤에 아무것도 없으니 다음 노드를 가르키는 포인터를 NULL로 설정함&lt;br /&gt;
 ...&lt;br /&gt;
 ...&lt;br /&gt;
 delete kkk;           // new로 한건 꼭 delete로 지워주자&lt;br /&gt;
 delete hhh;&lt;br /&gt;
&lt;br /&gt;
* 위와 같이 다음 또는 먼저번 노드를 가르키는 포인터가 하나만 있는 것을 Single Linked List라고 한다.&lt;br /&gt;
* 반면에 둘 다 있는 것을 Double Linked List라 한다.&lt;br /&gt;
* Single Linked List에서는 한 쪽으로만 이동이 가능하기 때문에 멀리 있는 노드를 찾아가는데에 시간이 좀 오래걸린다.&lt;br /&gt;
* 이를 보완하기 위해 나온 것이 Double Linked List이다.&lt;br /&gt;
* Double Linked List에서는 맨 마지막 노드의 다음 노드가 NULL이 아닌 맨 처음 노드를 가르킨다.&lt;br /&gt;
* 마찬가지로 맨 처음 노드의 앞 노드는 맨 마지막 노드가 된다.&lt;br /&gt;
* 결론적으로 Single은 체인모양 Double은 고리모양이 된다.&lt;br /&gt;
&lt;br /&gt;
* Double Linked List를 사용한 간단한 예(3개의 노드를 예로 듬)&lt;br /&gt;
 struct Node&lt;br /&gt;
 {&lt;br /&gt;
     int lalala;&lt;br /&gt;
     Node* Next_ptr;&lt;br /&gt;
     Node* Prev_ptr;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 Node* Head=new Node; // 1 노드 동적 생성&lt;br /&gt;
 Node* Mid=new Node;  // 2 노드 동적 생성&lt;br /&gt;
 Node* Tail=new Node; // 3 노드 동적 생성&lt;br /&gt;
 Head-&amp;amp;gt;Next_ptr=Mid;  // 1 노드의 다음 노드는 2노드&lt;br /&gt;
 Mid-&amp;amp;gt;Next_ptr=Tail;  // 2 노드의 다음 노드는 3노드&lt;br /&gt;
 Tail-&amp;amp;gt;Next_ptr=Head; // 3 노드의 다음 노드는 1노드&lt;br /&gt;
 Head-&amp;amp;gt;Prev_ptr=Tail; // 1 노드의 앞 노드는 3노드&lt;br /&gt;
 Mid-&amp;amp;gt;Prev_ptr=Head;  // 2 노드의 앞 노드는 1노드&lt;br /&gt;
 Tail-&amp;amp;gt;Prev_ptr=Mid;  // 3 노드의 앞 노드는 2노드&lt;br /&gt;
 &lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* 장점 : 빠르다. (배열 같은 경우는 중간에 하나 지우고 나면 그 뒤에껄 다 앞으로 땡겨야 한다. 수행시간 절라 오래 걸린다.   하지만 리스트는 다음 노드를 가리키는 포인터만 바꿔주면 된다.)&lt;br /&gt;
* 단점 : 잘못된 포인터에 의한 Memory Leak 이 발생할 수 있다.&lt;br /&gt;
&lt;br /&gt;
= 자바로 짠 링크드 리스트(c++로 짜다가 갑자기 비졀씨가 뻗어서 다 날라갔음..--; 혈압올라서 숙제로 내려던 자바 링크드 리스트를 적겠음 =&lt;br /&gt;
 import java.io.*;&lt;br /&gt;
 &lt;br /&gt;
 class Node&lt;br /&gt;
 {&lt;br /&gt;
 	private int ndata;&lt;br /&gt;
 	public Node pNext=null;&lt;br /&gt;
 	&lt;br /&gt;
 	public Node(int ndata)&lt;br /&gt;
 	{&lt;br /&gt;
 		this.ndata=ndata;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	public int getData()&lt;br /&gt;
 	{&lt;br /&gt;
 		return ndata;&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class MyLinkedList&lt;br /&gt;
 {&lt;br /&gt;
 	private Node pHead;&lt;br /&gt;
 	private Node pTail=null;&lt;br /&gt;
 	private static int nNumber=0;&lt;br /&gt;
 &lt;br /&gt;
 	public MyLinkedList()&lt;br /&gt;
 	{&lt;br /&gt;
 		pHead=new Node(0);&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	public void insertNode(int ndata,int nSequence)&lt;br /&gt;
 	{&lt;br /&gt;
 		Node pNew=new Node(ndata);&lt;br /&gt;
 &lt;br /&gt;
 		if(nNumber==0)&lt;br /&gt;
 			pHead.pNext=pNew;&lt;br /&gt;
 &lt;br /&gt;
 		Node pTemp=new Node(0);&lt;br /&gt;
 		pTemp=pHead;&lt;br /&gt;
 		for(int i=0;i&amp;amp;lt;nSequence;i++)&lt;br /&gt;
 			pTemp=pTemp.pNext;&lt;br /&gt;
 &lt;br /&gt;
 		pNew.pNext=pTemp.pNext;		&lt;br /&gt;
 		pTemp.pNext=pNew;&lt;br /&gt;
 			&lt;br /&gt;
 		nNumber++;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	public boolean deleteNode(int nSequence)&lt;br /&gt;
 	{&lt;br /&gt;
 		if(nNumber&amp;amp;lt;nSequence)&lt;br /&gt;
 		{&lt;br /&gt;
 			System.out.println(&amp;quot;저장된 데이터양을 초과하는 인덱스입니다!&amp;quot;);&lt;br /&gt;
 			return false;&lt;br /&gt;
 		}&lt;br /&gt;
 &lt;br /&gt;
 		Node pTemp=new Node(0);&lt;br /&gt;
 		Node pTemp2=new Node(0);&lt;br /&gt;
 		pTemp=pHead;&lt;br /&gt;
 &lt;br /&gt;
 		for(int i=0;i&amp;amp;lt;nSequence-1;i++)&lt;br /&gt;
 			pTemp=pTemp.pNext;&lt;br /&gt;
 &lt;br /&gt;
 		pTemp2=pTemp.pNext;&lt;br /&gt;
 		pTemp.pNext=pTemp2.pNext;&lt;br /&gt;
 	&lt;br /&gt;
 		nNumber--;&lt;br /&gt;
 	&lt;br /&gt;
 		return true;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	public void showData()&lt;br /&gt;
 	{&lt;br /&gt;
 		Node pTemp=new Node(0);&lt;br /&gt;
 		pTemp=pHead;&lt;br /&gt;
 		int data;&lt;br /&gt;
 &lt;br /&gt;
 		if(nNumber==0)&lt;br /&gt;
 			System.out.println(&amp;quot;저장된 데이터가 없습니다!&amp;quot;);&lt;br /&gt;
 		&lt;br /&gt;
 		for(int i=0;i&amp;amp;lt;nNumber;i++)&lt;br /&gt;
 		{&lt;br /&gt;
 			pTemp=pTemp.pNext;&lt;br /&gt;
 			data=pTemp.getData();&lt;br /&gt;
 			System.out.println(data);&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	public void showMenu()&lt;br /&gt;
 	{&lt;br /&gt;
 		System.out.println(&amp;quot;1. Add&amp;quot;);&lt;br /&gt;
 		System.out.println(&amp;quot;2. Delete&amp;quot;);&lt;br /&gt;
 		System.out.println(&amp;quot;3. Show&amp;quot;);	&lt;br /&gt;
 		System.out.println(&amp;quot;4. End&amp;quot;);&lt;br /&gt;
 		System.out.print(&amp;quot;Select the Menu : &amp;quot;);&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	public static void main(String args[])&lt;br /&gt;
 	{&lt;br /&gt;
 		MyLinkedList ll=new MyLinkedList();&lt;br /&gt;
                   /// 이부분에 메뉴를 넣든 함수 호출을 하든 마음대로..&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
* 뭔가 굉장히 이상하군요..--; 제가 봐도..--;; 굉장히 조잡하고 굉장히 허접한.. 그런 이상한 코드 같습니다.--; 자바는 첨이라서 그런가..--;&lt;br /&gt;
* LinkedList가 종단 부분에서만 추가,삭제가 되는게 아닌 아무데서나 되야 하더군여. 그래서 그걸 어떻게 정해줄까 고민하다가 데이터의 순서로 하기로 했습니다.&lt;br /&gt;
&lt;br /&gt;
= 자바로 짠 링크드 리스트..2 (누가 한걸까) 상협인가?=&lt;br /&gt;
 &lt;br /&gt;
 소드 다 적으면 아무도 안볼거 같아서.. &lt;br /&gt;
 &lt;br /&gt;
 인터페이스와 개략적인 알고리즘만 적겠습니다.&lt;br /&gt;
 &lt;br /&gt;
 제가 자바로 링크드 리스트 짤때 제일 고민한 점이 노드를 추가할때마다&lt;br /&gt;
 &lt;br /&gt;
 전체 노드의 크기가 바뀌는 점을 고민 많이 했습니다.&lt;br /&gt;
 &lt;br /&gt;
 그래서 한것이 노드를 추가할때마다 전체 노드를 다시 만드는 것이었습니다.&lt;br /&gt;
 &lt;br /&gt;
 (자바의 Vector 클래스에서 이렇게 했다고 얼핏 듣어서...)&lt;br /&gt;
 ===&amp;amp;gt; 그 작업이 아래에 있습니다.&lt;br /&gt;
     boolean Add_ToSpecial(int coordi, int in) //특정한 위치에 자료를 저장하는 메소드&lt;br /&gt;
     {&lt;br /&gt;
        if(coordi &amp;amp;lt;0 || coordi &amp;amp;gt;= m_Node.length)  //좌표는 0부터 시작됨, 입력 위치가 해당 범위를 벋어날 경우&lt;br /&gt;
             return false;&lt;br /&gt;
        Node tempNode[] = new Node[m_Node.length+1]; //m_Node에 하나의 자료를 더 넣기 위해서 이보다 &lt;br /&gt;
                                                          //하나의 공간이 더 많은 임시 배열을 생성한다.&lt;br /&gt;
         for(int i=0;i&amp;amp;lt;tempNode.length-1 &amp;amp;amp;&amp;amp;amp; i&amp;amp;lt;coordi;i++)  //tempNode에 m_Node를 우선 coordi번째(0부터 시작해서) 전의 자리&lt;br /&gt;
             tempNode[i] = m_Node[i];   //까지 복사 한다.&lt;br /&gt;
        Node tem = new Node();  //임시 노드 생성&lt;br /&gt;
        tem.item = in;&lt;br /&gt;
        tem.next =  m_Node[coordi];  //낀 곳에 원래 있었던 자료를 참조한다. &lt;br /&gt;
        tempNode[coordi] = tem;&lt;br /&gt;
        tempNode[coordi-1].next = tempNode[coordi];  //낀 곳의 바로 앞에 있는 자료가 첨가한 자료를 참조하게 한다.&lt;br /&gt;
        for(int j = coordi+1; j&amp;amp;lt;tempNode.length-1;j++)&lt;br /&gt;
               tempNode[j] = m_Node[j-1];&lt;br /&gt;
         m_Node = new Node[tempNode.length];  // m_Node의 크기를 늘린후 tempNode를 넣는다.&lt;br /&gt;
         for(int i=0;i&amp;amp;lt;tempNode.length;i++)  // m_Node 에 tempNode를 복사한다.&lt;br /&gt;
              m_Node[i] = tempNode[i];&lt;br /&gt;
         return true;                 &lt;br /&gt;
     }&lt;br /&gt;
 //////////////////////////&lt;br /&gt;
 &lt;br /&gt;
 //노드 클래스 모습과 인터페이스&lt;br /&gt;
 class Node {            //Node 클래스&lt;br /&gt;
     public int item;&lt;br /&gt;
     public Node next;&lt;br /&gt;
 }&lt;br /&gt;
 void Add_ToFront(int n)&lt;br /&gt;
 void Add_ToRear(int n) &lt;br /&gt;
 boolean Add_ToSpecial(int coordi, int in)&lt;br /&gt;
 boolean IsEmpty()&lt;br /&gt;
 boolean Delete_Front() &lt;br /&gt;
 boolean Delete_Rear()&lt;br /&gt;
 boolean Delete_Special(int coordi)&lt;br /&gt;
 void PrintAll() &lt;br /&gt;
----&lt;br /&gt;
[[DataStructure]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>