자료 구조2012. 5. 23. 11:25

연결리스트와 같이 링크드 큐의 각 노드는 다음 노드를 가리키는 포인터를 가진다.

순환 큐에 비해서 구현이 쉽고 용량의 제한이 없다. 하지만 순환 큐에 비해서 성능이 떨어진다.(malloc() 함수를 사용하기 때문)


링크드 큐의 노드와 구조체

typedef struct tagNode

{

char* Data;

struct tagNode* NextNode;

} Node;


typedef struct tagLinkedQueue

{

Node* Front;

Node* Rear;

int Count;

} LinkedQueue;


LinkedQueue 소스코드


#include "LinkedQueue.h"


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

}




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

분리 집합 (Disjoint Set)  (0) 2020.09.01
Tree (트리)  (0) 2012.05.23
Queue(큐) : 순환 큐(Circular Queue)  (0) 2012.05.17
Stack : 사칙 연산 계산기  (0) 2012.05.14
Stack (스택)  (0) 2012.05.11
Posted by elluma