U E D R , A S I H C RSS

Data Structure/List



1. ๋ฆฌ์ŠคํŠธ


  • ๋ฆฌ์ŠคํŠธ๋ž€ ๋ฌด์—‡์ธ๊ณ  ํ•˜๋‹ˆ... ์ €์žฅํ•˜๊ณ  ์‹ถ์€ ๋ฐ์ดํ„ฐ์™€ ๋‹ค์Œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๋ฅดํ‚ค๋Š” ํฌ์ธํ„ฐ๋ฅผ ๊ตฌ์กฐ์ฒด๋กœ ๋ฌถ์€ ๋…ธ๋“œ๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ํ•ด์„œ ๋ง‰~ ์—ฐ๊ฒฐ์‹œ์ผœ์ค€ ๊ฒƒ์ด๋‹ค.

~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 ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

2. ์ž๋ฐ”๋กœ ์ง  ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ(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<nSequence;i++)
			pTemp=pTemp.pNext;

		pNew.pNext=pTemp.pNext;		
		pTemp.pNext=pNew;
			
		nNumber++;
	}

	public boolean deleteNode(int nSequence)
	{
		if(nNumber<nSequence)
		{
			System.out.println("์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์–‘์„ ์ดˆ๊ณผํ•˜๋Š” ์ธ๋ฑ์Šค์ž…๋‹ˆ๋‹ค!");
			return false;
		}

		Node pTemp=new Node(0);
		Node pTemp2=new Node(0);
		pTemp=pHead;

		for(int i=0;i<nSequence-1;i++)
			pTemp=pTemp.pNext;

		pTemp2=pTemp.pNext;
		pTemp.pNext=pTemp2.pNext;
	
		nNumber--;
	
		return true;
	}

	public void showData()
	{
		Node pTemp=new Node(0);
		pTemp=pHead;
		int data;

		if(nNumber==0)
			System.out.println("์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค!");
		
		for(int i=0;i<nNumber;i++)
		{
			pTemp=pTemp.pNext;
			data=pTemp.getData();
			System.out.println(data);
		}
	}

	public void showMenu()
	{
		System.out.println("1. Add");
		System.out.println("2. Delete");
		System.out.println("3. Show");	
		System.out.println("4. End");
		System.out.print("Select the Menu : ");
	}

	public static void main(String args[])
	{
		MyLinkedList ll=new MyLinkedList();
                  /// ์ด๋ถ€๋ถ„์— ๋ฉ”๋‰ด๋ฅผ ๋„ฃ๋“  ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํ•˜๋“  ๋งˆ์Œ๋Œ€๋กœ..
	}
}
  • ๋ญ”๊ฐ€ ๊ต‰์žฅํžˆ ์ด์ƒํ•˜๊ตฐ์š”..; ์ œ๊ฐ€ ๋ด๋„..;; ๊ต‰์žฅํžˆ ์กฐ์žกํ•˜๊ณ  ๊ต‰์žฅํžˆ ํ—ˆ์ ‘ํ•œ.. ๊ทธ๋Ÿฐ ์ด์ƒํ•œ ์ฝ”๋“œ ๊ฐ™์Šต๋‹ˆ๋‹ค.; ์ž๋ฐ”๋Š” ์ฒจ์ด๋ผ์„œ ๊ทธ๋Ÿฐ๊ฐ€..;
  • LinkedList๊ฐ€ ์ข…๋‹จ ๋ถ€๋ถ„์—์„œ๋งŒ ์ถ”๊ฐ€,์‚ญ์ œ๊ฐ€ ๋˜๋Š”๊ฒŒ ์•„๋‹Œ ์•„๋ฌด๋ฐ์„œ๋‚˜ ๋˜์•ผ ํ•˜๋”๊ตฐ์—ฌ. ๊ทธ๋ž˜์„œ ๊ทธ๊ฑธ ์–ด๋–ป๊ฒŒ ์ •ํ•ด์ค„๊นŒ ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€ ๋ฐ์ดํ„ฐ์˜ ์ˆœ์„œ๋กœ ํ•˜๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

