Создание структур в цикле, пока не будет введет какой-либо символ и вывод данных в табличном виде - C (СИ)
Формулировка задачи:
Помогите сделать динамический линейный список на основе данного кода. Я уже добавил указатель внутри структуры. Нужно сделать создание структур в цикле, пока не будет введет какой-либо символ и вывод данных в табличном виде.
Вот код:
#define _CRT_SECURE_NO_WARNINGS #define _CRT_NONSTDC_NO_WARNINGS #include <stdio.h> #include <conio.h> #include <locale> #include <Windows.h> #include <string.h> void main() { setlocale(LC_ALL, "Russian"); SetConsoleCP(1251); SetConsoleOutputCP(1251); size_t length; typedef struct date{ char day; char month; short year; }; typedef struct newspapers{ char name[25]; short number; date date1; char printingOffice[25]; newspapers *next; }; newspapers newspaperslist[2]; newspapers tmp; for (int i = 0; i<2; i++) { printf("Введите название газеты %d: ", i + 1); fgets(newspaperslist[i].name, sizeof newspaperslist[i].name, stdin); printf("Введите номер выпуска %d: ", i + 1); scanf("%d", &newspaperslist[i].number); printf("Ввод даты выпуска %d \n", i + 1); printf("Введите день: "); scanf("%d", &newspaperslist[i].date1.day); printf("Введите месяц: "); scanf("%d", &newspaperslist[i].date1.month); printf("Введите год: "); scanf("%d", &newspaperslist[i].date1.year); printf("Введите издательство %d: ", i + 1); getchar(); fgets(newspaperslist[i].printingOffice, sizeof newspaperslist[i].printingOffice, stdin); } tmp = newspaperslist[0]; newspaperslist[0] = newspaperslist[1]; newspaperslist[1] = tmp; printf("_______________________________________________________________\n"); printf("| Газеты | | |\n"); printf("|____________________________| Дата выпуска | Издательство |\n"); printf("| Название | Номер | | |\n"); printf("|-----------------|----------|----------------|----------------|\n"); for (int i = 0; i<2; i++) { length = strlen(newspaperslist[i].name); if (length > 0 && newspaperslist[i].name[length - 1] == '\n') newspaperslist[i].name[length - 1] = '\0'; length = strlen(newspaperslist[i].printingOffice); if (length > 0 && newspaperslist[i].printingOffice[length - 1] == '\n') newspaperslist[i].printingOffice[length - 1] = '\0'; printf("| %-15s ", newspaperslist[i].name); printf("| %-8d ", newspaperslist[i].number); printf("| %2d.%2d.%4d ", newspaperslist[i].date1.day, newspaperslist[i].date1.month, newspaperslist[i].date1.year); printf("| %-15s|\n", newspaperslist[i].printingOffice); } printf("|--------------------------------------------------------------|"); getch(); }
Решение задачи: «Создание структур в цикле, пока не будет введет какой-либо символ и вывод данных в табличном виде»
textual
Листинг программы
#define _CRT_SECURE_NO_WARNINGS #define _CRT_NONSTDC_NO_WARNINGS #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <Windows.h> #include <locale> char count = 0; size_t length; bool b = true; typedef struct date { char day; char month; short year; }; typedef struct newspapers { char name[25]; short number; date date1; char printingOffice[25]; newspapers *next; }; void addNewspaper(newspapers **head, char name[25], short number, char day, char month, short year, char printingOffice[25]) { // добавление нового элемента newspapers *tmp = (newspapers*)malloc(sizeof(newspapers)); strcpy(tmp->name, name); tmp->number = number; tmp->date1.day = day; tmp->date1.month = month; tmp->date1.year = year; strcpy(tmp->printingOffice, printingOffice); tmp->next = (*head); (*head) = tmp; count++; b = false; } void insert(newspapers *head, unsigned n, char name[25], short number, char day, char month, short year, char printingOffice[25]) { unsigned i = 0; newspapers *tmp = NULL; while (i < n && head->next) { head = head->next; i++; } tmp = (newspapers*)malloc(sizeof(newspapers)); strcpy(tmp->name, name); tmp->number = number; tmp->date1.day = day; tmp->date1.month = month; tmp->date1.year = year; strcpy(tmp->printingOffice, printingOffice); if (head->next) { tmp->next = head->next; } else { tmp->next = NULL; } head->next = tmp; count++; } newspapers* getLastP(newspapers *head) { if (head == NULL) { return NULL; } while (head->next) { head = head->next; } return head; } /*newspapers* swap(newspapers *head) { newspapers *last = getLastP(head); newspapers *tmp = (newspapers*)malloc(sizeof(newspapers)); tmp = head; head = last; last = tmp; return head; }*/ void printLinkedList(newspapers *head) { while (head) { length = strlen(head->name); if (length > 0 && head->name[length - 1] == '\n') head->name[length - 1] = '\0'; length = strlen(head->printingOffice); if (length > 0 && head->printingOffice[length - 1] == '\n') head->printingOffice[length - 1] = '\0'; printf("| %-15s ", head->name); printf("| %-8d ", head->number); printf("| %2d.%2d.%4d ", head->date1.day, head->date1.month, head->date1.year); printf("| %-15s|\n", head->printingOffice); head = head->next; } printf("\n"); } void main() { setlocale(LC_ALL, "Russian"); SetConsoleCP(1251); SetConsoleOutputCP(1251); char c = '1'; char name[25],number = 0, day = 0, month = 0, printingOffice[25]; short year = 0; newspapers *head = NULL;//указатель на первый элемент списка while (c != '0') { printf("Введите название газеты %d: ", count + 1); fgets(name, sizeof name, stdin); printf("Введите номер выпуска %d: ", count + 1); scanf("%hhd", &number); printf("Ввод даты выпуска %d \n", count + 1); printf("Введите день: "); scanf("%hhd", &day); printf("Введите месяц: "); scanf("%hhd", &month); printf("Введите год: "); scanf("%hd", &year); printf("Введите издательство %d: ", count + 1); getchar(); fgets(printingOffice, sizeof printingOffice, stdin); if(b)addNewspaper(&head, name, number, day, month, year, printingOffice); else insert(head, 7, name, number, day, month, year, printingOffice); puts("Чтобы закончить ввод, введите 0, чтобы продолжить, нажмите любую клавишу"); scanf("%c", &c); } printf("<br>\n"); printf("| Газеты | | |\n"); printf("|<br>| Дата выпуска | Издательство |\n"); printf("| Название | Номер | | |\n"); printf("|-----------------|----------|----------------|----------------|\n"); printLinkedList(swap(head)); printf("|--------------------------------------------------------------|"); getch(); }
Объяснение кода листинга программы
Этот код представляет собой программу на языке C, которая создает и управляет связанным списком структур данных, представляющих газеты. Вот список функций и переменных, выделенных в коде:
- #define _CRT_SECURE_NO_WARNINGS и #define _CRT_NONSTDC_NO_WARNINGS: Эти директивы отключают некоторые предупреждения компилятора, которые могут быть полезны при отладке, но могут вызывать проблемы в производственной среде.
- #include
, #include , #include и #include : Эти строки включают заголовочные файлы, которые предоставляют функции для ввода и вывода данных, а также для работы со строками и структурами данных. - char count = 0;, size_t length; и bool b = true;: Эти переменные используются в программе. count используется для отслеживания количества добавленных элементов в список. length используется для определения длины строк. b используется как флаг, который изменяется при каждом новом добавлении элемента в список.
- typedef struct date {: Эта строка определяет новую структуру данных с именем date. Эта структура содержит три поля: день, месяц и год.
- typedef struct newspapers {: Эта строка определяет новую структуру данных с именем newspapers. Эта структура содержит пять полей: название газеты, номер выпуска, структуру date, издательство и указатель на следующий элемент списка.
- void addNewspaper(newspapers head, char name[25], short number, char day, char month, short year, char printingOffice[25]) {: Эта функция добавляет новый элемент в список. Она принимает указатель на первый элемент списка, а также параметры для заполнения полей структуры newspapers**.
- *void insert(newspapers head, unsigned n, char name[25], short number, char day, char month, short year, char printingOffice[25]) {: Эта функция вставляет новый элемент в список на определенной позиции. Она принимает указатель на первый элемент списка, позицию, на которую нужно вставить элемент, а также параметры для заполнения полей структуры newspapers**.
- newspapers getLastP(newspapers head) {: Эта функция возвращает последний элемент в списке. Она принимает указатель на первый элемент списка и возвращает указатель на последний элемент.
- newspapers swap(newspapers head) {: Эта функция меняет местами два последних элемента в списке. Она принимает указатель на первый элемент списка и возвращает указатель на новый последний элемент списка.
- *void printLinkedList(newspapers head) {**: Эта функция печатает список в табличном виде. Она принимает указатель на первый элемент списка и печатает все элементы списка.
- void main() {: Эта функция является точкой входа в программу. Она содержит код для взаимодействия с пользователем, ввода данных и вывода списка. Обратите внимание, что некоторые строки кода были пронумерованы, чтобы облегчить их упоминание в этом списке.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д