단일 연결 리스트(Single Linked List)

2014. 1. 21. 09:46Programing/C Language

#include stdio.h>
#include stdlib.h>

#define CLS   system("cls")
#define PAUSE system("pause")

#define SAFE_FREE(a) if(a){free(a); a=NULL;}
#define MALLOC       (Node *)malloc(sizeof(Node))

#define ALL 0
#define ONE 1

typedef struct _Node
{
   int           m_nData;
   struct _Node *m_pNext;
}Node;

void LinkedList_DisplayNode (Node *pHead, int nCase);
void LinkedList_AddNode (Node **ppHead, int nData);
void LinkedList_InsertNode (Node **ppHead, int nData, int nPosition);
void LinkedList_RemoveNode(Node **ppHead, int nData);
void LinkedList_RemoveAllNode(Node **ppHead);
void LinkedList_SearchNode(Node *pHead, int nData);

int main(void)
{
   int   nSelect = 0;
   int   nTemp = 0;
   int   nPosition = 0;
   Node *pHead = NULL;

   while(1)
   {
      CLS;
      printf("\n   __________________________________\n");
      printf("   |________ Linked List TEST _______|\n");
      printf("   | Select     >>>> 1. Add          |\n");
      printf("   |            >>>> 2. Insert       |\n");
      printf("   |            >>>> 3. Search       |\n");
      printf("   |            >>>> 4. Remove       |\n");
      printf("   |            >>>> 5. Remove All   |\n");
      printf("   |            >>>> 6. Print        |\n");
      printf("   |            >>>> 0. Exit         |\n");
      printf("   |_________________________________|\n");
      printf("   Enter a select Number : ");
      scanf("%d", &nSelect);

      if(nSelect == 0)
      {
         CLS;
         printf("\n   ______________________________\n");
         printf("       Exit Linked List TEST \n");
         printf("   ______________________________\n");
         LinkedList_RemoveAllNode(&pHead);
         return;
      }
      else if(nSelect == 1)
      {
         CLS;
         printf("\n   ______________________________\n");
         printf("      Add Linked List TEST\n");
         printf("   ______________________________\n");
         printf("   Enter a input Data : ");
         scanf("%d", &nTemp);
         LinkedList_AddNode(&pHead, nTemp);
         PAUSE;
      }
      else if(nSelect == 2)
      {
         CLS;
         printf("\n   ______________________________\n");
         printf("      Insert Linked List TEST\n");
         printf("   ______________________________\n");
         printf("   Enter a input Data : ");
         scanf("%d", &nTemp);
         printf("   Enter a taget Node : ");
         scanf("%d", &nPosition);
         LinkedList_InsertNode(&pHead, nTemp, nPosition);
         PAUSE;
      }
      else if(nSelect == 3)
      {
         CLS;
         printf("\n   ______________________________\n");
         printf("      Search Linked List TEST\n");
         printf("   ______________________________\n");
         printf("   Enter a search Data : ");
         scanf("%d", &nTemp);
         LinkedList_SearchNode(pHead, nTemp);
         PAUSE;
      }
      else if(nSelect == 4)
      {
         CLS;
         printf("\n   ______________________________\n");
         printf("      Remove Linked List TEST\n");
         printf("   ______________________________\n");
         printf("   Enter a remove Data : ");
         scanf("%d", &nTemp);
         LinkedList_RemoveNode(&pHead, nTemp);
         PAUSE;
      }
      else if(nSelect == 5)
      {
         CLS;
         printf("\n   ______________________________\n");
         printf("      Remove All Linked List TEST\n");
         printf("   ______________________________\n");
         LinkedList_RemoveAllNode(&pHead);
         printf("   Remove All SUCCESS!!\n");
         PAUSE;
      }
      else if(nSelect == 6)
      {
         CLS;
         printf("\n   ______________________________\n");
         printf("      Display Linked List TEST\n");
         printf("   ______________________________\n");
         LinkedList_DisplayNode(pHead, ALL);
         PAUSE;
      }
   }
   return;
}

void LinkedList_DisplayNode (Node *pHead, int nCase)
{
   Node *pTemp = NULL;

   pTemp = pHead;

   switch(nCase)
   {
      case 0: // 전체 노드 출력
         while(pTemp != NULL)
         {
            printf("\n   ______________________________\n");
            printf("   LinkedList Data : %d\n", pTemp->m_nData);
            printf("   LinkedList Next : %x\n", pTemp->m_pNext);
            pTemp = pTemp->m_pNext;
         }
         printf("   ______________________________\n");
         break;
      case 1: // 한 노드만 출력
         printf("\n   ______________________________\n");
         printf("   LinkedList Data : %d\n", pTemp->m_nData);
         printf("   LinkedList Next : %x\n", pTemp->m_pNext);
         printf("   ______________________________\n");
         break;
   }
}

