이중 연결 리스트(Double Linked List)
2014. 1. 21. 09:45ㆍPrograming/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"); } }
'Programing > C Language' 카테고리의 다른 글
구구단 최적화 코딩 (0) | 2014.01.21 |
---|---|
단일 연결 리스트(Single Linked List) (0) | 2014.01.21 |
이중 연결 리스트 + 이진 트리(Double Linked List + Binary Tree) (0) | 2014.01.20 |
File RW (파일 읽고 쓰기) (0) | 2014.01.20 |
C언어의 메모리 구조 (0) | 2014.01.20 |