Создание структур в цикле, пока не будет введет какой-либо символ и вывод данных в табличном виде - 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, которая создает и управляет связанным списком структур данных, представляющих газеты. Вот список функций и переменных, выделенных в коде:

  1. #define _CRT_SECURE_NO_WARNINGS и #define _CRT_NONSTDC_NO_WARNINGS: Эти директивы отключают некоторые предупреждения компилятора, которые могут быть полезны при отладке, но могут вызывать проблемы в производственной среде.
  2. #include , #include , #include и #include : Эти строки включают заголовочные файлы, которые предоставляют функции для ввода и вывода данных, а также для работы со строками и структурами данных.
  3. char count = 0;, size_t length; и bool b = true;: Эти переменные используются в программе. count используется для отслеживания количества добавленных элементов в список. length используется для определения длины строк. b используется как флаг, который изменяется при каждом новом добавлении элемента в список.
  4. typedef struct date {: Эта строка определяет новую структуру данных с именем date. Эта структура содержит три поля: день, месяц и год.
  5. typedef struct newspapers {: Эта строка определяет новую структуру данных с именем newspapers. Эта структура содержит пять полей: название газеты, номер выпуска, структуру date, издательство и указатель на следующий элемент списка.
  6. void addNewspaper(newspapers head, char name[25], short number, char day, char month, short year, char printingOffice[25]) {: Эта функция добавляет новый элемент в список. Она принимает указатель на первый элемент списка, а также параметры для заполнения полей структуры newspapers**.
  7. *void insert(newspapers head, unsigned n, char name[25], short number, char day, char month, short year, char printingOffice[25]) {: Эта функция вставляет новый элемент в список на определенной позиции. Она принимает указатель на первый элемент списка, позицию, на которую нужно вставить элемент, а также параметры для заполнения полей структуры newspapers**.
  8. newspapers getLastP(newspapers head) {: Эта функция возвращает последний элемент в списке. Она принимает указатель на первый элемент списка и возвращает указатель на последний элемент.
  9. newspapers swap(newspapers head) {: Эта функция меняет местами два последних элемента в списке. Она принимает указатель на первый элемент списка и возвращает указатель на новый последний элемент списка.
  10. *void printLinkedList(newspapers head) {**: Эта функция печатает список в табличном виде. Она принимает указатель на первый элемент списка и печатает все элементы списка.
  11. void main() {: Эта функция является точкой входа в программу. Она содержит код для взаимодействия с пользователем, ввода данных и вывода списка. Обратите внимание, что некоторые строки кода были пронумерованы, чтобы облегчить их упоминание в этом списке.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.333 из 5
Похожие ответы