일단 원본코드는 다음과 같습니다.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define TRUE 1
#define FALSE 0
#define MAX_QUEUE_SIZE 100
typedef struct {
int id;
int arrival_time;
int service_time;
}element;
typedef struct {
element queue[MAX_QUEUE_SIZE];
int front, rear;
}QueueType;
QueueType queue;
//
void error(char* message) {
fprintf(stderr, " % s\n", message);
exit(1);
}
//
void init(QueueType* q) {
q->front = q->rear = 0;
}
//공백 상태 검출 함수
int is_empty(QueueType* q) {
return (q->front == q->rear);
}
//포화 상태 검출 함수
int is_full(QueueType* q) {
return ((q->rear + 1) % MAX_QUEUE_SIZE == q->front);
}
//삽입 함수
void enqueue(QueueType* q, element item) {
if (is_full(q))
error("큐가 포화상태입니다");
q->rear = (q->rear + 1) % MAX_QUEUE_SIZE;
q->queue[q->rear] = item;
}
//삭제 함수
element dequeue(QueueType* q) {
if (is_empty(q))
error("큐가 공백상태입니다");
q->front = (q->front + 1) % MAX_QUEUE_SIZE;
return q->queue[q->front];
}
//삭제 함수
element peek(QueueType* q) {
if (is_empty(q))
error("큐가 공백상태입니다");
return q->queue[(q->front + 1) % MAX_QUEUE_SIZE];
}
//삽입 함수
double random() {
return rand() / (double)RAND_MAX;
}
//시뮬레이션에 필요한 여러가지 상태 변수
int duration = 10; //시뮬레이션 시간
double arrival_prob = 0.7; //하나의 시간단위에 도착하는 평균 고객의 수
int max_serv_time = 5; //하나의 고객에 대한 최대 서비스 시간
int clock;
//시뮬레이션의 결과에 쓰이는 변수
int customers; //전체 고객수
int served_customers; //서비스받은 고객수
int waited_time; //고객들이 기다린 시간
//랜덤 숫자를 생성하여 고객이 도착했는지 도착하지 않았는지를 판단
int is_customer_arrived() {
if (random() < arrival_prob)
return TRUE;
else return FALSE;
}
//새로 도착한 고객을 큐에 삽입
void insert_customer(int arrival_time) {
element customer;
customer.id = customers++;
customer.arrival_time = arrival_time;
customer.service_time = (int)(max_serv_time * random()) + 1;
enqueue(&queue, customer);
printf("고객 % d이 % d 분에 들어옵니다.서비스 시간은 % d 분입니다.\n", customer.id,
customer.arrival_time, customer.service_time);
}
//큐에서 기다리는 고객을 꺼내어 고객의 서비스 시간을 반환한다
int remove_customer() {
element customer;
int service_time = 0;
if (is_empty(&queue)) return 0;
customer = dequeue(&queue);
service_time = customer.service_time - 1;
served_customers++;
waited_time += clock - customer.arrival_time;
printf("고객 % d이 % d 분에 서비스를 시작합니다.대기시간은 % d 분이었습니다.\n",
customer.id, clock, clock - customer.arrival_time);
return service_time;
}
//통계치를 출력한다
void print_stat() {
printf("서비스를 받은 고객수 = % d\n", served_customers);
printf("전체 대기시간 = % d\n", waited_time);
printf("1인당 평균대기 시간 = % f\n", (double)waited_time /(double) served_customers);
printf("아직 대기중인 고객수 = % d\n", customers - served_customers);
}
//시뮬레이션 프로그램
void main(){
int service_time=0;
clock=0;
while(clock < duration){
clock++;
printf("현재시각=%d\n",clock);
if (is_customer_arrived()) {
insert_customer(clock);
}
if (service_time > 0) service_time--;
else service_time = remove_customer();
}
print_stat();
}
해당결과물은 다음과 같고요

그런데 해당코드를 링크드 리스트로 만들려는데 다음과 같은 코드로 만들었더니:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<stdbool.h>
typedef struct {
int no;
int arr_time;
int ser_time;
}element;
typedef int tem;
typedef struct queueType* Queue;
struct node {
tem data;
struct node* next;
};
typedef struct queueType {
struct node* front;
struct node* rear;
int size;
}queueType;
queueType q;
void error(const char* message) {
printf("%s\n", message);
exit(1);//탈출? :네
}
double random() {
return rand() / (double)RAND_MAX;
}
tem peek(Queue q) {
//if (isEmpty(q))
if(q->front == NULL)
error("값출력 불가 큐 비어있음");
return q->front->data;
}
Queue init() {
Queue q = (Queue)malloc(sizeof(struct queueType));
if (q == NULL)
error("생성 오류 발생 큐 생성 불가");
q->front = NULL;
q->rear = NULL;
q->size = 0;
return q;
}
void delete(Queue q) {
makeEmpty(q);
deQueue(q);
q->size = 0;
free(q);
}
void makeEmpty(Queue q) {
while (!isEmpty(q))
deQueue(q);
q->size = 0;
}
bool isEmpty(Queue q) {
return q->front == NULL;
/*
* return q->front == NULL
* return q->size == 0
* 둘다가능
*/
}
void enQueue(Queue q, tem i) {
struct node* new_node = (struct node*)malloc(sizeof(struct node));
if (new_node == NULL)
error("새로운 값 넣기 실패, 큐가 가득참");
new_node->data = i;
new_node->next = NULL;
if (q->front == NULL) {
q->front = new_node;
q->rear = new_node;
}
else {
q->rear->next = new_node;
q->rear = new_node;
}
q->size++;
}
tem deQueue(Queue q) {
struct node* oldFront;
tem i;
if (isEmpty(q))
error("덱실패 큐가 비어 있음");
oldFront = q->front;
i = oldFront->data;
q->front = oldFront->next;
if (q->front == NULL)
q->rear = NULL;
free(oldFront);
q->size--;
return i;
}
int dura = 10l;
double ari_Prob = 0.7;
int maxsurvtime = 5;
int clock;
int customers;
int s_customer;
int wait_time;
int isCostomerArrived() {
if (random() < ari_Prob)
return true;
else
return false;
}
void print_stat() {
printf("서비스를 받은 고객수 = %d\n", s_customer);
printf("전체 대기시간 = %d\n", wait_time);
printf("아직도 대기중인 고객수= %d\n", customers - s_customer);
}
void insertCustomer(int arrivaltime) {
element customer;
customer.no = customers++;
customer.arr_time = arrivaltime;
customer.ser_time =
(int)(maxsurvtime * random()) + 1;
enQueue(&q, customer.no);
printf("고객 %d이 %d분에 들어옵니다. 서비스시간은 %d 분입다.\n", customer.no, customer.arr_time, customer.ser_time);
}
int removeCustomer() {
element customer;
int ser_time = 0;
if (isEmpty(&q)) return 0;
customer.no = deQueue(&q);
ser_time = customer.ser_time - 1;
s_customer++;
wait_time += clock - customer.arr_time;
printf("고객 %d이 %d분에 서비스를 시작합니다. 대기시간은 %d분 이었습니다.\n", customer.no, clock, clock - customer.arr_time);
}
void main() {
int service_time = 0;
clock = 0;
while (clock < dura) {
clock++;
printf("현재시각=%d\n", clock);
if (isCostomerArrived()) {
insertCustomer(clock);
}
if (service_time > 0) service_time--;
else service_time = removeCustomer();
}
print_stat();
}
이런 오류가 나오네요 ㅠㅠ:
이게 왜이러는 거죠?ㅠㅠ