포인터에 대해 알고 있다고 생각하였지만.. 자바를 하다보면 금새 까먹는 것 같습니다....^^;
그래서 다시 한번 리스트를 통해 연습 해보았습니다.
가장 심플하게 만든다고 만들어 보았습니다.
삭제나 검색도 차후에 추가 시켜야죠.
하지만 그 전에 필요하신 분들은 PrintNode와 FreeList 함수를 참고하신다면 작성하실 수 있을거라 생각됩니다.
※2010.06.01
id 값을 추가하여 id를 통해 삭제하는 함수를 작성해 보았습니다.
하지만 검색의 경우.. 굳이 할 필요가 없다고 생각되어 그냥 생략..^^;
실행화면
그래서 다시 한번 리스트를 통해 연습 해보았습니다.
가장 심플하게 만든다고 만들어 보았습니다.
※2010.06.01
id 값을 추가하여 id를 통해 삭제하는 함수를 작성해 보았습니다.
하지만 검색의 경우.. 굳이 할 필요가 없다고 생각되어 그냥 생략..^^;
실행화면
#include <stdio.h> #include <stdlib.h> void PrintNode( void ); // 리스트에 있는 Node들을 출력 void InsertNode( char* name, int age ); // 새로운 Node를 추가 void DeleteNode( unsigned int id ); // id 값을 통해 Node 제거 void FreeList( void ); // 리스트의 모든 Node를 제거 typedef struct Node { unsigned int id; char *name; int age; struct Node *next; }NodeStruct; NodeStruct* g_pHead = NULL; // 리스트의 가장 첫 Node를 가르킴. NodeStruct* g_pTail = NULL; // 리스트의 가장 마지막 Node를 가르킴. unsigned int g_nId = 0; // Node 마다 부여 될 고유한 id 값 int main(int argc, char* argv[]) { printf("Node를 추가합니다.\n"); InsertNode("Name1", 10); InsertNode("Name2", 12); InsertNode("Name3", 15); InsertNode("Name4", 15); InsertNode("Name5", 15); InsertNode("Name6", 15); InsertNode("Name7", 15); PrintNode(); printf("\n2, 4 Node를 삭제합니다.\n"); DeleteNode(2); DeleteNode(4); PrintNode(); printf("\n모든 Node를 삭제합니다.\n"); FreeList(); PrintNode(); system("PAUSE"); return 0; } /* 가장 첫 Node부터 시작하여 마지막 Node까지 탐색하며 내용을 출력 */ void PrintNode( void ) { NodeStruct* pCurrentNode = g_pHead; // 이동할 포인터 (초기값은 pHead 즉, 첫번째 노드) int nCount = 0; // 총 Node의 개수 printf("%3s %10s %3s\n", "ID", "Name", "Age"); while ( pCurrentNode != NULL ) // 마지막 Node일 경우 while문 종료 { printf("%3d %10s %3d\n", pCurrentNode->id, pCurrentNode->name, pCurrentNode->age); pCurrentNode = pCurrentNode->next; // 다음 Node를 가르키도록 이동 nCount++; } printf("총 %d개의 노드가 있습니다.\n", nCount); } /* 새로운 Node를 저장할 공간을 만들고 리스트의 마지막에 추가 */ void InsertNode( char* name, int age ) { NodeStruct* pNewNode; g_nId++; // 새로운 Node를 저장할 공간을 만들어서 pNewNode 포인터가 가르키게 함 pNewNode = (NodeStruct*) malloc(sizeof(NodeStruct)); (*pNewNode).id = g_nId; // pNewNode 포인터가 가르키고 있는 곳의 id를 변경 pNewNode->name = name; // 화살표 연산자를 통해서도 값 변경 가능 pNewNode->age = age; pNewNode->next = NULL; // pNewNode의 다음 Node는 우선 NULL로 초기화 if ( g_pHead == NULL ) // 리스트가 비어 있을 경우 { g_pHead = pNewNode; // pHead 포인터가 pNewNode가 가르키고 있는 곳을 가르키게 함 g_pTail = pNewNode; // pTail 포인터가 pNewNode가 가르키고 있는 곳을 가르키게 함 } else // 리스트가 비어 있지 않을 경우 { g_pTail->next = pNewNode; // 추가하기 전 마지막 Node의 다음 Node를 새로 만들어진 Node를 가르키게 함 g_pTail = pNewNode; // 새로 추가된 노드를 pTail이 가르키게 함 } } /* 가장 첫 Node부터 탐색하여 id 값에 해당하는 Node를 제거 */ void DeleteNode( unsigned int id ) { NodeStruct* pPrevNode = g_pHead; NodeStruct* pCurrentNode = g_pHead; while ( pCurrentNode != NULL ) // 마지막 Node일 경우 while문 종료 { if ( pCurrentNode->id == id ) { pPrevNode->next = pCurrentNode->next; // 이전 Node와 다음 Node 연결 free(pCurrentNode); // Node 삭제 break; // 해당 Node 삭제 후 while문 종료 } pPrevNode = pCurrentNode; // 현재 Node를 이전 Node로 저장 pCurrentNode = pCurrentNode->next; // 다음 Node를 가르키도록 이동 } } /* 가장 첫 Node부터 시작하여 리스트의 Node를 하나씩 제거 */ void FreeList( void ) { NodeStruct* pTempNode; while( g_pHead != NULL ) { pTempNode = g_pHead; g_pHead = pTempNode->next; free(pTempNode); } }
'I/T > C' 카테고리의 다른 글
유용한 매크로 함수 (1) | 2010.07.07 |
---|---|
콤마(,) 포함한 돈 문자열 출력하기 (0) | 2010.05.27 |
정렬 알고리즘 (Sort Algorithm) - 삽입 정렬 (Insertion Sort) (0) | 2009.11.16 |
정렬 알고리즘 (Sort Algorithm) - 버블 정렬 (Bubble Sort) (0) | 2009.11.16 |
정렬 알고리즘 (Sort Algorithm) - 선택 정렬 (Selection Sort) (0) | 2009.11.16 |