19-2.¿¬°á ¸®½ºÆ®

19-2-°¡.´Ü¼ø ¿¬°á ¸®½ºÆ®

¾Õ Àý¿¡¼­ ¸¸µé¾ú´ø µ¿Àû ¹è¿­Àº °°Àº ŸÀÔÀÇ µ¥ÀÌÅÍ ¿©·¯ °³¸¦ ÀúÀåÇÒ ¼ö ÀÖ´Â °¡º¯ Å©±â¸¦ °¡Áö´Â ÀÚ·á ±¸Á¶ÀÌ´Ù. ÀÌ·± ¸ñÀûÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖ´Â ¶Ç ÇϳªÀÇ ÀÚ·á ±¸Á¶°¡ ¹Ù·Î ¿¬°á ¸®½ºÆ®(Linked List)Àε¥ ÀÌ Àý¿¡¼­´Â ¿¬°á ¸®½ºÆ®¿¡ ´ëÇØ °£´ÜÇÏ°Ô ¿¬±¸ÇØ º¸±â·Î ÇÏÀÚ. ¿¬°á ¸®½ºÆ®¿Í µ¿Àû ¹è¿­Àº ¿ÏÀüÈ÷ ¿ëµµ°¡ °°Àº ÀÚ·á ±¸Á¶·Î¼­ ¼­·Î ´ëü °¡´ÉÇÏÁö¸¸ ±¸¼º ¿ø¸®³ª °ü¸® ¹æ¹ýÀº ÁúÀûÀ¸·Î ´Ù¸£´Ù. ¿¬°á ¸®½ºÆ®ÀÇ ´ëü ÀÚ·á ±¸Á¶´Â ¹è¿­ÀÌ ¾Æ´Ï¶ó µ¿Àû ¹è¿­ÀÓÀ» ÁÖÀÇÇÏÀÚ.

¹è¿­ÀÇ °¡Àå Å« Ư¡Àº ¿ä¼ÒµéÀÌ ¹°¸®ÀûÀ¸·Î ÀÎÁ¢ÇÑ ¸Þ¸ð¸® ¿µ¿ª¿¡ ¿¬¼ÓÀûÀ¸·Î ¹èÄ¡µÈ´Ù´Â Á¡ÀÌ´Ù. ±×·¡¼­ ÷ÀÚ ¿¬»êÀÌ ºü¸£°í ¸Þ¸ð¸® ¿ä±¸·®ÀÌ ÀÛÀº ´ë½Å »ðÀÔ, »èÁ¦°¡ ¹ø°Å·Ó´Ù. ÷ÀÚ ¿¬»ê¹ýÀÌ ´Ü¼øÇØÁö±â À§Çؼ­´Â ¿ä¼Ò³¢¸® Ç×»ó ÀÎÁ¢ÇØ¾ß ÇÏ°í ±×·¡¼­ »ðÀÔ, »èÁ¦½Ã¿¡ ¿ä¼ÒµéÀ» ¹Ð°í ´ç±â°í ÇØ¾ß ÇÏ´Â °ÍÀÌ´Ù. ¿¬°á ¸®½ºÆ®´Â ¿ä¼ÒµéÀÌ ¸Þ¸ð¸®ÀÇ µµÃ³¿¡ Èð¾îÁ®¼­ Á¸ÀçÇÏÁö¸¸ ¸µÅ©¿¡ ÀÇÇØ ³í¸®ÀûÀ¸·Î ¿¬°áµÇ¾î ÀÖ¾î ¸µÅ©¸¦ µû¶ó°¡¸é ÀÌÀü, ÀÌÈÄ ¿ä¼ÒµéÀ» ãÀ» ¼ö ÀÖ´Ù. »ðÀÔ, »èÁ¦¸¦ ÇÒ ¶§µµ ¹°¸®ÀûÀÎ ¸Þ¸ð¸® À̵¿¾øÀÌ ¿ä¼Ò°£ÀÇ ¸µÅ©¸¸ Á¶ÀÛÇÏ¸é µÇ¹Ç·Î ¼Óµµ°¡ ºü¸£´Ù. ´ÙÀ½ ±×¸²À¸·Î ¹è¿­°ú ¿¬°á ¸®½ºÆ®°¡ ¸Þ¸ð¸®¿¡ ±¸ÇöµÈ ¸ð¾çÀ» ºñ±³ÇØ º¸ÀÚ.

¹è¿­ÀÇ ¿ä¼Ò Çϳª´Â ÀÚ½ÅÀÌ ±â¾ïÇÒ µ¥ÀÌÅͰª¸¸À» °¡Áö´Âµ¥ ºñÇØ ¿¬°á ¸®½ºÆ®ÀÇ ¿ä¼ÒÀÎ ³ëµå´Â µ¥ÀÌÅͿܿ¡ ¿¬°á »óÅ¿¡ ´ëÇÑ Á¤º¸ÀÎ ¸µÅ©¸¦ Ãß°¡·Î °¡Á®¾ß ÇÑ´Ù. Àڱ⠴ÙÀ½ÀÇ ¿ä¼Ò°¡ ´©±¸ÀÎÁö¸¦ ½º½º·Î ±â¾ïÇϰí ÀÖ¾î¾ß Èð¾îÁ® ÀÖ´Â ³ëµåµéÀÇ ¼ø¼­¸¦ ¾Ë ¼ö Àִµ¥ ÀÌ ¿¬°á Á¤º¸¸¦ ÀúÀåÇÏ´Â °ÍÀÌ ¹Ù·Î ¸µÅ©ÀÌ´Ù. ¸µÅ©¸¦ Çϳª¸¸ °¡Áö´Â °ÍÀ» ´Ü¼ø ¿¬°á ¸®½ºÆ®(Single Linked List)¶ó°í ÇÏ°í µÎ °³ÀÇ ¸µÅ©¸¦ °¡Áö´Â °ÍÀ» ÀÌÁß ¿¬°á ¸®½ºÆ®(Double Linked List)¶ó°í ÇÑ´Ù. ³ëµå¸¦ ±¸¼ºÇÏ´Â µ¥ÀÌÅÍ¿Í ¸µÅ©´Â ŸÀÔÀÌ ´Ù¸£±â ¶§¹®¿¡ ³ëµå´Â ÀÌÇü ŸÀÔÀÇ ÁýÇÕÀÎ ±¸Á¶Ã¼·Î Á¤ÀǵȴÙ.

 

