Добавление, вставка и удаления элемента структуры - 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;
}
Добавлено через 2 часа 31 минуту вот попытка добавления, но ругается на 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;

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

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

8   голосов, оценка 3.375 из 5


СОХРАНИТЬ ССЫЛКУ