Table of contents

    코드

    #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);
        }
    }