struct Node

{

     int value;                // µ¥ÀÌÅÍ

     Node *next;           // ¸µÅ©

};

 

value¸â¹ö´Â ³ëµå°¡ ±â¾ïÇÏ´Â Á¤º¸ÀÇ ½ÇüÀÎ µ¥ÀÌÅÍÀÌ´Ù. ¹è¿­ ¿ä¼Ò ŸÀÔ¿¡ Á¦ÇÑÀÌ ¾ø´Â °Íó·³ ¿¬°á ¸®½ºÆ®°¡ ÀúÀåÇÏ´Â Á¤º¸ÀÇ Á¾·ù¿¡µµ Á¦ÇÑÀÌ ¾øÀ¸¹Ç·Î ³ëµåÀÇ µ¥ÀÌÅÍ´Â ÀÓÀÇ Å¸ÀÔ, ÀÓÀÇ °³¼ö·Î Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. ¿©·¯ °³ÀÇ º¯¼öµéÀ» ÇѲ¨¹ø¿¡ °¡Áú ¼öµµ ÀÖ°í Æ÷ÀÎÅͳª ¹è¿­ ¶Ç´Â ´Ù¸¥ ±¸Á¶Ã¼¸¦ ³ëµå¿¡ Æ÷ÇÔ½ÃŰ´Â °Íµµ ¹°·Ð °¡´ÉÇÏ´Ù. ¿¹Á¦¿¡¼­´Â ÆíÀÇ»ó Á¤¼ö°ª Çϳª¸¸À» ³ëµå¿¡ Æ÷ÇÔ½ÃÄ×´Ù.

next ¸â¹ö´Â ´ÙÀ½ ³ëµå¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ °¡Áö´Â ¸µÅ©ÀÌ´Ù. Node ±¸Á¶Ã¼¾È¿¡ ´Ù¸¥ Node ±¸Á¶Ã¼ÀÇ ¹øÁö Á¤º¸°¡ Æ÷ÇԵǾî Àִµ¥ Àڽſ¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¸â¹ö·Î °¡Áö´Â ÀÚ±â ÂüÁ¶ ±¸Á¶Ã¼À̹ǷΠũ±â°¡ ¹«ÇÑ´ë°¡ µÇÁö´Â ¾Ê´Â´Ù(13-2-¶ó ÂüÁ¶). ÀÌ Æ÷ÀÎÅͰ¡ °¡¸®Å°´Â °÷À» ã¾Æ°¡¸é ´ÙÀ½ ³ëµå°¡ ÀúÀåµÈ °÷À» ¾Ë ¼ö ÀÖÀ¸¸ç ¶Ç ´ÙÀ½ ³ëµåÀÇ ¸µÅ©¸¦ µû¶ó °¡¸é ±× ´ÙÀ½ ³ëµå¸¦ ¿¬¼ÓÀûÀ¸·Î ãÀ» ¼ö ÀÖ´Ù. ³ëµåµéÀÌ ¸µÅ©¸¦ ÅëÇØ ¼­·ÎÀÇ À§Ä¡¸¦ ±â¾ïÇÔÀ¸·Î½á ¹°¸®ÀûÀ¸·Î Èð¾îÁ® ÀÖ´õ¶óµµ ³í¸®ÀûÀ¸·Î´Â ÇÑ µ¢¾î¸®ÀÇ Á¤º¸°¡ µÉ ¼ö ÀÖ´Â °ÍÀÌ´Ù.

´Ü, ¾î¶² ³ëµå°¡ ¿¬°á ¸®½ºÆ®ÀÇ Ã¹ ¹øÂ° ³ëµåÀÎÁö´Â µû·Î ÀúÀåÇØ¾ß Çϴµ¥ ½ÃÀÛÁ¡À» ±â¾ïÇÏ´Â ³ëµå¸¦ ¸Ó¸®(head)¶ó°í ÇÑ´Ù. ÀÏ´Ü ¸Ó¸® ³ëµå¸¦ ¾Ë¾Æ¾ß ¿¬¼ÓÀûÀ¸·Î ´ÙÀ½ ³ëµå¸¦ ãÀ» ¼ö ÀÖÀ¸¹Ç·Î ¸Ó¸® ³ëµå´Â ¾ðÁ¦µçÁö ÂüÁ¶ÇÒ ¼ö ÀÖ´Â Àü¿ªº¯¼ö·Î ¼±¾ðÇÏ´Â °ÍÀÌ º¸ÅëÀÌ´Ù. ¸Ó¸®´Â ¿¬°á ¸®½ºÆ®ÀÇ ÁøÀÔÁ¡À̸ç Ç×»ó ¸Ó¸®ºÎÅÍ °Ë»öÀ» ½ÃÀÛÇϹǷΠ¿¬°á ¸®½ºÆ®ÀÇ ´ëÇ¥ ³ëµå¶ó°í ÇÒ ¼ö ÀÖ´Ù. ÀÌ¿¡ ºñÇØ µ¿Àû ¹è¿­Àº ÁøÀÔÁ¡À» °¡¸®Å°´Â Æ÷ÀÎÅÍ·Î ´ëÇ¥µÈ´Ù. ´ÙÀ½ ±×¸²Àº 1, 2, 3 ¼¼ °³ÀÇ ³ëµå¸¦ °¡Áö´Â ¿¬°á ¸®½ºÆ®°¡ ¸Þ¸ð¸®¿¡ ±¸ÇöµÈ ¸ð¾çÀÌ´Ù.

