Добавление, вставка и удаления элемента структуры - C (СИ)

Узнай цену своей работы

Формулировка задачи:

добавить операции добавление, вставка и удаления элемента с интерактивного меню
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
#define STR_LEN 64
typedef struct str
{
    char name[STR_LEN];
    char exp[STR_LEN];
    unsigned long size;
    int day;
    int mon;
    int year;
} str_t;
 
int name_c(const void * a, const void * b){
    return strcmp(((str_t*)a)->name, ((str_t*)b)->name);
}
 
int exp_c(const void * a, const void * b){
    return strcmp(((str_t*)a)->exp, ((str_t*)b)->exp);
}
 
int size_c(const void * a, const void * b){
    return ((str_t*)a)->size - ((str_t*)b)->size;
}
 
int day_c(const void * a, const void * b){
    return ((str_t*)a)->day - ((str_t*)b)->day;
}
 
int mon_c(const void * a, const void * b){
    return ((str_t*)a)->mon - ((str_t*)b)->mon;
}
 
int year_c(const void * a, const void * b){
    return ((str_t*)a)->year - ((str_t*)b)->year;
}
int name_d(const void * b, const void * a){
    return strcmp(((str_t*)a)->name, ((str_t*)b)->name);
}
 
int exp_d(const void * b, const void * a){
    return strcmp(((str_t*)a)->exp, ((str_t*)b)->exp);
}
 
int size_d(const void * b, const void * a){
    return ((str_t*)a)->size - ((str_t*)b)->size;
}
 
int day_d(const void * b, const void * a){
    return ((str_t*)a)->day - ((str_t*)b)->day;
}
 
int mon_d(const void * b, const void * a){
    return ((str_t*)a)->mon - ((str_t*)b)->mon;
}
 
int year_d(const void * b, const void * a){
    return ((str_t*)a)->year - ((str_t*)b)->year;
}
 
void show(const str_t * arr, size_t cnt){
        printf("Name               Exp          Size       Date \n");
    while ( cnt-- ){
        printf("%-20s%-5s%10u%10i%5i.%i.%i\n", arr->name, arr->exp, arr->size, arr->day, arr->mon, arr->year);
        ++arr;
    }
}
 
#define NUM_FILES 4
 
int main(void)
{
    str_t a[NUM_FILES];
    int i,s;
    int j=0;
 
    for(i=0; i < NUM_FILES; i++)
    {
    printf("file #%i\n", i+1);
    printf("enter name: ");
    scanf("%s", &a[i].name);
    printf("enter expansion: ");
    scanf("%s", &a[i].exp);
    printf("enter size: ");
    scanf("%lu", &a[i].size);
    printf("date: ");
    printf("enter day:");
    scanf("%i", &a[i].day);
    printf("enter month:");
    scanf("%i", &a[i].mon);
    printf("enter year:");
    scanf("%i", &a[i].year);
    }
    printf("\n Unsorted \n");
    show(a, NUM_FILES);
    printf("\n Choose function:\n ");
    printf("\n 1. To sort by name.\n ");
    printf("\n 2. To sort by expansion. \n ");
    printf("\n 3. To sort by size. \n ");
    printf("\n 4. To sort by date. \n ");
    printf("\n 5. To sort by name (rev).\n ");
    printf("\n 6. To sort by expansion (rev). \n ");
    printf("\n 7. To sort by size (rev). \n ");
    printf("\n 8. To sort by date (rev). \n ");
    printf("\n 9. To show common size. \n ");
    printf("\n 0. To close. \n ");
    do
    {
    scanf("%i", &s);
    switch(s)
    {
    case 1:
    printf("\n Sorted by name: \n");
    qsort(a, NUM_FILES, sizeof(str_t), name_c);
    show(a, NUM_FILES);
    break;
    case 2:
    printf("\n Sorted by expansion: \n");
    qsort(a, NUM_FILES, sizeof(str_t), exp_c);
    show(a, NUM_FILES);
    break;
    case 3:
    printf("\n Sorted by size: \n");
    qsort(a, NUM_FILES, sizeof(str_t), size_c);
    show(a, NUM_FILES);
    break;
    case 4:
    printf("\n Sorted by date: \n");
    qsort(a, NUM_FILES, sizeof(str_t), day_c);
    qsort(a, NUM_FILES, sizeof(str_t), mon_c);
    qsort(a, NUM_FILES, sizeof(str_t), year_c);
    show(a, NUM_FILES);
    break;
    case 5:
    printf("\n Sorted by name (reverse): \n");
    qsort(a, NUM_FILES, sizeof(str_t), name_d);
    show(a, NUM_FILES);
    break;
    case 6:
    printf("\n Sorted by expansion (reverse): \n");
    qsort(a, NUM_FILES, sizeof(str_t), exp_d);
    show(a, NUM_FILES);
    break;
    case 7:
    printf("\n Sorted by size (reverse): \n");
    qsort(a, NUM_FILES, sizeof(str_t), size_d);
    show(a, NUM_FILES);
    break;
    case 8:
    printf("\n Sorted by date (reverse): \n");
    qsort(a, NUM_FILES, sizeof(str_t), day_d);
    qsort(a, NUM_FILES, sizeof(str_t), mon_d);
    qsort(a, NUM_FILES, sizeof(str_t), year_d);
    show(a, NUM_FILES);
    break;
    case 9:
    for(i=0; i < NUM_FILES; i++)
    j=j+a[i].size;
    printf("common size %i",j);
    case 0:
    break;
    }
    }while(s != 0);
    
        getch();
        return 0;
}
вот попытка добавления, но ругается на NUM_FILES=NUM_FILES+1;
case 10:
    NUM_FILES=NUM_FILES+1;
    printf("file #%i\n", NUM_FILES);
    printf("enter name: ");
    scanf("%s", &a[NUM_FILES].name);
    printf("enter expansion: ");
    scanf("%s", &a[NUM_FILES].exp);
    printf("enter size: ");
    scanf("%lu", &a[NUM_FILES].size);
    printf("date: ");
    printf("enter day:");
    scanf("%i", &a[NUM_FILES].day);
    printf("enter month:");
    scanf("%i", &a[NUM_FILES].mon);
    printf("enter year:");
    scanf("%i", &a[NUM_FILES].year);
    break;

