contributed by < BWbwchen
>
$ uname -a
Linux bw-pc 4.19.102-1-MANJARO #1 SMP Wed Feb 5 19:48:44 UTC 2020 x86_64 GNU/Linux
$ gcc --version
gcc (GCC) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
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
: 以遞增順序來排序鏈結串列的元素q_insert_tail
和 q_size
可以為 tail
和 size
typedef struct {
list_ele_t *head; /* Linked list of elements */
list_ele_t *tail;
int size;
} queue_t;
queue_t *q_new()
{
queue_t *q = malloc(sizeof(queue_t));
if (q == NULL)
return NULL;
q->head = NULL;
q->tail = NULL;
q->size = 0;
return q;
}
value
也是經由 malloc 取得的,因此也要 free
void q_free(queue_t *q)
{
if (q == NULL)
return;
while (q->head) {
list_ele_t *tmp = q->head;
q->head = q->head->next;
free(tmp->value);
free(tmp);
}
free(q);
}
bool q_insert_head(queue_t *q, char *s)
{
if (q == NULL)
return false;
list_ele_t *newh;
newh = malloc(sizeof(list_ele_t));
if (newh == NULL)
return false;
newh->value = malloc((strlen(s) + 1) * sizeof(char));
if (newh->value == NULL) {
free(newh);
return false;
}
strncpy(newh->value, s, strlen(s));
newh->value[strlen(s)] = '\0';
if (q->head == NULL) {
q->tail = newh;
}
newh->next = q->head;
q->head = newh;
q->size++;
return true;
}
bool q_insert_tail(queue_t *q, char *s)
{
if (q == NULL)
return false;
list_ele_t *tmp;
tmp = malloc(sizeof(list_ele_t));
if (tmp == NULL)
return false;
tmp->next = NULL;
tmp->value = malloc((strlen(s) + 1) * sizeof(char));
if (tmp->value == NULL && strlen(s) != 0) {
free(tmp);
return false;
}
strncpy(tmp->value, s, strlen(s));
tmp->value[strlen(s)] = '\0';
if (q->tail == NULL) {
q->head = tmp;
} else {
q->tail->next = tmp;
}
q->tail = tmp;
q->size++;
return true;
}
bool q_remove_head(queue_t *q, char *sp, size_t bufsize)
{
if (q == NULL || q->head == NULL)
return false;
if (sp != NULL) {
strncpy(sp, q->head->value, bufsize - 1);
sp[bufsize - 1] = '\0';
}
if (q->head->next == NULL) {
free(q->head->value);
free(q->head);
q->head = NULL;
q->tail = NULL;
q->size = 0;
return true;
}
list_ele_t *tmp;
tmp = q->head;
q->head = q->head->next;
q->size--;
free(tmp->value);
free(tmp);
return true;
}
int q_size(queue_t *q)
{
return !q ? 0 : q->size;
}
void q_reverse(queue_t *q)
{
if (q == NULL || q->head == NULL || q->size == 1)
return;
list_ele_t *pre = NULL, *now = q->head, *after = q->head->next;
q->tail = q->head;
while (after) {
now->next = pre;
pre = now;
now = after;
after = after->next;
}
now->next = pre;
q->head = now;
}
list_ele_t *merge_sort(list_ele_t *start)
{
if (start == NULL || start->next == NULL)
return start;
list_ele_t *mid;
mid = get_mid(start);
list_ele_t *right = mid->next;
mid->next = NULL;
return merge_list(merge_sort(start), merge_sort(right));
}
list_ele_t *get_mid(list_ele_t *start)
{
if (start == NULL)
return start;
list_ele_t *slow = start, *fast = start;
while (fast->next != NULL && fast->next->next != NULL) {
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
list_ele_t *merge_list(list_ele_t *left, list_ele_t *right)
{
// Merge
list_ele_t *start = NULL;
for (list_ele_t *merge = NULL; left || right;) {
if (!right || (left && strcmp(left->value, right->value) < 0)) {
if (!merge) {
start = merge = left;
} else {
merge->next = left;
merge = merge->next;
}
left = left->next;
} else {
if (!merge) {
start = merge = right;
} else {
merge->next = right;
merge = merge->next;
}
right = right->next;
}
}
return start;
}
contributed by < BWbwchen > 開發環境 $ uname -a Linux bw_workstation 4.15.0-166-generic #174-Ubuntu SMP Wed Dec 8 19:07:44 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux $ gcc --version gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0 Copyright (C) 2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO
Feb 20, 2022:::info 目的: 檢驗學員對 linked list 的認知 ::: ==作答表單== 測驗 1 考慮一個單向 linked list: typedef struct __list {
Feb 21, 2020or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up