³ëµåµéÀÌ ¸Þ¸ð¸®»óÀÇ ÀÓÀÇ À§Ä¡¿¡ ºÒ±ÔÄ¢ÀûÀ¸·Î »ý¼ºµÈ´Ù´Â °ÍÀ» °­Á¶Çϱâ À§ÇØ ³ëµåÀÇ À§Ä¡µµ ºÒ±ÔÄ¢ÀûÀ¸·Î ±×·È´Ù. ÇÏÁö¸¸ ³ëµåÀÇ ¹°¸®ÀûÀÎ À§Ä¡°¡ ¾îµðÀΰ¡´Â ÀüÇô Áß¿äÇÏÁö ¾ÊÀ¸¸ç ½ÇÁ¦ ¹øÁö¿¡ »ó°ü¾øÀÌ ¸µÅ©¿¡ ÀÇÇØ ¼­·Î ³í¸®ÀûÀ¸·Î ¿¬°áµÇ¾î ÀÖÀ¸¹Ç·Î ÀÏÁ÷¼±À¸·Î ±×¸®´Â °ÍÀÌ º¸ÅëÀÌ´Ù. ¸Ó¸®´Â ³ëµå 1À» °¡¸®Å°°í ³ëµå1ÀÇ ¸µÅ©¸¦ µû¶ó°¡¸é ³ëµå 2°¡ ÀÖ°í ³ëµå 2 ´ÙÀ½¿¡ ³ëµå 3ÀÌ ÀÖ´Ù. ³ëµå 3ÀÇ ¸µÅ©´Â NULL·Î µÇ¾î Àִµ¥ ´ÙÀ½ ³ëµå°¡ ¾ø´Ù´Â °ÍÀº °÷ ¿¬°á ¸®½ºÆ®ÀÇ ³¡À̶ó´Â ¶æÀÌ´Ù.

´Ü¼ø ¿¬°á ¸®½ºÆ®·Î º¹¼ö °³ÀÇ Á¤¼öÇü µ¥ÀÌÅ͸¦ ÀúÀåÇÏ´Â ¿¹Á¦¸¦ ¸¸µé¾îº¸°í ºÐ¼®ÇØ º¸ÀÚ. ÃʱâÈ­, »ðÀÔ, »èÁ¦, ¼øÈ¸ µîÀÇ ±âº»ÀûÀÎ µ¿ÀÛÀ» Å×½ºÆ®Çϴµ¥ °£°á¼ºÀ» À§ÇØ ¸Þ¸ð¸® ÇÒ´ç ½ÇÆÐ¿¡ ´ëÇÑ ¿¡·¯ 󸮴 »ý·«Çß´Ù. 32ºñÆ® ȯ°æ¿¡¼­´Â ±»ÀÌ ¸Þ¸ð¸® ÇÒ´ç ¼º°ø ¿©ºÎ¸¦ Á¡°ËÇÏÁö ¾Ê¾Æµµ µÈ´Ù. ªÀº ¿¹Á¦ÀÌÁö¸¸ ¿¬°á ¸®½ºÆ®ÀÇ ±¸Á¶¿Í °ü¸® ¹æ¹ý µîÀ» ¿¬±¸ÇØ º¸±â¿¡´Â ÃæºÐÇÒ °ÍÀÌ´Ù.

 

¿¹ Á¦ : SingleList

#include <Turboc.h>

 

// ³ëµå ±¸Á¶Ã¼

struct Node

{

     int value;

     Node *next;

};

Node *head;

 

// ¿¬°á ¸®½ºÆ® ÃʱâÈ­ - ¸Ó¸®¸¦ ÇÒ´çÇÑ´Ù.

void InitList()

{

     head=(Node *)malloc(sizeof(Node));

     head->next=NULL;

}

 

// Target ´ÙÀ½¿¡ ³ëµå¸¦ »ðÀÔÇÑ´Ù.

Node *InsertNode(Node *Target,Node *aNode)

{

     Node *New;

 

     New=(Node *)malloc(sizeof(Node));

     *New=*aNode;

 

     New->next=Target->next;

     Target->next=New;

     return New;

}

 

// Target ´ÙÀ½ ³ëµå¸¦ »èÁ¦ÇÑ´Ù.

BOOL DeleteNode(Node *Target)

{

     Node *Del;

 

     Del=Target->next;

     if (Del==NULL) {

          return FALSE;

     }

     Target->next=Del->next;

     free(Del);

     return TRUE;

}

 

// ¿¬°á ¸®½ºÆ®ÀÇ ¸ðµç ³ëµå¿Í ¸Ó¸®¸¦ ÇØÁ¦ÇÑ´Ù.

void UnInitList()

{

     while (DeleteNode(head)) {;}

 

     free(head);

     head=NULL;

}

 

void main()

{

     int i;

     Node *Now,Temp;

 

     InitList();

 

     // ´Ù¼¸ °³ÀÇ ³ëµå »ðÀÔ

     Now=head;

     for (i=1;i<=5;i++) {

          Temp.value=i;

          Now=InsertNode(Now,&Temp);

     }

 

     // µÎ ¹øÂ° ³ëµå »èÁ¦

     DeleteNode(head->next);

 

     // ¼øÈ¸Çϸ鼭 Ãâ·Â

     for (Now=head->next;Now;Now=Now->next) {

          printf("%d\t",Now->value);

     }

     printf("\n");

 

     UnInitList();

}

 

Node ±¸Á¶Ã¼ Á¤ÀÇ¿Í ¿¬°á ¸®½ºÆ® °ü¸® ÇÔ¼ö°¡ main ÀÌÀü¿¡ ¸ðµÎ ÀÛ¼ºµÇ¾î ÀÖ´Ù. main¿¡¼­´Â ¿¬°á¸®½ºÆ®¸¦ ÃʱâÈ­Çϰí 1~5±îÁö ´Ù¼¸ °³ÀÇ ³ëµå¸¦ »ðÀÔÇÑ´Ù. ±×¸®°í µÎ ¹øÂ° ³ëµå¸¦ Á¦°ÅÇÑ ÈÄ ³²Àº ³ëµåµéÀ» ¼øÈ¸Çϸ鼭 Ãâ·ÂÇØ º¸¾Ò´Ù. °á°ú´Â 1, 3, 4, 5°¡ µÇ´Âµ¥ ¿¹Á¦ÀÇ °¢ ºÎºÐÀ» ¼ø¼­´ë·Î ºÐ¼®ÇØ º¸ÀÚ.

