--- tags: sysprog2020 --- # 2020q3 Homework1 (lab0) contributed by < `mingjer` > ## Outline ## 環境 ```shell $ uname -a Linux kdd179 5.4.0-47-generic #51-Ubuntu SMP Fri Sep 4 19:50:52 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux $ gcc --version gcc (Ubuntu 9.3.0-10ubuntu2) 9.3.0 Copyright (C) 2019 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ``` ## 作業要求 在 ``queue.[c/h]`` 中完成以下實作 * `q_new`: 建立新的「空」佇列; * `q_free`: 釋放佇列所佔用的記憶體; * `q_insert_head`: 在佇列開頭 (head) 加入 (insert) 給定的新元素 (以 LIFO 準則); * `q_insert_tail`: 在佇列尾端 (tail) 加入 (insert) 給定的新元素 (以 FIFO 準則); * `q_remove_head`: 在佇列開頭 (head) 移除 (remove) 給定的元素。 * `q_size`: 計算佇列中的元素數量。 * `q_reverse`: 以反向順序重新排列鏈結串列,該函式不該配置或釋放任何鏈結串列元素,換言之,它只能重排已經存在的元素; * `q_sort`: 以==遞增順序==來排序鏈結串列的元素 ## 實作流程 ### queue.h * 為了讓 `q_size` 和 `q_insert_tail` 兩個funtion能在 $O(1)$ 時間內完成 * 在 `queue_t` 中新增兩個參數 ( `tail`, `size` ) ```cpp /* Queue structure */ typedef struct { /* Linked list of elements */ /* TODO: You will need to add more fields to this structure * to efficiently implement q_size and q_insert_tail. */ /* TODO: Remove the above comment when you are about to implement. */ list_ele_t *head; list_ele_t *tail; int size; } queue_t; ``` ### queue.c * **q_new** * 先確認malloc有分配給記憶體 * 有分配 : 初始所有參數 * 沒分配 : 回傳 NULL ```cpp queue_t *q_new() { queue_t *q = malloc(sizeof(queue_t)); /* TODO: What if malloc returned NULL? */ if(q != NULL) { q->head = NULL; q->tail = NULL; q->size = 0; return q; } else { return NULL; } } ``` * **q_free** * **q_insert_head** ```cpp bool q_insert_head(queue_t *q, char *s) { list_ele_t *newh; /* TODO: What should you do if the q is NULL? */ if(q == NULL) { return FALSE; } newh = malloc(sizeof(list_ele_t)); if(newh == NULL) { return FALSE; } /* Don't forget to allocate space for the string and copy it */ newh->value = malloc(sizeof(s)); /* What if either call to malloc returns NULL? */ newh->next = q->head; q->head = newh; return true; } ``` * **q_insert_tail** * **q_remove_head** * **q_size** * 因為要在 $O(1)$時間內完成,所以不能走訪每個節點來計算 * 直接從 `q->size` 中取值,就可以在 $O(1)$ 內完成 ```cpp int q_size(queue_t *q) { /* TODO: You need to write the code for this function */ /* Remember: It should operate in O(1) time */ /* TODO: Remove the above comment when you are about to implement. */ if(q != NULL) { return q->size; } else { return 0; } } ``` * **q_reverse** * **q_sort**