이중 연결 리스트(Double Linked List)

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

#include 

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

#define RELEASEIF(a)    if(a){free(a); a=NULL;}
#define MALLOC(x)          x=(Node *)malloc(sizeof(Node));if(x == NULL){printf("   Malloc is failed!!\n");return;}

#define ALL       0
#define ONE       1

#define FORWARD   1
#define REVERSE   2

#define FIRST     1
#define LAST      2
#define SELECT    3

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

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

int main(void)
{
   int    nSelect = 0;
   int    nTemp = 0;
   int    nPosition = 0;
   Node  *pHead = NULL;
   Node  *pTail = 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);
         printf("   First = 1 | Last = 2 :");
         scanf("%d", &nPosition);
         LinkedList_AddNode(&pHead, &pTail, nTemp, nPosition);
         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, &pTail, 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);
         printf("   Forward = 1 | Reverse = 2 :");
         scanf("%d", &nPosition);
         LinkedList_SearchNode(pHead, pTail, nTemp, nPosition);
         PAUSE;
      }
      else if(nSelect == 4)
      {
         CLS;
         printf("\n   ______________________________\n");
         printf("      Remove Linked List TEST\n");
         printf("   ______________________________\n");
         printf("   First = 1 | Last = 2 | Select = 3 :");
         scanf("%d", &nPosition);

         if (nPosition == 1 || nPosition == 2)
         {
            LinkedList_RemoveNode(&pHead, &pTail, nTemp, nPosition);
         }
         else if (nPosition == 3)
         {
            printf("   Enter a remove Data : ");
            scanf("%d", &nTemp);
            LinkedList_RemoveNode(&pHead, &pTail, nTemp, nPosition);
         }
         else
         {
            printf("   Error Input Number!!\n");
         }
         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;
      }
      else
      {
         CLS;
         printf("\n   ______________________________\n");
         printf("   Error input Number!!\n");
         printf("   ______________________________\n");
         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);
         printf("   LinkedList Prev : %x\n", pTemp->m_pPrev);
         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("   LinkedList Prev : %x\n", pTemp->m_pPrev);
         printf("   ______________________________\n");
         break;
   }
}

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

   MALLOC(pTemp);

   pTemp->m_nData = nData;
   pTemp->m_pNext = NULL;
   pTemp->m_pPrev= NULL;
   if(*ppHead == NULL)
   {
      *ppHead = pTemp;
      *ppTail = pTemp;
      LinkedList_DisplayNode(*ppHead, ONE);
   }
   else
   {
      if (nPosition == FIRST)
      {
         if(*ppHead)
         {
            (*ppHead)->m_pPrev = pTemp;
            pTemp->m_pNext = (*ppHead);
            (*ppHead) = pTemp;
         }
         LinkedList_DisplayNode(*ppHead, ONE);
      }
      else if (nPosition == LAST)
      {
         if(*ppTail)
         {
            (*ppTail)->m_pNext = pTemp;
            pTemp->m_pPrev = (*ppTail);
            (*ppTail) = pTemp;
         }
         LinkedList_DisplayNode(*ppTail, ONE);
      }
      else
      {
         printf("   Error Input Number!!\n");
      }
   }
}