Node ±¸Á¶Ã¼

Node ±¸Á¶Ã¼´Â ¿¬°á ¸®½ºÆ®ÀÇ ÇÑ ¿ä¼ÒÀÎ ³ëµå¸¦ Á¤ÀÇÇÑ´Ù. ÀÌ ¿¹Á¦ÀÇ ¿¬°á ¸®½ºÆ®´Â Á¤¼ö¸¦ µ¥ÀÌÅÍ·Î °¡Áö¹Ç·Î Á¤¼öÇü º¯¼ö value¿Í ¸µÅ© next¸¸À» ¸â¹ö·Î °¡Áø´Ù. ´õ ¸¹Àº Á¤º¸¸¦ ÀúÀåÇÏ°í ½Í´Ù¸é ÇÊ¿äÇÑ ¸â¹ö¸¦ ¾ó¸¶µçÁö Ãß°¡ÇÒ ¼ö Àִµ¥ ¿¹¸¦ µé¾î ÁÖ¼Ò·ÏÀ̶ó¸é name, tel, addr µîÀÇ ¸â¹ö°¡ Æ÷Ç﵃ °ÍÀÌ°í ÆÄÀÏ¿¡ ´ëÇÑ Á¤º¸¶ó¸é path, date, size, attr µîÀÌ Æ÷Ç﵃ °ÍÀÌ´Ù.

NodeÇü Æ÷ÀÎÅÍ head´Â Àü¿ªÀ¸·Î ¼±¾ðµÇ¾î Àִµ¥ ÀÌ º¯¼ö°¡ ¿¬°á ¸®½ºÆ®ÀÇ ÁøÀÔÁ¡ÀÌ´Ù. ¼³»ç ¿¬°á ¸®½ºÆ®°¡ ºñ¾î ÀÖ´õ¶óµµ ¸Ó¸®´Â ¹Ýµå½Ã ÀÖ¾î¾ß ÇÏ¸ç ¶ÇÇÑ ÀûÀýÇÏ°Ô ÃʱâÈ­µÇ¾î¾ß ÇÑ´Ù. InitList ÇÔ¼ö´Â head¿¡ Node ±¸Á¶Ã¼¸¦ ÇÒ´çÇϸç ÃÖÃÊ ¸Ó¸® ³ëµå¸¸ Á¸ÀçÇϹǷΠheadÀÇ ¸µÅ©´Â NULL·Î ÃʱâÈ­µÈ´Ù.

headÀÇ ¸µÅ©(head->next)°¡ NULLÀ̶ó´Â °ÍÀº ¸Ó¸® ¿Ü¿¡ ½ÇÁ¦ µ¥ÀÌÅ͸¦ °¡Áö´Â ³ëµå´Â ¾ø´Ù´Â ¶æÀ̸ç ÀÌ´Â °ð ¿¬°á ¸®½ºÆ®°¡ ºñ¾î ÀÖ´Ù´Â °ÍÀ» Ç¥½ÃÇÑ´Ù. ¸Ó¸® ³ëµå´Â ½ÃÀÛ ³ëµåÀÇ ¹øÁö¸¸À» °¡Áö¹Ç·Î µ¥ÀÌÅÍ´Â »ç¿ëÇÏÁö ¾Ê´Â´Ù. main¿¡¼­ ¿¬°á ¸®½ºÆ®¸¦ »ç¿ëÇϱâ Àü¿¡ InitList¸¦ È£ÃâÇÏ¿© ÃʱâÈ­ÇßÀ¸¸ç ÀÌ »óÅ¿¡¼­ Àá½Ã ÈÄ¸é ¸Ó¸® µÚÂÊ¿¡ ³ëµåµéÀÌ Ãß°¡µÉ °ÍÀÌ´Ù.

³ëµåÀÇ »ðÀÔ

³ëµå´Â ÀڽŰú ¿¬°áµÈ ³ëµåÀÇ Á¤º¸¸¦ °¡Áö°í ÀÖÀ¸¹Ç·Î ¹°¸®ÀûÀÎ ¸Þ¸ð¸® À̵¿¾øÀÌ ¸µÅ©¸¸ Á¶ÀÛÇÏ¿© ¸®½ºÆ®ÀÇ Áß°£¿¡ »õ·Î¿î ³ëµå¸¦ ½±°Ô »ðÀÔÇÒ ¼ö ÀÖ´Ù. 1, 2, 3 ¼¼ °³ÀÇ ³ëµå°¡ ÀÖ´Â »óÅ¿¡¼­ ³ëµå 2´ÙÀ½¿¡ ³ëµå 4°¡ »ðÀԵǴ °¡Àå ÀϹÝÀûÀÎ °æ¿ì(µÎ ³ëµå »çÀÌ¿¡ »õ ³ëµå°¡ ³¢¾îµå´Â °æ¿ì)ÀÇ »ðÀÔ °úÁ¤À» ¿¬±¸ÇØ º¸ÀÚ.

¨ç Node ±¸Á¶Ã¼¸¦ »õ·Î ÇÒ´çÇÏ¿© New ³ëµå¸¦ ¸¸µé°í ÀÌ ³ëµåÀÇ value¿¡ 4¸¦ ´ëÀÔÇÑ´Ù. ³ëµå 4´Â ¸Þ¸ð¸®¿¡ »ý¼ºµÇ¾î Àֱ⸸ ÇÒ »ÓÀÌÁö ¾ÆÁ÷ ¸µÅ©·Î ¿¬°áµÇÁö ¾Ê¾ÒÀ¸¹Ç·Î ¿¬°á ¸®½ºÆ®¿¡ Æ÷ÇÔµÈ °ÍÀº ¾Æ´Ï´Ù. ³ëµå 4ÀÇ ¸µÅ©ÀÎ next´Â ÇöÀç ¾²·¹±â°ªÀ» °¡Áö°í ÀÖ´Â »óÅÂÀÌ´Ù.

