반응형
내용 출처 : YES C (정보공학연구소 /생능출판사)
단순 연결 리스트를 이용하여 생성한 큐(queue)를 이용하는 프로그램
// A linked list implementation of a queue.
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <ctype.h>
#define EMPTY 0
#define FULL 10000
typedef unsigned int data;
struct element{
data d;
element* next;
};
//an element in the queue
struct queue {
int cnt; //a count of the elements
element* front; //ptr to the front element
element* rear; //ptr to the rear element
};
void initialize(queue *q);
data dequeue(queue *q);
void enqueue(data d, queue *q);
data front(const queue *q);
bool empty(const queue *q);
bool full(const queue *q);
//using queues to schedule two resources.
int main()
{
int c;
int cnt_a = 0;
int cnt_b = 0;
data pid;
queue a, b;
initialize(&a);
initialize(&b);
//enqueue the requests.
while ((c = getchar()) != EOF) {
switch (toupper(c)) {
case 'A':
assert(scanf_s("%u", &pid) == 1);
if (!full(&a)) {
enqueue(pid, &a);
}
break;
case 'B':
assert(scanf_s("%u", &pid) == 1);
if (!full(&b)) {
enqueue(pid, &b);
}
}
}
//Dequeue the requests and print them.
printf("---\n");
printf("A's schedule : \n");
while (!empty(&a)) {
pid = dequeue(&a);
printf("JOB %u is %d \n", ++cnt_a, pid);
}
printf("\n");
printf("---\n");
printf("B's schedule : \n");
while (!empty(&b)) {
pid = dequeue(&b);
printf("JOB %u is %d \n", ++cnt_b, pid);
}
printf("\n");
return 0;
}
//the basic queue routines
void initialize(queue *q)
{
q->cnt = 0;
q->front = NULL;
q->rear = NULL;
}
data dequeue(queue *q)
{
data d;
element *p;
d = q->front->d;
p = q->front;
q->front = q->front->next;
q->cnt--;
free(p);
return d;
}
void enqueue(data d, queue *q)
{
element* p;
p = (element*)malloc(sizeof(element));
p->d = d;
p->next = NULL;
if (!empty(q)) {
q->rear->next = p;
q->rear = p;
}
else {
q->front = q->rear = p;
}
q->cnt++;
}
data front(const queue *q)
{
return q->front->d;
}
bool empty(const queue *q)
{
return (bool)(q->cnt == EMPTY);
}
bool full(const queue *q)
{
return (bool)(q->cnt == FULL);
}
반응형