✔️ 배열을 이용한 큐
#include <stdio.h>
#include <stdlib.h>
#pragma waring (disable : 4996)
#define MAX_SIZE 5
typedef struct queue
{
int arr[MAX_SIZE];
int front;
int rear;
int count;
}queue;
void createQueue(queue* p);
void enqueue(queue* p, int data);
int dequeue(queue* p);
void displayQueue(queue* p);
void clearQueue(queue* p);
int main()
{
queue que;
int choice, data;
createQueue(&que);
while (1)
{
system("clear");
printf("\n\nt *** 배열 리스트를 이용한 원형 큐***\n");
printf("1. enqueue 2. dequeue 3. print 4.clear 0.terminate\n ");
printf("choice: ");
scanf("%d", &choice);
switch (choice)
{
case 1:
printf("\n\n삽입할 정수를 입력하세요: ");
scanf("%d", &data);
enqueue(&que, data);
break;
case 2:
data = dequeue(&que);
if (data != -1)
printf("\n\n\t\t%d dequeue!\n", data);
break;
case 3:
displayQueue(&que);
break;
case 4:
clearQueue(&que);
break;
case 0:
return 0;
}
printf("\n\n\t\t");
system("read");
}
return 0;
}
void createQueue(queue* p)
{
p->front = 0;
p->rear = 0;
p->count = 0;
}
void enqueue(queue* p, int data)
{
if(p->count == MAX_SIZE)
{
printf("\n\n\t\tQueue overflow\n");
return;
}
p->arr[p->rear] = data;
(p->rear)++;
(p->count)++;
if(p->rear == MAX_SIZE)
p->rear = 0;
}
int dequeue(queue* p)
{
if (p->count == 0)
{
printf("\n\n\t\tqueue underflow\n");
return -1;
}
int delVaue = p->arr[p->front];
(p->front)++;
(p->count)--;
if(p->front == MAX_SIZE)
{
p->front = 0;
}
return delVaue;
}
void displayQueue(queue* p)
{
if (p->count == 0)
{
printf("\n\n\t\t출력할 데이터가 존재하지 않습니다.");
return;
}
system("clear");
printf("\n\ncircular queue display(FIFO): ");
for(int i = p->front; i < p->front + p->count; i++)
{
printf("%d ", p->arr[i % MAX_SIZE]);
}
puts("");
}
void clearQueue(queue* p)
{
p->front = p->rear = p->count = 0;
}
✔️ 연결리스트를 이용한 큐
#include <stdio.h>
#include <stdlib.h>
#pragma waring (disable : 4996)
typedef struct node
{
int value;
struct node* next;
}node;
node* head = NULL;
node* tail = NULL;
int dequeue();
void displayQueue();
void clearQueue();
void enqueue(int data);
int main()
{
int choice, data;
while (1)
{
system("clear");
printf("\n\nt *** 배열 리스트를 이용한 원형 큐***\n");
printf("1. enqueue 2. dequeue 3. print 4.clear 0.terminate\n ");
printf("choice: ");
scanf("%d", &choice);
switch (choice)
{
case 1:
printf("\n\n삽입할 정수 입력: ");
scanf("%d", &data);
enqueue(data);
break;
case 2:
data = dequeue();
if (data != -1)
printf("\n\n\t\t%d dequeue!\n", data);
break;
case 3:
displayQueue();
break;
case 4:
clearQueue();
break;
case 0:
clearQueue();
return 0;
}
printf("\n\n\t\t");
system("read");
}
return 0;
}
int dequeue()
{
if(head == NULL)
{
printf("\n\n\t\tQueue underflow\n");
return -1;
}
node* delNode = head;
head = head->next;
int delValue = delNode->value;
free(delNode);
if(head == NULL)
tail = NULL;
return delValue;
}
void displayQueue()
{
if (head == NULL)
{
printf("\n\n\t\t저장 된 데이터가 없습니다.\n");
return;
}
system("clear");
printf("\nQueue display(FIFO): ");
node* curNode = head;
while (curNode)
{
printf("%d ", curNode->value);
curNode = curNode->next;
}
puts("");
}
void clearQueue()
{
if (head == NULL)
{
return;
}
while(head)
{
node* delNode = head;
head = head->next;
free(delNode);
}
}
void enqueue(int data)
{
node* newNode;
newNode = (node*)malloc(sizeof(node));
newNode->value = data;
newNode->next = NULL;
if(head == NULL)
{
head = newNode;
tail = newNode;
return;
}
tail->next = newNode;
tail = newNode;
}
✔️ Survival c
#include <stdio.h>
#include <stdlib.h>
#pragma warning (disable : 4996)
typedef struct DNode
{
int value;
struct DNode* prev;
struct DNode* next;
}DNode;
DNode* head = NULL;
DNode* tail = NULL;
void displayQueue();
void standBy(int n);
void killer(int killN);
void removeFirstDNode();
void removeTailDNode();
int main()
{
int n;
printf("처형을 기다리는 사람은 몇 명 입니까? ");
scanf("%d", &n);
standBy(n);
displayQueue();
int killN;
printf("몇 번째 사람을 처형하시겠습니까? ");
scanf("%d", &killN);
killer(killN);
displayQueue();
return 0;
}
void displayQueue()
{
if (head == NULL)
{
printf("\n\n\t\t저장 된 데이터가 없습니다.\n");
return;
}
printf("\n큐에 대기중인 사람의 명단: ");
DNode* curNode = head;
while (curNode)
{
printf("%d ", curNode->value);
curNode = curNode->next;
}
puts("");
}
void standBy(int n)
{
DNode* newNode;
for(int i = 1; i <= n; i++)
{
newNode = (DNode*)malloc(sizeof(DNode));
newNode->value = i;
newNode->next = NULL;
newNode->prev = NULL;
if(head == NULL)
{
head = newNode;
tail = newNode;
}
else
{
tail->next = newNode;
newNode->prev = tail;
tail = newNode;
}
}
}
void removeFirstDNode()
{
DNode* delNode;
if (head == NULL)
{
printf("\n\n\t\t연결리스트가 구성되지 않아 삭제할 데이터가 없습니다.\n");
return;
}
delNode = head;
head = head->next;
free(delNode);
if (head != NULL)
{
head->prev = NULL;
}
if (head == NULL)
{
tail = NULL;
}
}
void removeTailDNode()
{
DNode* delNode;
if (head == NULL)
{
printf("\n\n\t\t연결리스트가 구성되자 않아 삭제할 데이터가 없습니다.\n");
return;
}
delNode = tail;
tail = tail->prev;
free(delNode);
printf("\n\n\t\t마지막 노드가 제거됐습니다.\n");
if(tail != NULL)
{
tail->next = NULL;
}
if(tail == NULL)
{
head = NULL;
}
}
void killer(int killN)
{
if (head == NULL)
{
return;
}
DNode* curNode = head;
DNode* delNode;
int isEnd = 0;
while (isEnd == 0)
{
for(int i = 1; i < killN; i++)
{
curNode = curNode->next;
if(curNode == NULL)
{
isEnd = 1;
break;
}
}
if (isEnd == 0)
{
delNode = curNode;
curNode = curNode->next;
if(delNode == head)
{
removeFirstDNode();
}
else if (delNode == tail)
{
removeTailDNode();
isEnd = 1;
}
else
{
delNode->prev->next = delNode->next;
delNode->next->prev = delNode->prev;
free(delNode);
printf("\n\n\t\t일반적인 노드 제거\n");
}
}
}
}