void LinkedList_AddNode (Node ** ppHead, int nData)
{
   Node *pTemp = NULL;
   Node *pSearch = NULL;

   pTemp = MALLOC;
   
   if(pTemp == NULL)
   {
      printf("   Malloc is failed!!\n");
      return;
   }
   pTemp->m_nData = nData;
   pTemp->m_pNext = NULL;

   //노드가 생성되지 않은 경우
   if(*ppHead == NULL)
   {
      *ppHead = pTemp;
      LinkedList_DisplayNode(*ppHead, ONE);
   }
   //노드가 1 이상 존재하는 경우
   else
   {
      pSearch = *ppHead;
      //마지막 노드 검색
      while(pSearch->m_pNext != NULL)
      {
         pSearch = pSearch->m_pNext;
      }
      //마지막 노드 다음에 노드 추가
      pSearch->m_pNext = pTemp;
      //추가 된 노드 정보 출력
      pSearch = pSearch->m_pNext;
      LinkedList_DisplayNode(pSearch, ONE);
   }
}

void LinkedList_InsertNode (Node **ppHead, int nData, int nPosition)
{
   Node *pTemp = NULL;
   Node *pTarget = NULL;

   pTemp = MALLOC;
   
   if(pTemp == NULL)
   {
      printf("   Malloc is failed!!\n");
      return;
   }
   
   pTemp->m_nData = nData;
   pTemp->m_pNext = NULL;

   if(*ppHead == NULL)
   {
      *ppHead = pTemp;
      LinkedList_DisplayNode(*ppHead, ONE);
   }
   else
   {
      pTarget = *ppHead;

      //노드 검색
      while(pTarget != NULL && (pTarget->m_nData != nPosition))
      {
         pTarget = pTarget->m_pNext;
      }
     
      //노드를 찾은 경우
      if(pTarget != NULL)
      {
         //해당 노드 뒤에 노드 추가
         pTemp->m_pNext = pTarget->m_pNext;
         pTarget->m_pNext = pTemp;
         LinkedList_DisplayNode(pTemp, ONE);
      }
      //노드를 찾지 못한 경우
      else
      {
         printf("\n   Not Find!!\n");
         SAFE_FREE(pTarget);
         SAFE_FREE(pTemp);
      }
   }
}

void LinkedList_RemoveNode(Node **ppHead, int nData)
{
   Node *pTemp = NULL;
   Node *pTarget = NULL;

   pTemp = *ppHead;
   pTarget = *ppHead;

   //노드 검색
   while(pTemp != NULL && (pTemp->m_nData != nData))
   {
      pTarget = pTemp;
      pTemp = pTemp->m_pNext;
   }

   //노드를 찾은 경우
   if(pTemp != NULL)
   {
      if(pTemp == pTarget)
      {
         printf("\n   Remove object is Head!!\n");
         printf("\n   Remove SUCCESS!!\n");
         *ppHead = (*ppHead)->m_pNext;
         SAFE_FREE(pTemp);
      }
      else
      {
         pTarget->m_pNext = pTemp->m_pNext;
         SAFE_FREE(pTemp);
         printf("\n   Remove SUCCESS!!\n");
      }
   }
   //노드를 찾지 못한 경우
   else
   {
      printf("\n   Not Find!!\n");
      SAFE_FREE(pTemp);
   }
}

void LinkedList_RemoveAllNode(Node **ppHead)
{
   Node *pTemp = NULL;
   Node *pDelete = NULL;

   pTemp = *ppHead;

   while(pTemp != NULL)
   {
      pDelete = pTemp;
      pTemp = pTemp->m_pNext;
      SAFE_FREE(pDelete);
   }

   (*ppHead) = NULL;
}

void LinkedList_SearchNode(Node *pHead, int nData)
{
   Node *pTemp = NULL;

   pTemp = pHead;

   //노드 검색
   while(pTemp != NULL && (pTemp->m_nData != nData))
   {
      pTemp = pTemp->m_pNext;
   }

   //노드를 찾은 경우
   if(pTemp != NULL)
   {
      printf("\n   Find SUCCESS!!\n");
      LinkedList_DisplayNode(pTemp, ONE);
   }
   //노드를 찾지 못한 경우
   else
   {
      printf("\n   Not Find!!\n");
   }
}