/
Stasukevich
/
course_prog4linux
Обзор
Документация
Войти
/
Stasukevich
/
course_prog4linux
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
p14/deque.c
205 строк
5 KB
Stasukevich
new file: p11/.vscode/launch.json
15 июн 2026, 00:34
15 июн 2026, 00:34
c630964
Код
Авторство
О чём код?
#include "deque.h" #include <stdio.h> #include <stdlib.h> #include <string.h> // Создание новой дека Deque* deque_create(void) { Deque* d = (Deque*)malloc(sizeof(Deque)); if (!d) { fprintf(stderr, "Ошибка: не удалось выделить память для дека\n"); return NULL; } d->head = NULL; d->tail = NULL; d->size = 0; return d; } // Уничтожение дека и освобождение памяти void deque_destroy(Deque* d) { if (!d) return; deque_clear(d); free(d); } // Очистка дека (удаление всех элементов) void deque_clear(Deque* d) { if (!d) return; DequeNode* current = d->head; while (current != NULL) { DequeNode* temp = current; current = current->next; free(temp); } d->head = NULL; d->tail = NULL; d->size = 0; } // Проверка, пуста ли дека bool deque_is_empty(const Deque* d) { return d == NULL || d->size == 0; } // Получение количества элементов int deque_size(const Deque* d) { return d ? d->size : 0; } // Добавление элемента в начало bool deque_push_front(Deque* d, const char* value) { if (!d || !value) return false; DequeNode* new_node = (DequeNode*)malloc(sizeof(DequeNode)); if (!new_node) { fprintf(stderr, "Ошибка: не удалось выделить память для узла\n"); return false; } strncpy(new_node->data, value, MAX_STRING_LEN - 1); new_node->data[MAX_STRING_LEN - 1] = '\0'; new_node->prev = NULL; new_node->next = d->head; if (d->head == NULL) { // Дека была пуста d->tail = new_node; } else { d->head->prev = new_node; } d->head = new_node; d->size++; return true; } // Удаление элемента из начала bool deque_pop_front(Deque* d, char* result) { if (!d || deque_is_empty(d)) return false; DequeNode* old_head = d->head; if (result) { strncpy(result, old_head->data, MAX_STRING_LEN - 1); result[MAX_STRING_LEN - 1] = '\0'; } d->head = old_head->next; if (d->head == NULL) { // Дека стала пуста d->tail = NULL; } else { d->head->prev = NULL; } free(old_head); d->size--; return true; } // Просмотр первого элемента без удаления bool deque_peek_front(const Deque* d, char* result) { if (!d || deque_is_empty(d) || !result) return false; strncpy(result, d->head->data, MAX_STRING_LEN - 1); result[MAX_STRING_LEN - 1] = '\0'; return true; } // Добавление элемента в конец bool deque_push_back(Deque* d, const char* value) { if (!d || !value) return false; DequeNode* new_node = (DequeNode*)malloc(sizeof(DequeNode)); if (!new_node) { fprintf(stderr, "Ошибка: не удалось выделить память для узла\n"); return false; } strncpy(new_node->data, value, MAX_STRING_LEN - 1); new_node->data[MAX_STRING_LEN - 1] = '\0'; new_node->prev = d->tail; new_node->next = NULL; if (d->tail == NULL) { // Дека была пуста d->head = new_node; } else { d->tail->next = new_node; } d->tail = new_node; d->size++; return true; } // Удаление элемента из конца bool deque_pop_back(Deque* d, char* result) { if (!d || deque_is_empty(d)) return false; DequeNode* old_tail = d->tail; if (result) { strncpy(result, old_tail->data, MAX_STRING_LEN - 1); result[MAX_STRING_LEN - 1] = '\0'; } d->tail = old_tail->prev; if (d->tail == NULL) { // Дека стала пуста d->head = NULL; } else { d->tail->next = NULL; } free(old_tail); d->size--; return true; } // Просмотр последнего элемента без удаления bool deque_peek_back(const Deque* d, char* result) { if (!d || deque_is_empty(d) || !result) return false; strncpy(result, d->tail->data, MAX_STRING_LEN - 1); result[MAX_STRING_LEN - 1] = '\0'; return true; } // Печать всех элементов дека void deque_print(const Deque* d) { if (!d || deque_is_empty(d)) { printf("Дека пуста\n"); return; } printf("Дека (head -> tail): "); DequeNode* current = d->head; while (current != NULL) { printf("[%s]", current->data); if (current->next != NULL) { printf(" <-> "); } current = current->next; } printf(" (размер: %d)\n", d->size); } // Получение элемента по индексу (0-based) bool deque_get(const Deque* d, int index, char* result) { if (!d || !result || index < 0 || index >= d->size) return false; DequeNode* current = d->head; for (int i = 0; i < index; i++) { current = current->next; } strncpy(result, current->data, MAX_STRING_LEN - 1); result[MAX_STRING_LEN - 1] = '\0'; return true; }