¨è »õ·Î ¸¸µç ³ëµå 4ÀÇ ¸µÅ©¿¡ ³ëµå 3ÀÇ ¹øÁö¸¦ ´ëÀÔÇÏ¿©(New->next=Target->next) ³ëµå 4°¡ ³ëµå 3¾Õ¿¡ À§Ä¡Çϵµ·Ï ¿¬°áÇÑ´Ù. À̶§ ³ëµå 3ÀÇ ¹øÁö´Â ¹Ù·Î ¾Õ¿¡ ÀÖ´Â ³ëµå 2ÀÇ ¸µÅ©¿¡¼­ ±¸ÇÒ ¼ö Àִµ¥ ³ëµå 2ÀÇ °ªÀ» ¹Ù²Ù±â Àü¿¡ ¸ÕÀú Àоî¾ß ÇÑ´Ù. ¼ø¼­°¡ ¹Ù²î¸é ¾ÈµÈ´Ù. ¿©±â±îÁö ó¸®ÇÏ¸é ³ëµå 4°¡ ³ëµå 3¾Õ¿¡ ¿¬°áµÇ¾úÁö¸¸ ¾ÆÁ÷ ³ëµå 2 ´ÙÀ½¿¡ ¿¬°áµÇÁö´Â ¾Ê¾Ò´Ù.

¨é ³ëµå 2ÀÇ ¸µÅ©¿¡ ³ëµå 4¸¦ ´ëÀÔ(Target->next=New)ÇÏ¿© ³ëµå 4°¡ ³ëµå 2 ´ÙÀ½¿¡ À§Ä¡Çϵµ·Ï ¿¬°áÇÑ´Ù. ÀÌ·¸°Ô µÇ¸é ³ëµå 2¿Í ³ëµå 3ÀÇ ¿¬°áÀº ²÷¾îÁö¸ç ³ëµå 2¡æ³ëµå 4¡æ³ëµå 3 ¼øÀ¸·Î ¿¬°á »óŰ¡ Àç¼³Á¤µÇ¾î ³ëµå 4°¡ Áß°£¿¡ »ðÀԵȴÙ.

 

ÀÌ »ðÀÔ µ¿ÀÛÀ» ±¸ÇöÇÏ´Â ÇÔ¼ö°¡ ¹Ù·Î InsertNode ÇÔ¼öÀε¥ µÎ °³ÀÇ Àμö¸¦ ¹Þ¾ÆµéÀδÙ. Target Àμö´Â »ðÀÔÇϰíÀÚ ÇÏ´Â ³ëµåÀÇ ÀÌÀü ³ëµåÀ̸ç Target ´ÙÀ½¿¡ »õ ³ëµå¸¦ »ðÀÔÇÑ´Ù. ´Ü¼ø ¿¬°á ¸®½ºÆ®´Â ´ÙÀ½ ¸µÅ©¹Û¿¡ ¾øÀ¸¸ç ÀÌÀü ³ëµå¸¦ ¾Ë ¼ö ¾ø±â ¶§¹®¿¡ ƯÁ¤ ³ëµåÀÇ µÚÂÊÀ¸·Î¸¸ »õ ³ëµå¸¦ »ðÀÔÇÒ ¼ö ÀÖ´Ù. ƯÁ¤ ³ëµåÀÇ ¾ÕÂÊ¿¡ »ðÀÔÇÏ·Á¸é ÇÑ Ä­ ´õ ¾Õ¿¡ ÀÖ´Â ³ëµåÀÇ ¸µÅ©µµ º¯°æÇØ¾ß Çϴµ¥ ÀÌ ³ëµå¸¦ ±¸ÇÒ ¼ö ¾ø´Â °ÍÀÌ´Ù.

µÎ ¹øÂ° Àμö aNode´Â »ðÀÔ ´ë»óÀÌ µÇ´Â ³ëµåÀÇ µ¥ÀÌÅ͸¦ °¡Áö´Â Àӽà ³ëµåÀÌ´Ù. main¿¡¼­ Node ±¸Á¶Ã¼¸¦ ¸¸µé°í ÀÌ ±¸Á¶Ã¼ÀÇ value¿¡ ¿øÇÏ´Â °ªÀ» ä¿ö º¸³»¸ç InsertNode´Â aNode ÀÚü¸¦ New¿¡ ´ëÀÔÇÑ´Ù. value¸¸ Àü´ÞÇÒ ¼öµµ ÀÖÁö¸¸ ÀÌ·¸°Ô Çϸé Node ±¸Á¶Ã¼°¡ ¹Ù²ð ¶§¸¶´Ù InsertNode ÇÔ¼ö¸¦ ¼öÁ¤ÇØ¾ß ÇÏ´Â ¹ø°Å·Î¿òÀÌ ÀÖ¾î Àӽà ³ëµå¸¦ Àü´ÞÇÏ´Â ¹æ¹ýÀ» ¾´´Ù. ±¸Á¶Ã¼ ´ëÀÔÀº ¸Þ¸ð¸® º¹»çÀ̹ǷΠ¸â¹ö°¡ ´Ã¾î³ªµµ ¼öÁ¤ÇÒ Çʿ䰡 ¾ø´Ù.

