From e76832a30f8badca37aac1e64ffc3cdeb9c2f88a Mon Sep 17 00:00:00 2001 From: Syufan <zyf571635687@gmail.com> Date: Tue, 18 Apr 2023 20:52:18 +1000 Subject: [PATCH] Create allocate.c --- allocate.c | 792 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 792 insertions(+) create mode 100644 allocate.c diff --git a/allocate.c b/allocate.c new file mode 100644 index 0000000..c143198 --- /dev/null +++ b/allocate.c @@ -0,0 +1,792 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <math.h> + +typedef struct node process_n; +typedef struct memory memory_n; + +struct node { + int arrival_time; + char process_name[10]; + int time_required; + int time_required_orgin; + int memory; + char state[10]; + process_n* next; + process_n* pre; +}; + +typedef struct { + process_n* head; + process_n* foot; +} queue_n; + +struct memory{ + int memory_state; + int number; + char process_name[10]; + memory_n* next; +}; + +typedef struct{ + memory_n* head; + memory_n* foot; +} queue_memory; + +//---------signature---------// +void add_data(queue_n* q, int arrival_time, char* process_name, int time_required, int memory, char* state); +void add_node(queue_n* q, process_n* new_node); +void print_q(queue_n* q); +void read_data(char* filename, queue_n* batch_list); +void pickup_input(queue_n* batch_list, queue_n* input_list, int simulated_time); +void pickup_input_task3(queue_n* batch_list, queue_n* input_list, int simulated_time, queue_memory* memory_list); +void move_node(queue_n* q, process_n* node); +void dele_node(queue_n* q, process_n* node); +process_n* search_shortest_process(queue_n* q); +void add_node_to_list(memory_n* new_node, queue_memory* list); +memory_n* create_memory_node(int i); +int count_memory(queue_memory* q); +int allocate_memory(queue_memory* q, process_n* process, int simulated_time); +int find_position(memory_n* current_node,queue_memory* q); +void free_memory(queue_memory* q, process_n* process); +void print_by_size(queue_memory* q, int start, int num); + +int count_list(queue_n* q); +//---------signature end---------// + +int main(int argc, char *argv[]) { + + int quantum; + char line[100]; + char *filename = NULL; + int simulated_time = 0; + int remaining_time = 0; + char *scheduler_algorithm = NULL; + char *memory_strategy = NULL; + + //create batch list, input list and ready list + queue_n* batch_list = (queue_n*)malloc(sizeof(queue_n)); + batch_list->head = batch_list->foot = NULL; + queue_n* input_list = (queue_n*)malloc(sizeof(queue_n)); + input_list->head = input_list->foot = NULL; + queue_n* ready_list = (queue_n*)malloc(sizeof(queue_n)); + ready_list->head = ready_list->foot = NULL; + + //read the input + for (int i = 1; i < argc; i++) { + if (strcmp(argv[i], "-f") == 0 && i + 1 < argc) { + filename = argv[i + 1]; + read_data(filename, batch_list); + } else if (strcmp(argv[i], "-s") == 0 && i + 1 < argc) { + scheduler_algorithm = argv[i + 1]; + } else if (strcmp(argv[i], "-m") == 0 && i + 1 < argc) { + memory_strategy = argv[i + 1]; + } else if (strcmp(argv[i], "-q") == 0 && i + 1 < argc) { + quantum = atoi(argv[i + 1]); + } + } + + // create memory + queue_memory* memory_list = (queue_memory*)malloc(sizeof(queue_memory)); + memory_list->foot = memory_list->head = NULL; + // create node + for(int i=0; i < 2048; i++){ + memory_n* new_node = create_memory_node(i); + add_node_to_list(new_node,memory_list); + } + + //=================================TASK 1=================================// + if(strcmp(scheduler_algorithm,"SJF") == 0 && strcmp(memory_strategy,"infinite") == 0 ){ + // put all the process which arrive time <= simmulated time + pickup_input(batch_list, input_list, simulated_time); + double num = count_list(batch_list); + process_n* processing = NULL; + double turnaround_time = 0; + double end = 0; + double single = 0; + double time_overhead = 0; + double time_single = 0; + double max_time_overhead = 0; + while(input_list->head != NULL){ + // pick up the shortest by time_required + processing = search_shortest_process(input_list); + strcpy(processing->state, "RUNNING"); + printf("%d,%s,process_name=%s,remaining_time=%d \n",simulated_time,processing->state,processing->process_name,processing->time_required); + + remaining_time = processing->time_required; + while(remaining_time > 0){ + simulated_time+=quantum; + remaining_time-=quantum; + } + // calculate time + end = simulated_time; + single = end - processing->arrival_time; + turnaround_time += single; + time_single = single/processing->time_required; + if(max_time_overhead<time_single){ + max_time_overhead = time_single; + } + time_overhead += time_single; + + strcpy(processing->state, "FINISHED"); + // move finished process from input list + move_node(input_list, processing); + // add all process except this cycle + pickup_input(batch_list, input_list, simulated_time-quantum); + int proc_remaining = count_list(input_list); + printf("%d,%s,process_name=%s,proc_remaining=%d \n",simulated_time,processing->state,processing->process_name,proc_remaining); + // add all process + pickup_input(batch_list, input_list, simulated_time); + } + turnaround_time = round(turnaround_time/(num+1)); + time_overhead = time_overhead/(num+1); + printf("Turnaround time %0.f\nTime overhead %.2f %.2f \nMakespan %d\n",turnaround_time,max_time_overhead,time_overhead,simulated_time); + } + //================================TASK 1 END================================// + + //==================================TASK 2==================================// + else if(strcmp(scheduler_algorithm,"RR") == 0 && strcmp(memory_strategy,"infinite") == 0 ){ + double num = count_list(batch_list); + pickup_input(batch_list,ready_list,simulated_time); + process_n* current = ready_list->head; + process_n* box = NULL; + + + double turnaround_time = 0; + double end = 0; + double single = 0; + double time_overhead = 0; + double time_single = 0; + double max_time_overhead = 0; + + while(ready_list->head != NULL || batch_list->head != NULL){ + //pickup_input_task3(batch_list, ready_list, simulated_time, memory_list); + //print_q(ready_list); + if(ready_list->head == NULL){ + current = NULL; + goto finish; + } + if(current == NULL){ + current = ready_list->head; + } + int moved = 0; + // if process is compeleted + if(current->time_required <= 0){ + strcpy(current->state, "FINISHED"); + + end = simulated_time; + single = end - current->arrival_time; + turnaround_time += single; + time_single = single / current->time_required_orgin; + if(max_time_overhead < time_single){ + max_time_overhead = time_single; + } + time_overhead += time_single; + //int proc_remaining = count_list(ready_list); + + process_n* temp = ready_list->head; + int proc_remaining = 0; + while(temp != NULL){ + if(temp->arrival_time < simulated_time - quantum){ + proc_remaining ++; + } + temp = temp->next; + } + proc_remaining = proc_remaining - 1; + printf("%d,%s,process_name=%s,proc_remaining=%d\n",simulated_time,current->state,current->process_name,proc_remaining); + if(current->next != NULL){ + box = current->next; + }else if(current == ready_list->foot){ + box = ready_list->head; + } + dele_node(ready_list,current); + current = box; + moved = 1; + } + if(ready_list->foot != ready_list->head){ + // many nodes + if(strcmp(current->state,"null") == 0){ + // if there are many same nodes, just modify first one + strcpy(current->state, "RUNNING"); + printf("%d,%s,process_name=%s,remaining_time=%d \n",simulated_time,current->state,current->process_name,current->time_required); + current->time_required -= quantum; + goto finish; + } + strcpy(current->state, "READY"); + if(moved != 1){ + if(current->next != NULL){ + current = current->next; + }else if(current == ready_list->foot){ + current = ready_list->head; + } + } + if(strcmp(current->state,"null") == 0){ + strcpy(current->state, "RUNNING"); + printf("%d,%s,process_name=%s,remaining_time=%d \n",simulated_time,current->state,current->process_name,current->time_required); + current->time_required -= quantum; + }else if(strcmp(current->state,"READY") == 0){ + strcpy(current->state, "RUNNING"); + printf("%d,%s,process_name=%s,remaining_time=%d \n",simulated_time,current->state,current->process_name,current->time_required); + current->time_required -= quantum; + } + + } + if(current == ready_list->head && current == ready_list->foot){ + // there are only one process + if(strcmp(current->state,"RUNNING") != 0){ + strcpy(current->state, "RUNNING"); + printf("%d,%s,process_name=%s,remaining_time=%d \n",simulated_time,current->state,current->process_name,current->time_required); + } + current->time_required -= quantum; + } + finish: + simulated_time += quantum; + pickup_input(batch_list, ready_list, simulated_time); + } + printf("turnaround time = %f \n", num); + turnaround_time = ceil(turnaround_time/(num)); + time_overhead = time_overhead/(num); + printf("Turnaround time %0.f\nTime overhead %.2f %.2f \nMakespan %d\n",turnaround_time,max_time_overhead,time_overhead,simulated_time-quantum); + + } + //==================================TASK 2 END==================================// + + //==================================TASK 3==================================// + else if(strcmp(scheduler_algorithm,"RR") == 0 && strcmp(memory_strategy,"best-fit") == 0){ + + // pick up the process who's arrive time is suitable + pickup_input_task3(batch_list,ready_list,simulated_time,memory_list); + process_n* current = ready_list->head; + process_n* box = NULL; + + // make sure no process in ready list and batch list + while(ready_list->head != NULL || batch_list->head != NULL){ + // printf("\n===================start=============\n"); + // printf("%d\n", simulated_time); + // print_q(ready_list); + //int turn_on = 0; + // pickup_input_task3(batch_list, ready_list, simulated_time, memory_list); + while(ready_list->head == NULL && batch_list->head != NULL){ + + simulated_time+=quantum; + pickup_input_task3(batch_list,ready_list,simulated_time,memory_list); + //urn_on = 1; + } + if(current == NULL && ready_list->head != NULL){ + current = ready_list->head; + } + // if(ready_list->head==NULL){ + // pickup_input(batch_list,ready_list,simulated_time,memory_list); + // } + //printf("%d\n", simulated_time); + //printf("xxxxxx current name = %s , arrive time = %d \n",current->process_name,current->arrival_time); + // if(ready_list->head == NULL){ + // printf("马上运行\n"); + // current = NULL; + // goto finish_task3; + // } + // printf("马上运行\n"); + // if(current == NULL){ + // current = ready_list->head; + // //printf("890809current = null\n"); + // //printf("current name = %s , arrive time = %d \n",current->process_name,current->arrival_time); + // } + // int moved = 0; + + // if process is compeleted + if(current->time_required <= 0){ + + strcpy(current->state, "FINISHED"); + free_memory(memory_list,current); + int proc_remaining = count_list(ready_list) - 1; + printf("%d,%s,process_name=%s,proc_remaining=%d\n",simulated_time,current->state,current->process_name,proc_remaining); + + + if (proc_remaining == 0){ + box = NULL; + }else{ + if(current->next != NULL && current != ready_list->foot){ + box = current->next; + } + else if(current == ready_list->foot){ + box = ready_list->head; + } + } + + dele_node(ready_list,current); + current = box; + //moved = 1; + if(current == NULL){ + pickup_input_task3(batch_list,ready_list,simulated_time,memory_list); + if(ready_list->head != NULL){ + current = ready_list->head; + } + else{ + goto finish_task3; + } + } + } + if(ready_list->foot != ready_list->head){ + // many nodes + if(strcmp(current->state,"null") == 0){ + // if there are many same nodes, just modify first one + // start + //printf("%d,%s,process_name=%s,assigned_at=%d",simulated_time,current->state,); + //strcpy(current->state, "READY"); + //printf("======allocate memory\n"); + //print_by_size(memory_list,0,80); + //allocate_memory(memory_list,current,simulated_time); + strcpy(current->state, "RUNNING"); + printf("%d,%s,process_name=%s,remaining_time=%d \n",simulated_time,current->state,current->process_name,current->time_required); + current->time_required -= quantum; + //goto finish; + } + strcpy(current->state, "READY"); + //if(moved != 1){ + if(current->next != NULL){ + current = current->next; + }else if(current == ready_list->foot){ + current = ready_list->head; + } + //} + if(strcmp(current->state,"null") == 0){ + //printf("======allocate memory\n"); + //strcpy(current->state, "READY"); + //allocate_memory(memory_list,current,simulated_time); + strcpy(current->state, "RUNNING"); + printf("%d,%s,process_name=%s,remaining_time=%d \n",simulated_time,current->state,current->process_name,current->time_required); + current->time_required -= quantum; + }else if(strcmp(current->state,"READY") == 0){ + strcpy(current->state, "RUNNING"); + printf("%d,%s,process_name=%s,remaining_time=%d \n",simulated_time,current->state,current->process_name,current->time_required); + current->time_required -= quantum; + } + + } + if(current == ready_list->head && current == ready_list->foot){ + // there are only one process + if(strcmp(current->state,"RUNNING") != 0){ + //printf("马上运行\n"); + //printf("process_name=,assigned_at=\n"); + //strcpy(current->state, "READY"); + //print_by_size(memory_list,0,40); + //printf("allocation one process memory\n"); + //allocate_memory(memory_list,current,simulated_time); + strcpy(current->state, "RUNNING"); + printf("%d,%s,process_name=%s,remaining_time=%d \n",simulated_time,current->state,current->process_name,current->time_required); + } + current->time_required -= quantum; + } + finish_task3: + //if(turn_on == 0){ + pickup_input_task3(batch_list, ready_list, simulated_time, memory_list); + simulated_time += quantum; + //} + + // printf("提前减少的下半时区\n"); + if(current == NULL && ready_list->head != NULL){ + current = ready_list->head; + } + // printf("\n\nready List:\n"); + // print_q(ready_list); + } + + } + // 打印解析的参数 + // printf("memory_strategy = %s ", memory_strategy); + // printf("quantum = %d\n", quantum); + + //=====================Task 3 sjf===================// + if(strcmp(scheduler_algorithm,"SJF") == 0 && strcmp(memory_strategy,"best-fit") == 0){ + // put all the process which arrive time <= simmulated time + pickup_input_task3(batch_list, input_list, simulated_time,memory_list); + + process_n* processing = NULL; + while(input_list->head != NULL){ + // pick up the shortest by time_required + processing = search_shortest_process(input_list); + strcpy(processing->state, "RUNNING"); + printf("%d,%s,process_name=%s,remaining_time=%d \n",simulated_time,processing->state,processing->process_name,processing->time_required); + + remaining_time = processing->time_required; + while(remaining_time > 0){ + simulated_time+=quantum; + remaining_time-=quantum; + } + strcpy(processing->state, "FINISHED"); + // move finished process from input list + move_node(input_list, processing); + // add all process except this cycle + pickup_input_task3(batch_list, input_list, simulated_time-quantum,memory_list); + int proc_remaining = count_list(input_list); + printf("%d,%s,process_name=%s,proc_remaining=%d \n",simulated_time,processing->state,processing->process_name,proc_remaining); + // add all process + pickup_input_task3(batch_list, input_list, simulated_time,memory_list); + } + } + return 0; +} + +//---------------functions---------------// + +int allocate_memory(queue_memory* q, process_n* process, int simulated_time){ + int min = -1; + memory_n* min_start = NULL; + memory_n* min_end = NULL; + memory_n* temp = q->head; + + //printf("**************memory**************\n"); + while(temp->next != NULL && temp != NULL){ + //printf("bug121\n"); + // find the start of 0 + while(temp->memory_state != 0 && temp->next != NULL){ + temp = temp->next; + } + memory_n* temp_start = temp; + + // find the end of 0/ + int count_memory = 1; + while(temp->memory_state != 1 && temp->next!=NULL){ + temp = temp->next; + count_memory++; + } + memory_n* temp_end = temp; + + //printf("start = %d, end = %d \n",temp_start->number,temp_end->number); + // printf("count_memory end = %d \n",temp->number); + //printf("count_memory = %d \n",count_memory); + + // check the memeory size + if(count_memory < process->memory){ + return 0; + } + if (count_memory == process->memory){ + //printf("true\n"); + // 直接赋值,用temp start开始 + //printf("go in to ready 1 start = %d, end = %d process memory%d\n\n",temp_start->number,temp_end->number, process->memory); + memory_n* temp_allocate = temp_start; + for (int i = 0; i < process->memory; i++){ + //循环正常 + + temp_allocate -> memory_state = 1; + strcpy(temp_allocate->process_name,process->process_name); + temp_allocate = temp_allocate->next; + // temp = temp_start; + // temp->memory_state = 1; + // strcpy(temp_start->process_name,process->process_name); + // temp = temp->next; + } + //int location = find_position(temp_start,q); + //printf("finish ready 1 start = %d memory state = %d process name = %s \n\n",temp_start->number,temp_start->memory_state,temp_start->process_name); + //printf("finish ready 1 start = %d memory state = %d process name = %s \n\n",temp_start->next->number,temp_start->next->memory_state,temp_start->next->process_name); + //printf("finish ready 1 start = %d memory state = %d process name = %s \n\n",temp_start->next->next->number,temp_start->next->next->memory_state,temp_start->next->next->process_name); + printf("%d,READY,process_name=%s,assigned_at=%d\n",simulated_time, process->process_name, temp_start->number); + return 1; + }else if(count_memory > process->memory){ + if(min == -1){ + min = count_memory; + min_start = temp_start; + min_end = temp_end; + }else{ + // compare to get min + if(min > count_memory){ + min = count_memory; + min_start = temp_start; + min_end = temp_end; + } + } + } + } + //printf("bug2\n"); + + int position = find_position(min_start,q); + // printf("===========min = %d start=%d %d\n", min, position,process->memory); + int size = min_end->number - min_start->number + 1; + if(min != -1){ + //printf("enter min, process size = %d memory size = %d\n",process->memory,size); + if (process->memory){ + for (size_t i = 0; i < process->memory; i++){ + min_start->memory_state = 1; + strcpy(min_start->process_name,process->process_name); + //printf("number %d state = %d name= %s\n",min_start->number,min_start->memory_state, min_start->process_name); + min_start = min_start->next; + // temp = min_start; + // temp = temp->next; + } + printf("%d,READY,process_name=%s,assigned_at=%d\n",simulated_time, process->process_name, position); + return 1; + } + return 0; + } + // print_by_size(q,0,50); + // printf("\n\n\n\n"); + return 0; +} +void print_by_size(queue_memory* q, int start, int num){ + memory_n* temp = q->head; + // find the start point + while(temp->number != start){ + temp = temp->next; + } + for(int i = 0; i < num; i++){ + printf("number = %d memory state = %d,process name = %s\n",temp->number,temp->memory_state, temp->process_name); + temp = temp->next; + } + +} + +void free_memory(queue_memory* q, process_n* process){ + memory_n* temp = q->head; + // firstly, find the location where need free + while(strcmp(temp->process_name,process->process_name) != 0 && temp->next != NULL){ + temp = temp->next; + } + + while(strcmp(temp->process_name,process->process_name)==0 && temp->next != NULL){ + temp->memory_state = 0; + strcpy(temp->process_name,"null"); + temp = temp->next; + } +} +int find_position(memory_n* current_node,queue_memory* q){ + int position = 0; + memory_n* temp = q->head; + while(temp != current_node){ + temp = temp->next; + position++; + } + return position; +} + +int count_memory(queue_memory* q){ + memory_n* temp = q->head; + int num = 0; + while(temp != NULL){ + if(temp->memory_state == 0){ + temp = temp->next; + num ++; + } + } + return num; +} + +// add node to list +void add_node_to_list(memory_n* new_node, queue_memory* list) { + if (list->head == NULL) { + list->head = new_node; + list->foot = new_node; + } else { + list->foot->next = new_node; + list->foot = new_node; + } +} + +// create node +memory_n* create_memory_node(int i) { + memory_n* node = (memory_n*)malloc(sizeof(memory_n)); + strcmp(node->process_name,"null"); + node->number = i; + node->memory_state = 0; + node->next = NULL; + return node; +} + +// delete node +// received list and node need to dispare, disconnect current node from current list +void dele_node(queue_n* q, process_n* node){ + // In the head + if (node == q->head) { + // Only one node in the list + if (q->head == q->foot) { + q->head = q->foot = NULL; + } else { + // More than one node in the list + q->head = node->next; + node->next->pre = NULL; + node->next = NULL; + } + } + // In the middle + else { + // In the foot + if (node == q->foot) { + node->pre->next = NULL; + q->foot = node->pre; + node->pre = NULL; + } else { + // In the middle + node->pre->next = node->next; + node->next->pre = node->pre; + node->pre = node->next = NULL; + } + } + free(node); +} + +int count_list(queue_n* q){ + process_n* temp = q->head; + int num = 0; + while(temp != NULL){ + temp = temp->next; + num ++; + } + return num; +} + +// receive a list find the shortest. +process_n* search_shortest_process(queue_n* q){ + process_n* shortest = q->head; + process_n* temp = q->head->next; + while (temp != NULL) { + if (temp->time_required < shortest->time_required) { + shortest = temp; + } + else if (temp->time_required == shortest->time_required && temp->arrival_time < shortest->arrival_time){ + shortest = temp; + } else if (temp->time_required == shortest->time_required && temp->arrival_time == shortest->arrival_time && (strcmp(temp->process_name,shortest->process_name)<0)) { + shortest = temp; + } + temp = temp->next; + } + return shortest; +} +// receive two list, put the process which arrived time is <= simulated_time +void pickup_input_task3(queue_n* batch_list, queue_n* input_list, int simulated_time, queue_memory* memory_list){ + process_n* temp = batch_list->head; + while (temp != NULL) { + //find arrive time <=> simulated-time + if(temp->arrival_time <= simulated_time){ + process_n* temp_next = temp->next; + int sta = allocate_memory(memory_list,temp,simulated_time); + + //cleaprintf("allocate memory: %d \n",temp->memory); + // printf("============%d\n", sta); + if (sta==1){ + //1.delete node from current list + move_node(batch_list, temp); + //2.add node to aim list + add_node(input_list, temp); + //allocate_memory(memory_list,temp,simulated_time); + } + temp = temp_next; + }else{ + temp = temp->next; + } + } + +} + +// receive two list, put the process which arrived time is <= simulated_time +void pickup_input(queue_n* batch_list, queue_n* input_list, int simulated_time){ + process_n* temp = batch_list->head; + while (temp != NULL) { + //find arrive time <=> simulated-time + if(temp->arrival_time <= simulated_time){ + process_n* temp_next = temp->next; + + //cleaprintf("allocate memory: %d \n",temp->memory); + // printf("============%d\n", sta); + //1.delete node from current list + move_node(batch_list, temp); + //2.add node to aim list + add_node(input_list, temp); + //allocate_memory(memory_list,temp,simulated_time); + temp = temp_next; + }else{ + temp = temp->next; + } + } + +} + +// received list and node need to dispare, disconnect current node from current list +void move_node(queue_n* q, process_n* node){ + // In the head + if (node == q->head) { + // Only one node in the list + if (q->head == q->foot) { + q->head = q->foot = NULL; + } else { + // More than one node in the list + q->head = node->next; + node->next->pre = NULL; + node->next = NULL; + } + } + // In the middle + else { + // In the foot + if (node == q->foot) { + node->pre->next = NULL; + q->foot = node->pre; + node->pre = NULL; + } else { + // In the middle + node->pre->next = node->next; + node->next->pre = node->pre; + node->pre = node->next = NULL; + } + } + +} + +// receive filename and linked list, then save all the input into list +void read_data(char* filename, queue_n* batch_list) { + char line[100]; + FILE *fp; + fp = fopen(filename, "r"); + if (fp == NULL) { + printf("can't open file %s\n", filename); + exit(1); + } + + //save data into batch_list + while (fgets(line, sizeof(line), fp)) { + int arrival_time, time_required, memory_size; + char process_name[10]; + sscanf(line, "%d %s %d %d", &arrival_time, process_name, &time_required, &memory_size); + add_data(batch_list, arrival_time, process_name, time_required, memory_size, "null"); + } + + fclose(fp); +} + +// receive data, save in node add then save into linked list +void add_data(queue_n* q, int arrival_time, char* process_name, int time_required, int memory, char* state) { + process_n* new_node = (process_n*)malloc(sizeof(process_n)); + new_node->arrival_time = arrival_time; + //strncpy(new_node->process_name, process_name, 9); + strcpy(new_node->process_name, process_name); + //new_node->process_name[9] = '\0'; + new_node->time_required = time_required; + new_node->time_required_orgin = time_required; + new_node->memory = memory; + strcpy(new_node->state, state); + new_node->next = new_node->pre = NULL; + add_node(q, new_node); +} + +// receive q linked list and new node, add node into linked list +void add_node(queue_n* q, process_n* new_node) { + if (q->head == NULL){ + q->head = new_node; + q->foot = new_node; + }else{ + new_node->pre = q->foot; + q->foot->next = new_node; + q->foot = new_node; + } +} + +// receive linked list then print it +void print_q(queue_n* q) { + process_n* temp = q->head; + while (temp != NULL) { + printf("arrival_time = %d, process_name = %s, time_required = %d, memory = %d, state = %s\n", temp->arrival_time, temp->process_name, temp->time_required, temp->memory, temp->state); + temp = temp->next; + } +} + +//---------------functions end---------------// \ No newline at end of file -- GitLab