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