InsertNode ÇÔ¼ö´Â ¹°¸®ÀûÀ¸·Î »õ ³ëµå¸¦ »ý¼ºÇÏ´Â ºÎºÐ°ú ³í¸®ÀûÀ¸·Î ¸µÅ©¸¦ ¿¬°áÇÏ´Â µÎ ºÎºÐÀ¸·Î ±¸¼ºµÇ¾î ÀÖ´Ù. ¸Þ¸ð¸®»ó¿¡ »õ·Î¿î ¸µÅ©¸¦ ¸¸µé°í »õ·Î ¸¸µé¾îÁø ³ëµå¿Í »ðÀ﵃ À§Ä¡ÀÇ ¾Õ, µÚ ³ëµåÀÇ ¸µÅ©¸¦ Á¶ÀÛÇÑ´Ù. ±×¸®°í »õ·Î ¸¸µé¾îÁø ³ëµåÀÇ Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÔÀ¸·Î½á ÀÌ ³ëµå ´ÙÀ½¿¡ ¿¬¼ÓÀûÀ¸·Î ´Ù¸¥ ³ëµå¸¦ »ðÀÔÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù.

 

Node *InsertNode(Node *Target,Node *aNode)

{

     Node *New;

 

     New=(Node *)malloc(sizeof(Node));          // ³ëµå »ý¼º. ±×¸²ÀÇ ¨ç¹ø °úÁ¤¿¡ ÇØ´ç

     *New=*aNode;

 

     New->next=Target->next;                    // µÚÂÊ ³ëµå¿Í ¿¬°á. ±×¸²ÀÇ ¨è¹ø °úÁ¤¿¡ ÇØ´ç

     Target->next=New;                         // ¾ÕÂÊ ³ëµå¿Í ¿¬°á. ±×¸²ÀÇ ¨é¹ø °úÁ¤¿¡ ÇØ´ç

     return New;

}

 

main ÇÔ¼ö¿¡¼­ ·çÇÁ¸¦ µ¹¸ç InsertNode¸¦ ´Ù¼¸ ¹ø È£ÃâÇϴµ¥ ÃÖÃÊ head¿¡¼­ºÎÅÍ »ðÀÔÀ» ½ÃÀÛÇÑ´Ù. ÀÌ °úÁ¤À» µû¶ó°¡ º¸ÀÚ.

ÃÖÃÊ ¸Ó¸®¸¸ ÀÖ´Â »óÅ¿¡¼­ ¸Ó¸® ´ÙÀ½¿¡ ³ëµå1À» »ðÀÔÇߴµ¥ ÀÌ °æ¿ì´Â Áß°£¿¡ ³¢¾îµå´Â °ÍÀÌ ¾Æ´Ï¶ó ³¡¿¡ Ãß°¡µÈ´Ù°í º¼ ¼ö ÀÖ´Ù. Ãß°¡µÇ´Â °æ¿ìµµ InsertNode ÇÔ¼öÀÇ Äڵ尡 ±×´ë·Î Àû¿ëµÇ´Âµ¥ ¸Ó¸®ÀÇ ¸µÅ©´Â »õ·Î ¸¸µç ³ëµå¸¦ °¡¸®Å°°í head ¸µÅ©¿¡ ÀúÀåµÇ¾î ÀÖ´ø NULLÀº »õ·Î ¸¸µç ³ëµå°¡ °¡Á®°¨À¸·Î½á ÀÌ ³ëµå°¡ ¸Ó¸® ´ë½Å ³¡ ³ëµå°¡ µÈ´Ù. ¸®½ºÆ®ÀÇ ³¡¿¡ Ãß°¡µÇ´Â °úÁ¤µµ Áß°£¿¡ »ðÀԵǴ ÀϹÝÀûÀÎ °æ¿ì¿Í °°Àº ¹æ¹ýÀ¸·Î ó¸®ÇÏ¸é µÈ´Ù.

InsertNode´Â »õ·Î Ãß°¡µÈ ³ëµåÀÇ Æ÷ÀÎÅ͸¦ ¸®ÅÏÇϴµ¥ ÀÌ Æ÷ÀÎÅ͸¦ ¹Þ¾Æ InsertNodeÀÇ Àμö·Î ´Ù½Ã Àü´ÞÇÏ¸é »õ ³ëµå µÚÂÊ¿¡ ³ëµåµéÀ» ¿¬¼ÓÀûÀ¸·Î Ãß°¡ÇÒ ¼ö ÀÖ´Ù. main¿¡¼­´Â InsertNode°¡ ¸®ÅÏÇÏ´Â Æ÷ÀÎÅ͸¦ Now·Î ´ëÀÔ ¹Þ¾Æ NowµÚÂÊ¿¡ °è¼Ó 2, 3, 4, 5¸¦ Ãß°¡Çß´Ù. ±×·¡¼­ ¿©±â±îÁö ½ÇÇàÇϸé headÀÌÇÏ ´Ù¼¸ °³ÀÇ ³ëµå°¡ ¸µÅ©·Î Á× ¿¬°áµÈ »óŰ¡ ¸¸µé¾îÁø´Ù. ³ëµå´Â ½ÇÇàÁß¿¡ ¸Þ¸ð¸®¸¦ µ¿ÀûÀ¸·Î ÇÒ´çÇÏ¿© »ý¼ºµÇ¹Ç·Î ¸Þ¸ð¸® ÇѰè±îÁö ¾ó¸¶µçÁö Ãß°¡ÇÒ ¼ö ÀÖ´Ù.

³ëµåÀÇ »èÁ¦

³ëµå¸¦ »èÁ¦ÇÏ´Â ¹æ¹ýµµ ¿ª½Ã ¸µÅ©¸¦ Á¶ÀÛÇÏ´Â °ÍÀÌ´Ù. DeleteNode ÇÔ¼ö´Â Àμö·Î ÁÖ¾îÁø Target ³ëµå ´ÙÀ½ÀÇ ³ëµå¸¦ »èÁ¦ÇÑ´Ù. ´Ü¼ø ¿¬°á ¸®½ºÆ®´Â ¾ÕÂÊ ³ëµå¸¦ ãÁö ¸øÇϹǷΠ³ëµå ÀÚü¸¦ »èÁ¦ÇÒ ¼ö´Â ¾ø°í ÁöÁ¤ÇÑ ³ëµåÀÇ µÚÂʸ¸ »èÁ¦ÇÒ ¼ö ÀÖ´Ù. ±×·¡¼­ »èÁ¦ÇϰíÀÚ ÇÏ´Â ³ëµåÀÇ ¾Õ ³ëµå¸¦ Àμö·Î Àü´ÞÇØ¾ß ÇÑ´Ù.1, 2, 3 ¼¼ °³ÀÇ ³ëµå°¡ ÀÖ´Â »óÅ¿¡¼­ ³ëµå 2¸¦ »èÁ¦ÇÏ´Â ¿¹¸¦ º¸ÀÚ.