= ์ž๋ฐ”๋กœ ์ง  ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ..2 (๋ˆ„๊ฐ€ ํ•œ๊ฑธ๊นŒ) ์ƒํ˜‘์ธ๊ฐ€?=
~cpp 

์†Œ๋“œ ๋‹ค ์ ์œผ๋ฉด ์•„๋ฌด๋„ ์•ˆ๋ณผ๊ฑฐ ๊ฐ™์•„์„œ.. 

์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ฐœ๋žต์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋งŒ ์ ๊ฒ ์Šต๋‹ˆ๋‹ค.

์ œ๊ฐ€ ์ž๋ฐ”๋กœ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ ์งค๋•Œ ์ œ์ผ ๊ณ ๋ฏผํ•œ ์ ์ด ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ• ๋•Œ๋งˆ๋‹ค

์ „์ฒด ๋…ธ๋“œ์˜ ํฌ๊ธฐ๊ฐ€ ๋ฐ”๋€Œ๋Š” ์ ์„ ๊ณ ๋ฏผ ๋งŽ์ด ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ํ•œ๊ฒƒ์ด ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ• ๋•Œ๋งˆ๋‹ค ์ „์ฒด ๋…ธ๋“œ๋ฅผ ๋‹ค์‹œ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

(์ž๋ฐ”์˜ Vector ํด๋ž˜์Šค์—์„œ ์ด๋ ‡๊ฒŒ ํ–ˆ๋‹ค๊ณ  ์–ผํ• ๋“ฃ์–ด์„œ...)
===> ๊ทธ ์ž‘์—…์ด ์•„๋ž˜์— ์žˆ์Šต๋‹ˆ๋‹ค.
    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<tempNode.length-1 && i<coordi;i++)  //tempNode์— m_Node๋ฅผ ์šฐ์„  coordi๋ฒˆ์งธ(0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ) ์ „์˜ ์ž๋ฆฌ
            tempNode[i] = m_Node[i];   //๊นŒ์ง€ ๋ณต์‚ฌ ํ•œ๋‹ค.
       Node tem = new Node();  //์ž„์‹œ ๋…ธ๋“œ ์ƒ์„ฑ
       tem.item = in;
       tem.next =  m_Node[coordi];  //๋‚€ ๊ณณ์— ์›๋ž˜ ์žˆ์—ˆ๋˜ ์ž๋ฃŒ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค. 
       tempNode[coordi] = tem;
       tempNode[coordi-1].next = tempNode[coordi];  //๋‚€ ๊ณณ์˜ ๋ฐ”๋กœ ์•ž์— ์žˆ๋Š” ์ž๋ฃŒ๊ฐ€ ์ฒจ๊ฐ€ํ•œ ์ž๋ฃŒ๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ํ•œ๋‹ค.
       for(int j = coordi+1; j<tempNode.length-1;j++)
              tempNode[j] = m_Node[j-1];
        m_Node = new Node[tempNode.length];  // m_Node์˜ ํฌ๊ธฐ๋ฅผ ๋Š˜๋ฆฐํ›„ tempNode๋ฅผ ๋„ฃ๋Š”๋‹ค.
        for(int i=0;i<tempNode.length;i++)  // m_Node ์— tempNode๋ฅผ ๋ณต์‚ฌํ•œ๋‹ค.
             m_Node[i] = tempNode[i];
        return true;                 
    }
//////////////////////////

//๋…ธ๋“œ ํด๋ž˜์Šค ๋ชจ์Šต๊ณผ ์ธํ„ฐํŽ˜์ด์Šค
class Node {            //Node ํด๋ž˜์Šค
    public int item;
    public Node next;
}
void Add_ToFront(int n)
void Add_ToRear(int n) 
boolean Add_ToSpecial(int coordi, int in)
boolean IsEmpty()
boolean Delete_Front() 
boolean Delete_Rear()
boolean Delete_Special(int coordi)
void PrintAll() 



Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:05
Processing time 0.0059 sec