Елизавета Бардынина
S:09:18:59 15.12
R:00:00:00 00.00
👨🎓 • #include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Book {
char title[51]; // название книги (до 50 символов)
char author[41]; // автор (до 40 символов)
int year; // год издания
int available; // наличие (0 или 1)
struct Book [club6386|*next]; // указатель на следующий элемент
} Book;
/* Добавление с автоматической вставкой по title (алфавит) */
Book *addBookSorted(Book *head, Book [club151055698|*newBook]) {
if (!head || strcmp(newBook->title, head->title) < 0) {
newBook->next = head;
return newBook;
}
Book *cur = head;
while (cur->next && strcmp(cur->next->title, newBook->title) < 0) {
cur = cur->next;
}
newBook->next = cur->next;
cur->next = newBook;
return head;
}
/* Ввод одной книги с клавиатуры */
Book [club140460315|) {
Book *b = (Book *]malloc(sizeof(Book));
if (!b) {
printf("Ошибка выделения памяти.
");
return NULL;
}
printf("Введите название: ");
fgets(b->title, 51, stdin);
b->title[strcspn(b->title, "
")] = '';
printf("Введите автора: ");
fgets(b->author, 41, stdin);
b->author[strcspn(b->author, "
")] = '';
printf("Введите год издания: ");
scanf("%d", &b->year);
printf("Наличие (1 - есть, 0 - нет): ");
scanf("%d", &b->available);
while (getchar() != '
'); // очистка буфера
b->next = NULL;
return b;
}
/* 2. Вывод всего списка */
void printBook(const Book *b) {
printf("Название : %s
", b->title);
printf("Автор : %s
", b->author);
printf("Год : %d
", b->year);
printf("Наличие : %s
", b->available ? "есть" : "нет");
printf("------------------------
");
}
void printList(const Book *head) {
if (!head) {
printf("Список пуст.
");
return;
}
const Book *cur = head;
while (cur) {
printBook(cur);
cur = cur->next;
}
}
/* 3. Поиск и вывод всех книг после заданного года */
void printAfterYear(const Book *head, int year) {
int found = 0;
const Book *cur = head;
while (cur) {
if (cur->year > year) {
printBook(cur);
found = 1;
}
cur = cur->next;
}
if (!found)
printf("Книг, изданных после %d года, не найдено.
", year);
}
/* 4. Поиск книги по точному названию (с учётом регистра) */
Book *findByTitle(Book *head, const char [id851100522|*title]) {
Book *cur = head;
while (cur) {
if (strcmp(cur->title, title) == 0)
return cur;
cur = cur->next;
}
return NULL;
}
/* 5. Удаление книги, название которой идёт последним в алфавитном порядке */
Book *deleteLastAlphabetically(Book *head) {
if (!head)
return NULL;
/* Найти max title */
Book *cur = head;
char maxTitle[51];
strcpy(maxTitle, head->title);
while (cur) {
if (strcmp(cur->title, maxTitle) > 0)
strcpy(maxTitle, cur->title);
cur = cur->next;
}
/* Удалить первый узел с этим названием */
Book *prev = NULL;
cur = head;
while (cur && strcmp(cur->title, maxTitle) != 0) {
prev = cur;
cur = cur->next;
}
if (!cur)
return head;
if (!prev) { // удаляем голову
head = cur->next;
} else {
prev->next = cur->next;
}
free(cur);
return head;
}
/* 6. Поиск самой старой книги */
Book *findOldest(Book *head) {
if (!head)
return NULL;
Book [id38607482|*oldest] = head;
Book *cur = head->next;
while (cur) {
if (cur->year < oldest->year)
oldest = cur;
cur = cur->next;
}
return oldest;
}
/* 7. Полная очистка библиотеки */
void clearLibrary(Book **head) {
Book *cur = *head;
while (cur) {
Book [club6386|*next] = cur->next;
free(cur);
cur = next;
}
*head = NULL;
}
/* Меню */
void printMenu() {
printf("
1. Добавить книгу
");
printf("2. Вывести весь список
");
printf("3. Вывести книги, изданные после заданного года
");