Решение задачи: «Добавление, вставка и удаления элемента структуры»

textual
Листинг программы
#ifndef MENU_H
#define MENU_H
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
void check_ptr(void *ptr);
 
struct MenuNode;
 
typedef void (*item_type)(struct MenuNode *);
 
struct MenuNode
{
    char *title;
    item_type item;
    
    size_t submenus_count;
    struct MenuNode **submenus;
};
 
struct MenuNode *create_menu_node(const char *title, item_type item);
void free_menu_node(struct MenuNode *menu);
void free_menu(struct MenuNode *menu);
 
struct MenuNode *add_submenu(struct MenuNode *menu, const char *title, item_type item);
 
void print_menu(struct MenuNode *menu);
void menu_handler(struct MenuNode *menu);
 
#endif

Объяснение кода листинга программы

Объяснение кода:

  1. Включающие директивы:
    • #include <stdio.h> - включает функции для работы с файлами, в том числе для отправки сообщений в консоль
    • #include <stdlib.h> - включает функции для работы с памятью, в том числе для выделения и освобождения памяти
    • #include <string.h> - включает функции для работы со строками, в том числе для копирования, конкатенации и сравнения строк
  2. Функции:
    • check_ptr(void *ptr) - проверяет, что указатель не равен NULL, иначе выводит сообщение об ошибке и завершает программу
    • create_menu_node(const char *title, item_type item) - создает новый узел меню с указанным заголовком и элементом меню
    • free_menu_node(struct MenuNode *menu) - освобождает память, выделенную под узел меню
    • free_menu(struct MenuNode *menu) - освобождает память, выделенную под все узлы меню и их подменю
    • add_submenu(struct MenuNode *menu, const char *title, item_type item) - добавляет новое подменю в узел меню
    • print_menu(struct MenuNode *menu) - выводит меню на экран
    • menu_handler(struct MenuNode *menu) - обрабатывает выбор пользователя из меню
  3. Типы данных и переменные:
    • void (*item_type)(struct MenuNode *) - указатель на функцию, которая будет вызываться при выборе элемента меню
    • struct MenuNode - структура, представляющая узел меню, содержащая заголовок, элемент меню и список подменю
    • char *title - указатель на строку, содержащую заголовок узла меню или подменю
    • item_type item - указатель на функцию, которая будет вызываться при выборе элемента меню
    • size_t submenus_count - переменная, содержащая количество подменю в узле меню
    • struct MenuNode **submenus - указатель на массив указателей на узлы подменю
  4. Прототипы функций:
    • void check_ptr(void *ptr);
    • struct MenuNode *create_menu_node(const char *title, item_type item);
    • void free_menu_node(struct MenuNode *menu);
    • void free_menu(struct MenuNode *menu);
    • struct MenuNode *add_submenu(struct MenuNode *menu, const char *title, item_type item);
    • void print_menu(struct MenuNode *menu);
    • void menu_handler(struct MenuNode *menu);
  5. Основная функция программы:
    • В данном случае, основной функции программы нет, так как код является заголовочным файлом для создания функций и структур в других файлах.

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


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

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

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