ABOUT ME

Today
Yesterday
Total
  • Queue(2) - Linked Queue
    자료구조 2022. 7. 8. 16:19

    Linked Queue는 Singly Linked List와 구조가 똑같다.

    주요 연산:

    Enqueue(삽입)

    Dequeue(삭제)

     

    enqueue는 rear 뒤에, dequeue는 front를 반환해주면 된다.

    // gcc -o Test_LinkedQueue.exe Test_LinkedQueue.c LinkedQueue.c; ./Test_LinkedQueue.exe
    
    typedef struct tagNode
    {
        char* Data;
        struct tagNode* NextNode;
    } Node;
    
    typedef struct tagLinkedQueue
    {
        Node* Front;
        Node* Rear;
        int   Count;
    } LinkedQueue;
    
    void  LQ_CreateQueue( LinkedQueue** Queue )
    {
        /*  큐를 자유저장소에 생성 */
        (*Queue )        = ( LinkedQueue*)malloc(sizeof( LinkedQueue ) );
        (*Queue )->Front = NULL;
        (*Queue )->Rear  = NULL;
        (*Queue )->Count = 0;
    }
    
    void LQ_DestroyQueue( LinkedQueue* Queue )
    {
        while ( !LQ_IsEmpty( Queue ) )
        {
            Node* Popped = LQ_Dequeue( Queue );
            LQ_DestroyNode(Popped);    
        }
    
        /*  큐를 자유 저장소에서 해제 */
        free( Queue );
    }
    
    Node* LQ_CreateNode( char* NewData )
    {
        Node* NewNode = (Node*)malloc( sizeof( Node ) );
        NewNode->Data = (char*)malloc( strlen( NewData) + 1);
    
        strcpy(NewNode->Data, NewData);  /*  데이터를 저장한다. */
    
        NewNode->NextNode = NULL; /*  다음 노드에 대한 포인터는 NULL로 초기화 한다. */
    
        return NewNode;/*  노드의 주소를 반환한다. */
    }
    
    void  LQ_DestroyNode(Node* _Node )
    {
        free(_Node->Data);
        free(_Node );
    }
    
    void LQ_Enqueue( LinkedQueue* Queue, Node* NewNode )
    {
        if ( Queue->Front == NULL ) 
        {        
            Queue->Front = NewNode;
            Queue->Rear  = NewNode;
            Queue->Count++;
        } 
        else
        {
            Queue->Rear->NextNode = NewNode;
            Queue->Rear = NewNode;
            Queue->Count++;
        }
    }
    
    Node* LQ_Dequeue( LinkedQueue* Queue )
    {
        /*  LQ_Dequeue() 함수가 반환할 최상위 노드 */
        Node* Front = Queue->Front;
    
        if ( Queue->Front->NextNode == NULL )
        {
            Queue->Front = NULL;
            Queue->Rear  = NULL;
        }
        else
        {
            Queue->Front = Queue->Front->NextNode;
        }
    
        Queue->Count--;
    
        return Front;
    }
    
    int LQ_IsEmpty( LinkedQueue* Queue )
    {
        return ( Queue->Front == NULL);
    }
    
    int main( void )
    {
        Node* Popped;
        LinkedQueue* Queue;
    
        LQ_CreateQueue(&Queue );
        
        LQ_Enqueue( Queue, LQ_CreateNode("abc") );
        LQ_Enqueue( Queue, LQ_CreateNode("def") );
        LQ_Enqueue( Queue, LQ_CreateNode("efg") );
        LQ_Enqueue( Queue, LQ_CreateNode("hij") );
    
        printf("Queue Size : %d\n", Queue->Count);
    
        while ( LQ_IsEmpty( Queue ) == 0 )
        {
            Popped = LQ_Dequeue( Queue );
    
            printf( "Dequeue: %s \n", Popped->Data );
    
            LQ_DestroyNode( Popped );
        }
    
        LQ_DestroyQueue( Queue );
    
        return 0;
    }

    '자료구조' 카테고리의 다른 글

    Tree(2) - Binary Tree  (0) 2022.07.10
    Tree(1) - Tree 구현  (0) 2022.07.10
    Queue(1) - Circular Queue  (0) 2022.07.08
    Stack(3) - 사칙 연산 계산기  (0) 2022.07.08
    Stack(2) - Linked List Stack  (0) 2022.07.08
Designed by Tistory.