반응형


- ListBaseQueue.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
33
#ifndef __LB_QUEUE_H__
#define __LB_QUEUE_H__
 
#define TRUE 1
#define FALSE 0
 
typedef int Data; 
 
typedef struct _node
{
    Data data;
    struct _node *next; // 이렇게 struct포인터로 지정하는 이유는 보통 
                        //int a = 8; int *b; b = &a; 라고 하듯이 서로 자료형을 맞추어주는것이다
}Node;
 
typedef struct _lQueue
{
    Node *front;
    Node *rear;
} LQueue;
 
typedef LQueue Queue;
 
void QueueInit(Queue *pq); // 큐 초기화
int QIsEmpty(Queue *pq); // 큐가 비어있는지 확인하는 함수
 
void Enqueue(Queue *pq, Data data); // 큐에 값 넣을때
Data Dequeue(Queue *pq); // 큐에서 값 뺄때
Data QPeek(Queue *pq); 
 
#endif
 
 
Crocus



- ListBaseQueue.c -


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
#include <stdio.h>
#include <stdlib.h>
#include "ListBaseQueue.h"
 
void QueueInit(Queue *pq) // 처음 초기화 과정
{
    pq->front = NULL// F와 R 모두 NULL로 초기화
    pq->rear = NULL;
}
 
int QIsEmpty(Queue *pq) // 큐가 비었는지 확인
{
    if (pq->front == NULL// pq 구조체의 front가 NULL을 가리키고 있다, 즉 아무것도 없는상태면
        return TRUE; 
 
    else
        return FALSE;
}
 
void Enqueue(Queue *pq, Data data) // 큐에 값 넣는 과정
{
    Node *newNode = (Node*)malloc(sizeof(Node)); // newNode 포인터 구조체를 형성한 뒤 malloc을 통해 공간 확보
    newNode->next = NULL// newNode의 next에는 NULL로 초기화
    newNode->data = data; // newNode의 data에는 data값을 입력
 
    if(QIsEmpty(pq)) // enqueue전에 큐가 비었는지 확인(처음 상태인지) 큐가 비었으면 1(TRUE), 아니면 0(FALSE)반환
    {
        pq->front = newNode; // 큐 값이 1개뿐일때니 F,R은 서로 newNode를 동시에 가리킨다.
        pq->rear = newNode;
    }
 
    else
    {
        pq->rear->next = newNode; // pq의 rear이 가리키고 있는 노드중 그 노드의 next가 newNode를 가리키도록한다.
        pq->rear = newNode; // 그다음 pq의 rear은 newNode를 가리키게한다.(F,R은 노드보단 포인터로 생각하는 것이 좋다.)
    }
}
 
Data Dequeue(Queue *pq) // 큐에서 값 빼는 과정
{
    Node *delNode; 
    Data retData;
 
    if (QIsEmpty(pq)) // 큐가 비어있는데 값을 빼는것은 오류
    {
        printf("Queue Memory Error!");
        exit(-1);
    }
 
    delNode = pq->front// delNode는 pq의 front가 가리키는 값을 가리킨다.
    retData = delNode->data; // retData는 delNode의 data값
    pq->front = pq->front->next; // pq의 front는 pq의 front가 가리키는 그 노드중 그 노드의 next가 가리키는 것을 가리키도록 한다. 
 
    free(delNode);
    return retData;
}
 
Data QPeek(Queue *pq)
{
    if (QIsEmpty(pq))
    {
        printf("Queue Memory Error!");
        exit(-1);
    }
 
    return pq->front->data;
}
 
 
 
Crocus




- ListBaseQueueMain.c -


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include "ListBaseQueue.h"
 
int main(void)
{
    // Queue의 생성 및 초기화
    Queue q; // 큐 하나 생성
    QueueInit(&q); // 큐 초기화
 
 
    //데이터 넣기
    Enqueue(&q, 1);
    Enqueue(&q, 2);
    Enqueue(&q, 3);
    Enqueue(&q, 4);
    Enqueue(&q, 5);
 
    //데이터 꺼내기
    while (!QIsEmpty(&q))
        printf("%d ", Dequeue(&q));
 
    return 0;
}
Crocus




반응형