ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [게임알고리즘] 3-2강 링크 리스트
    [DSU] 게임알고리즘 2026. 3. 22. 11:39
    728x90

    3-1강에서 구현한 링크 리스트에서

    - 추가하거나 삭제할때 노드 총 수를 반복적으로 구하는것을 피하고

    - 메모리를 관리할 수 있도록 변경

    - 사용하기 편하도록 객체화

     

    NodeMgt nm이 main에서 벗어나는 순간, 추가된 문자열이 출력되고 삭제되는것을 확인 가능함.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    #include "NodeMgt.h"
     
    void cb(void* data)
    {
        const char* s = (const char*)data;
        printf("cb[%s]\n", s);
        delete s;
    }
     
    int main() {
        
        NodeMgt nm(cb);
        
        const char* str[] = { "Hi""world""!!" };
        for(int i=0; i<3; i++)
        {
            const char* t = str[i];
            int len = strlen(t);
            char* s = new char[len + 1];
            //strcpy(s, t);
            memcpy(s, t, sizeof(char* len);
            s[len] = 0;
            
            nm.add(s);
        }
        
        const char* t = str[0];
        int len = strlen(t);
        char* s = new char[len + 1];
        strcpy(s, t);
        //nm.add(s);
        nm.add(0, s);
        
        //delNode(2);
        //delNode(str[0]);
        
        for(int i=0; i<nm.count; i++)
        {
            printf("nm[%d].data[%s]\n", i, (const char*)nm.at(i));
        }
     
        return 0;
    }
    cs

     

     

     

    NodeMgt.h

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    struct Node
    {
        void* data;
        Node* prev;
    };
     
    typedef void (*MethodNodeMgt)(void* data);
     
    struct NodeMgt
    {
        Node* last;
        int count;
        MethodNodeMgt method;
        
        NodeMgt(MethodNodeMgt m);
        virtual ~NodeMgt();
        
        void add(void* data);
        void add(int index, void* data);
        
        void del(int index);
        bool del_(void* data);
        void del(void* data);
        void delAll();
        
        void* at(int index);
    };
     
    cs

     

     

    NodeMgt.cpp

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    #include "NodeMgt.h"
     
    NodeMgt::NodeMgt(MethodNodeMgt m)
    {
        last = NULL;
        count = 0;
        method = m;
    }
     
    NodeMgt::~NodeMgt()
    {
        delAll();
    }
     
    void NodeMgt::add(void* data)
    {
        Node* n = new Node;
        n->data = data;
        n->prev = last;
        
        last = n;
        count++;
    }
        
    void NodeMgt::add(int index, void* data)
    {
        int i = count - 1;
        if( index==i )
        {
            add(data);
            return;
        }
        for(Node* p = last; p; p = p->prev, i--)
        {
            if(i==index)
            {
                Node* n = new Node;
                n->data = data;
                n->prev = p->prev;
                
                p->prev = n;
                count++;
                return;
            }
        }
        printf("failed to insert node\n");
    }
        
    void NodeMgt::del(int index)
    {
        int i = count - 1;
        for(Node* p = last,* back = NULL; p; 
            back = p, p = p->prev, i--)
        {
            if(i==index)
            {
                if( back )
                    back->prev = p->prev;
                else// if( last==NULL )
                    last = p->prev;
                if( method )
                    method(p->data);
                delete p;
                count--;
                return;
            }
        }
    }
     
    #if 0
     
    bool NodeMgt::del_(void* data)
    {
        for(Node* p = last, * back = NULL; p;
            back = p, p = p->prev)
        {
            if( p->data==data )
            {
                if( back )
                    back->prev = p->prev;
                else
                    last = p->prev;
                if( method )
                    method(p->data);
                delete p;
                count--;
                return true;
            }
        }
        return false;
    }
    void NodeMgt::del(void* data)
    {
        while(del_(data));
    }
     
    #else
     
    void NodeMgt::del(void* data)
    {
        for(Node* p = last, * back = NULL; p;)
            //back = p, p = p->prev)
        {
            if( p->data==data )
            {
                if( back )
                    back->prev = p->prev;
                else
                    last = p->prev;
                //back = back;// 000
                Node* bk = p->prev;// 111
                if( method )
                    method(p->data);
                delete p;
                p = bk;
                count--;
            }
            else
            {
                back = p;// 000
                p = p->prev;// 111
            }
        }
    }
    #endif
        
    void NodeMgt::delAll()
    {
        for(Node* p = last; p; )
        {
            Node* bk = p->prev;
            if( method )
                method(p->data);
            delete p;
            p = bk;
        }
        last = NULL;
        count = 0;
    }
     
    void* NodeMgt::at(int index)
    {
        int i = count - 1;
        for(Node* p = last; p; p = p->prev, i--)
        {
            if( i==index )
                return p->data;
        }
        return NULL;
    }
    cs

     

    매일매일 열심히 게임개발하고 있습니다

     

Designed by Tistory.