void LinkedList_InsertNode (Node **ppHead, Node ** ppTail, int nData, int nPosition)
{
   Node  * pNode  = NULL;
   Node  * pTemp  = NULL;
   Node  * pList  = NULL;
   Node  * pPrev  = NULL;

   MALLOC(pNode);

   pNode->m_nData = nData;
   pNode->m_pPrev = NULL;
   pNode->m_pNext = NULL;

   pList = *ppHead;
   if( NULL==pList )
   {
      *ppHead = pNode;
       LinkedList_DisplayNode(*ppHead, ONE);
       return;
   }
   else
   {
      while( pList )
      {
         if( pList->m_nData==nPosition )
         {
            break;
         }
         pPrev = pList->m_pPrev;
         pList = pList->m_pNext;
      }
      if( pList )
      {
         pTemp = pList->m_pNext;
         pList->m_pNext = pNode;
         pNode->m_pNext = pTemp;
         pNode->m_pPrev = pList;
         if( pTemp )
         {
            pTemp->m_pPrev = pNode;
         }
         LinkedList_DisplayNode(pNode, ONE);
         return;
      }
      else if( pPrev )
      {
         pPrev->m_pNext = pNode;
         pNode->m_pPrev = pPrev;
         LinkedList_DisplayNode(pNode, ONE);
         return;
      }
      else
      {
         return;
      }
      if( pNode->m_pPrev==*ppTail )
      {
         *ppTail = pNode;
          LinkedList_DisplayNode(*ppTail, ONE);
          return;
      }
   }
}

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

   if (nPosition == FIRST)
   {
      if(*ppHead == *ppTail)
      {
         RELEASEIF(*ppHead);
      }
      else
      {
         if(!*ppTail)
         {
            return;
         }
         if(*ppHead == NULL)
         {
            return;
         }
         pTemp = (*ppHead)->m_pNext;
         pTemp->m_pPrev = NULL;
         *ppHead = pTemp;
      }
      printf("\n   Remove SUCCESS!!\n");
   }
   else if (nPosition == LAST)
   {
      if(*ppHead == *ppTail)
      {
         RELEASEIF(*ppHead);
      }
      else
      {
         pTemp = *ppHead;

         while(pTemp != NULL && (pTemp->m_nData != (*ppTail)->m_nData))
         {
            pTemp = pTemp->m_pNext;
         }

         if(!*ppTail)
         {
            return;
         }

         if(*ppTail == NULL)
         {
            return;
         }

         if(pTemp == *ppTail)
         {
            pTemp = (*ppTail)->m_pPrev;
            pTemp->m_pNext = NULL;
            RELEASEIF( *ppTail );
            *ppTail = pTemp;
         }
      }
      printf("\n   Remove SUCCESS!!\n");
   }
   else if (nPosition == SELECT)
   {
      Node *pPrev = NULL;
      Node *pNext = NULL;

      pTemp = *ppHead;

      while(pTemp != NULL && (pTemp->m_nData != nData))
      {
         pTemp = pTemp->m_pNext;
      }
      if(pTemp != NULL)
      {
         pPrev = pTemp->m_pPrev;
         pNext = pTemp->m_pNext;

         if(pPrev)
         {
            pPrev->m_pNext = pNext;
         }
         else
         {
            *ppHead = pNext;
         }

         if(pNext)
         {
            pNext->m_pPrev = pPrev;
         }
         else
         {
            *ppTail = pPrev;
         }
         RELEASEIF(pTemp);
         printf("\n   Remove SUCCESS!!\n");
      }
   }
   else
   {
      printf("   Error Input Number!!\n");
   }
}

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

   pTemp = *ppHead;

   while(pTemp != NULL)
   {
      pDelete = pTemp;
      pTemp = pTemp->m_pNext;
      RELEASEIF(pDelete);
   }
   (*ppHead) = NULL;
}

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

   if(nPosition == FORWARD)
   {
      pTemp = pHead;

      while(pTemp != NULL && (pTemp->m_nData != nData))
      {
         pTemp = pTemp->m_pNext;
      }
   }
   else if(nPosition == REVERSE)
   {
      pTemp = pTail;

      while(pTemp != pHead && (pTemp->m_nData != nData))
      {
         pTemp = pTemp->m_pPrev;
      }
   }
   else
   {
      printf("   Error Input Number!!\n");
   }
  
   if(pTemp != NULL && pTemp->m_nData == nData)
   {
      printf("\n   Find SUCCESS!!\n");
      LinkedList_DisplayNode(pTemp, ONE);
   }
   else
   {
   printf("\n   Not Find!!\n");
   }
}