반응형
- 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 |
반응형
'Applied > 자료구조' 카테고리의 다른 글
배열 기반 스택(Array Base Stack) 개념 (0) | 2016.02.24 |
---|---|
배열 기반 스택(Array Base Stack) 소스코드 (0) | 2016.02.24 |
원형 큐(Circular Queue) 개념 (0) | 2016.02.22 |
원형 큐(Cricular Queue) 소스 코드 (0) | 2016.02.22 |
연결 리스트 기반 큐(List Base Queue) 개념 (0) | 2016.02.22 |