³ëµå 2¸¦ Á¦°ÅÇÏ·Á¸é DeleteNode ÇÔ¼ö·Î ³ëµå 1À» Àü´ÞÇØ¾ß Çϴµ¥ ³ëµå1Àº head->next·Î ½±°Ô ±¸ÇÒ ¼ö ÀÖ´Ù. DeleteNode ÇÔ¼ö´Â Target->next·Î »èÁ¦ ´ë»ó ³ëµå¸¦ ã¾Æ Del¿¡ ´ëÀÔÇÑ´Ù. ±×¸®°í DelÀÌ °¡¸®Å°°í ÀÖ´Â ´ÙÀ½ ³ëµå¸¦ TargetÀÇ ´ÙÀ½ ³ëµå·Î ¼³Á¤(Target->next=Del->next)ÇÔÀ¸·Î½á DelÀ» ¸®½ºÆ®¿¡¼­ Á¦¿Ü½ÃŲ´Ù. ÀÌ·¸°Ô µÇ¸é DelÀº ¸Þ¸ð¸®¿¡ ¾ÆÁ÷ ³²¾Æ ÀÖÁö¸¸ ¿¬°á ¸®½ºÆ®¿¡¼­´Â ³í¸®ÀûÀ¸·Î »èÁ¦µÈ °ÍÀÌ´Ù. DelÀÌ Â÷ÁöÇϰí ÀÖ´Â ¸Þ¸ð¸®¸¦ free ÇÔ¼ö·Î ÇØÁ¦Çϸé ÀÌ ³ëµå´Â ¹°¸®ÀûÀ¸·Î Á¦°ÅµÈ´Ù.

DeleteNode ÇÔ¼ö´Â ÇѰ¡Áö ¿¹¿Ü¸¦ ó¸®Çϰí Àִµ¥ TargetÀ¸·Î ¸¶Áö¸· ³ëµå°¡ Àü´ÞµÈ °æ¿ì »èÁ¦ÇÒ ´ë»óÀÌ ¾øÀ¸¹Ç·Î ¿¡·¯¸¦ ¸®ÅÏÇÑ´Ù. ¸¶Áö¸· ³ëµåÀÇ ¸µÅ©´Â NULLÀ» °¡¸®Å°°í ÀÖÀ¸¸ç ÀÌ °ªÀº ¸®½ºÆ®ÀÇ ³¡À̶ó´Â Ç¥½ÄÀÏ »Ó ½ÇÁ¦ ³ëµå°¡ ¾Æ´Ï¹Ç·Î »èÁ¦ÇÒ ¼ö ¾ø´Ù. main¿¡¼­ ³ëµå2¸¦ »èÁ¦ÇßÀ¸¸ç ÀÌ °á°ú 1, 3, 4, 5¸¸ ¸®½ºÆ®¿¡ ³²°Ô µÈ´Ù.

¼øÈ¸

¼øÈ¸¶õ ¿¬°á ¸®½ºÆ®¿¡ Æ÷ÇÔµÈ ¸ðµç ³ëµå¸¦ ÇÑ ¹ø¾¿ ÀÐ¾î º¸´Â °ÍÀÌ´Ù. ¼øÈ¸Áß¿¡ ¿©·¯ °¡Áö ÀÛ¾÷À» ÇÒ ¼ö ÀÖÀ¸¸ç ÀÏ´Ü ¼øÈ¸¸¦ ÇØ¾ß ¾î¶² ó¸®¶óµµ ÇÒ ¼ö ÀÖ´Ù. ƯÁ¤°ªÀ» °¡Áø ³ëµå¸¦ °Ë»öÇѴٰųª ³ëµå Àüü¸¦ Ãâ·ÂÇÒ ¶§´Â ¸Ó¸®¿¡¼­ºÎÅÍ ¸µÅ©¸¦ µû¶ó ¸ðµç ³ëµå¸¦ ¹æ¹®ÇØ ºÁ¾ß ÇÑ´Ù. ¹è¿­ÀÇ °æ¿ì´Â for ·çÇÁ¸¦ µ¹¸ç ÷ÀÚ¸¦ Áõ°¡½ÃŰ´Â ¹æ¹ýÀ¸·Î °£´ÜÈ÷ ¼øÈ¸ÇÒ ¼ö ÀÖÁö¸¸ ¿¬°á ¸®½ºÆ®´Â ¿¬¼ÓµÈ ¸Þ¸ð¸® °ø°£¿¡ ³ëµåµéÀÌ ¹èÄ¡µÇ¾î ÀÖÁö ¾ÊÀ¸¹Ç·Î ¸µÅ©¸¦ µû¶ó °¡¸é¼­ ³ëµå¸¦ ¹Ýº¹ÀûÀ¸·Î Àо´Â ¹æ¹ý¹Û¿¡ ¾ø´Ù. ³ëµåÀÇ ÃÑ °³¼ö¸¦ ¾Ë°í ½ÍÀ» ¶§µµ ¼øÈ¸°¡ ÇÊ¿äÇÏ´Ù.

main¿¡¼­´Â head->next, Áï ù ¹øÂ° ³ëµå¿¡¼­ºÎÅÍ ½ÃÀÛÇØ¼­ value¸¦ Ãâ·ÂÇÏ°í ¸µÅ©¸¦ µû¶ó ´ÙÀ½ ³ëµå·Î À̵¿Çϱ⸦ ³ëµå°¡ NULLÀÌ ¾Æ´Ò ¶§±îÁö ¹Ýº¹ÇÔÀ¸·Î½á ¼øÈ¸ÇÑ´Ù. µ¿ÀÛÀÌ º¹ÀâÇØ º¸ÀÌÁö¸¸ Node ÇüÀÇ Æ÷ÀÎÅÍ º¯¼ö¿Í ´Ü¼øÇÑ for¹® Çϳª¸é Àüü ¼øÈ¸°¡ °¡´ÉÇÏ´Ù. ³ëµåµéÀº ¿¬¼ÓÀûÀÎ ¸Þ¸ð¸® °ø°£¿¡ ÀÖÁöµµ ¾Ê°í »ý¼ºµÇ´Â À§Ä¡¸¦ ¿¹ÃøÇÒ ¼öµµ ¾øÁö¸¸ ¸Ó¸®¿¡¼­ºÎÅÍ next¸µÅ©¸¸ µû¶ó ´Ù´Ï¸é ¼ø¼­¿¡ ¸Â°Ô ¸ðµç ³ëµå¸¦ ¼øÈ¸ÇÒ ¼ö ÀÖ´Ù. ³ëµå 2°¡ »èÁ¦µÇ¾úÀ¸¹Ç·Î Ãâ·ÂµÇ´Â °á°ú´Â 1, 3, 4, 5°¡ µÉ °ÍÀÌ´Ù.

´Ü¼ø ¿¬°á ¸®½ºÆ®´Â µÚÂÊ ¸µÅ©¸¸À» °¡Áö±â ¶§¹®¿¡ ¼ø¹æÇâÀ¸·Î¸¸ ¼øÈ¸ÇÒ ¼ö ÀÖ´Ù. ¿ª¹æÇâ ÂüÁ¶°¡ ÇÊ¿äÇÏ´Ù¸é ´ÙÀ½ Ç׿¡¼­ ¿¬±¸ÇØ º¼ ÀÌÁß ¿¬°á ¸®½ºÆ®¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù.

ÇØÁ¦

¿¬°á ¸®½ºÆ®ÀÇ ³ëµåµéÀº ½ÇÇàÁß¿¡ ¸Þ¸ð¸®¸¦ ÇÒ´çÇØ¼­ »ý¼ºµÇ¹Ç·Î ´Ù »ç¿ëÇßÀ¸¸é ÇØÁ¦ÇØ¾ß ÇÑ´Ù. ÀÌ ÀÛ¾÷Àº UnInitList ÇÔ¼ö¿¡¼­ ´ã´çÇϴµ¥ ¹æ¹ýÀº »ý°¢º¸´Ù °£´ÜÇÏ´Ù. headÀÇ ´ÙÀ½ ³ëµåÀΠù ¹øÂ° ³ëµå¸¦ »èÁ¦Çϱ⸦ ½ÇÆÐÇÒ ¶§±îÁö, Áï ¸Ó¸®°¡ ¸®½ºÆ®ÀÇ ³¡ÀÌ µÉ ¶§±îÁö ¹Ýº¹ÇÏ´Â °ÍÀÌ´Ù. ¸¶Ä¡ Űº¸µåÀÇ DelŰ·Î ¹®ÀÚ¸¦ Áö¿ìµíÀÌ µÚÂÊ ³ëµåµéÀÌ ¸Ó¸®ÂÊÀ¸·Î À̵¿Çϸ鼭 ¼ø¼­´ë·Î »ç¶óÁø´Ù. ¸Ó¸® ÀÚü´Â DeleteNode ÇÔ¼ö·Î »èÁ¦ÇÒ ¼ö ¾øÀ¸¹Ç·Î º°µµ·Î ÇØÁ¦ÇØ¾ß ÇÑ´Ù.

 

 FindPrevNode

´Ü¼ø ¿¬°á ¸®½ºÆ®´Â ¸µÅ©°¡ Çϳª »ÓÀÌ¸ç Æ¯Á¤ ³ëµåÀÇ ¾ÕÂÊ ³ëµå¸¦ ¾Ë ¼ö ÀÖ´Â Æí¸®ÇÑ ¹æ¹ýÀÌ ¾ø´Ù. ±×·¡¼­ »ðÀÔÇÒ ¶§³ª »èÁ¦ÇÒ ¶§µµ Ç×»ó ´ë»ó ³ëµåÀÇ ÀÌÀü ³ëµå¸¦ ÁöÁ¤ÇØ¾ß ÇÑ´Ù. ±×·¯³ª ²À ÀÌÀü ³ëµå¸¦ ¾Ë°í ½Í´Ù¸é Á¶±Ý ºñÈ¿À²ÀûÀ̱â´Â ÇÏÁö¸¸ ÀüÇô ºÒ°¡´ÉÇÑ °ÍÀº ¾Æ´Ï´Ù. ¸Ó¸®¿¡¼­ºÎÅÍ ¼øÈ¸¸¦ ½ÃÀÛÇÏ¿© ÀÚ±â ÀÚ½ÅÀ» ¸¸³¯ ¶§±îÁö ¸µÅ©¸¦ µû¶ó ´Ù´Ï´Ù°¡ ¹Ù·Î Á÷ÀüÀÇ ³ëµå¸¦ ÃëÇÏ¸é µÈ´Ù. ÀÌ ¹æ¹ýÀ» ¿¬±¸ÇØ º¸°í ÀÌÀü ³ëµå¸¦ ã´Â FindPrevNode ÇÔ¼ö¸¦ ÀÛ¼ºÇØ º¸¾Æ¶ó. ¶Ç ÀÌ ÇÔ¼ö¸¦ ÀÀ¿ëÇÏ¿© ÁöÁ¤ÇÑ ³ëµåÀÇ ¾Õ¿¡ »õ ³ëµå¸¦ »ðÀÔÇÏ´Â InsertNodeLeft ÇÔ¼ö¿Í ÁöÁ¤ÇÑ ³ëµå¸¦ »èÁ¦ÇÏ´Â DeleteNodeSelf ÇÔ¼ö¸¦ ÀÛ¼ºÇØ º¸¾Æ¶ó.