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

  1. добавить операции добавление, вставка и удаления элемента с интерактивного менюC1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 #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;C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 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. Мне нужно вставить узел в хвост списка. Я написал функцию вставки, но она не доходит до конца списка. В функцию передаю список и информационное поле узла, которое надо вставить. Можете помочь найти ошибку?C++1 2 3 4 5 6 7 8 9 10 11 12 Node*AddInTail(Node**p,int k) {       Node*ins=new Node; // узел, который надо вставить     Node*walk=new Node;// создаем новый узел,для прохода по списку         ins->k=k;                 //в информационное поле вставляю число k         for(walk=*p;walk->next!=NULL;walk=walk->next) //дохожу до конца списка             {                 walk->next=ins; //в указатель конца списка записываю узел                 ins->next=NULL; //в указатель вставленного узла записываю NULL     return *p;     }     return *p; }

  1. Нужно отсортировать и вывести 2-х мерный масив 10х10 по убыванию не используя индексацию (через указатели). Поиском нашел кучу вариантов через индексацию, но как их переделать под указатели?

  1. Доброго времени суток!Помогите разобраться. В файле 123.txt подсчитывается кол-во пробелов в строке, в другой файл записывается эта же строка только в начало добавляются эти пробелы(Пример: 123.txt:Привет как дела? out.txt: Привет как дела?. В out 2 пробела сначала) Там только косяк в том, что обрабатывается только первая строка. Пишу в CodeBlocks/ Помогите решить, заранее спасибо. C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 #include #include #include #include #include #include   main() {FILE *in, *out; char *str,*pr; int i,S,j,k; in=fopen("123.txt","r"); if(in==NULL) //Если файла 123 нет в папке с прогой, то программа завершается {printf("Error\n"); exit(-1);} else { out=fopen("out.txt","w"); str=(char*)malloc(sizeof(char)*128) ; fgets(str,128,in); S=strlen(str); j=0; for(i=0;i

  1. Здравствуйте! Несколько месяцев назад дали задания по динамическим массивам: Дана матрица А[m,n] и массив B[m]. Вставить после каждого столбца, содержащего четное количество элементов массива B столбец, содержащий элементы этого массива, при каждой вставке циклически сдвигая их на один элемент вниз. Я 3 раза переписывал код и он никак не хочет работать, кто-нибудь сможет найти ошибку? А то я уже вот код:C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 #include "stdafx.h" #include #include #include #include     int** inputmatr(int, int); void poisk(int*, int**, int, int); void vstavka(int*, int**, int*, int, int, int);     int main() {     int m, n;     m = 0;     n = 0;         scanf_s("%d", &m);//строки     scanf_s("%d", &n);//столбцы     int* array = (int*)malloc(sizeof(int)*m);     free(array);     printf("Massiv A: \n");     for (int i = 0; i < m; i++)     {         array[i] = 0 + rand() % 10;         printf("%4d", array[i]);     }     printf("\n");     int** matr = inputmatr(m, n);     printf_s("\n");     poisk(array, matr, m, n);     system("pause");     return 0; }     int** inputmatr(int m, int n) {     int** matr = (int**)malloc(sizeof(int*) * n);       for (int i = 0; i < m; i++)     {         matr[i] = (int*)malloc(sizeof(int) * m);     }     printf("matriza: \n");     for (int i = 0; i < m; i++)     {         for (int j = 0; j < n; j++)         {             matr[i][j] = 0 + rand() % 10;             printf("%4d",matr[i][j]);         }         printf("\n");     }     return matr; }   void poisk(int *arr, int **mtx, int m, int n) {     int chet = 0;     int kek = 0;     int* help = (int*)malloc(sizeof(int)*300);     for (int i = 0; i < n; i++)     {         for (int j = 0; j < m; j++)         {             for (int k = 0; k < m; k++)             {                 if (mtx[j][i] == arr[k])                 {                     chet++;                 }             }         }         if ((chet % 2 == 0) && (chet != 0))         {             help[kek] = i;             kek++;         }         chet = 0;     }     vstavka(arr, mtx, help, m, n, kek); }   void vstavka(int * arr, int **mtx, int * help, int m, int n, int kek) {     int** fin = (int**)malloc(sizeof(int*) * (n + kek));       for (int i = 0; i < m; i++)     {         fin[i] = (int*)malloc(sizeof(int) * m);     }     int chet = 0;     int rekt = 0;     for (int i = 0; i < (n+kek); i++)     {         if (i - 1 == help[rekt])         {             for (int j = 0; j < m; j++)             {                 fin[j][i] = arr[j];             }             rekt++;         }         else         {             for (int j = 0; j < m; j++)             {                 fin[j][i] = mtx[j][chet];             }             chet++;         }     }     printf("matriza fin: \n");     for (int i = 0; i < m; i++)     {         for (int j = 0; j < n; j++)         {             printf("%4d", fin[i][j]);         }         printf("\n");     } }

  1. Нужен пример программы на си, в которой ввод с клавиатуры строки в переменную производится с помощью ассемблерной вставки

  1. Доброго времени суток. Столкнулся с одной задачей: В заданном предложении пропущены некоторые слова, заменить пропущенные из списка, тобишь когда мы пишем: "My $ is Sanya" нам должно выдать "My name is Sanya". Хотел сделать проверку, в каком месте находиться пропущенное слово по последним символам до пробела, но при попытке программа вылетает. Помогите, надо сдать до завтра.C1 2 3 4 5 6 7 8 9 10 11 12 #include #include #include int main() {     char worda[] = "my";     char wordb[] = "name";     char wordc[] = "is";     char wordd[] = "Sanya";     char un[] = "$";     printf("%s", wordb[3]);     return 0; }

  1. Надо создать программу для работы с файлами. Вводим значения: 1: запись 2:добавление 3:чтение Только вот сразу после ввода значения окно программы закрывается. Вот код: C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 //Г°Г*áîòГ* Г± ГґГ*éëГ*ìè   #include void filerew() {    FILE *myfile;      myfile = fopen("myfile.txt","wt");      char *st;      system("cls");      printf("enter string: \n");      gets(st);      fputs(st,myfile);      fclose(myfile);      } void fileadd() {    FILE *myfile;      myfile = fopen("myfile.txt","at");      char *st;      system("cls");      printf("enter string: \n");      gets(st);      fputs(st,myfile);      fclose(myfile);      } void fileread() {    int n=50;      FILE *myfile;      myfile = fopen("myfile.txt","r");      char arr[n];      while(fgets(arr,n,myfile) != NULL)        printf("%s",arr);      printf("\n");      fclose(myfile);            }               int main() {     int flag;     printf("enter 1 for rewrite, 2 for complete,3 for read other to exit: ");     scanf("&d",flag);     switch(flag)     {       case 1:filerew();                         return 0;             break;       case 2:fileadd();              return 0;              break;       case 3:fileread();              return 0;       default:return 0;               break;                               } }

  1. Функция - Insert(s,s1,n). Вставка в строку s подстроки s1, начиная с позиции n (аналогичная библиотечная функция есть в Pascal).

  1. В текстовый файл вставить пробелы таким образом, чтобы каждая строка имела длину 80 символов (пробелы в строке должны быть вставлены равномерно). В общем начал писать программу, ниже код:C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 //---------------------------------------------------------------------------   #pragma hdrstop   //---------------------------------------------------------------------------   #pragma argsused #include #include   int main(int argc, char* argv[]) {         char str[1000];         int i, j;         FILE *file;         file = fopen("a.txt", "a+");           /*Выводим содержимое файла*/         printf("Soderjanie faila:\n");         fgets(str, 1000, file);         puts(str);           /*Если файл пуст - заполнение пробелами*/         if (fscanf(file, "%c", str) < 1)         {                 printf("File pust! Zapolnenie probelami...\n\nGotovo!");                 for (i = 0; i < 10; i++)                 {                         for (j = 0; j < 80; j++)                         {                                 fputc(' ', file);                                 if ((i == 9) && (j == 79))                                         fclose(file);                         }                         fputc('\n', file);                 }         }         else         {                 printf("File ne pust! Zapolnenie probelami...\n\nGotovo!");                 fclose(file);         }         getchar();         return 0; } //---------------------------------------------------------------------------Здесь рассмотрен случай, если файл пуст. Но также файл может быть и с содержимым. Я думаю, что содержимое str[1000] просматривается на строки, в которых будут три случая. Если строка файла <80, =80 и >80. Т.е.C1 2 3 4 5 6 7 8 9 for(i = 0; i < 1000; i++) {         if (str[i] == '\n') // <80         {                 k = i;                 /*Код*/         }         /*Остальные три случая*/ }В общем прошу помощи.. подсказать как лучше организовать будет эти три случая) Я так понимаю, что ещё в каждом случае будет по 3 случая. Т.е., если (str[i] == ' ')&&(str[i]==' '), если (str[i] == ' ')&&(str[i]!=' '), если (str[i] != ' '). Эти три подслучая, лучше подпрограммой сделать?. P.S. Пользовался поиском - ничего толкового не нашел.

  1. Нужно отсортировать массив структур простыми вставками...Ключ сортировки Population, ничего не получается помогите кто-нибудьC1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 #include #include #include   struct Struct {     char Audition[10];     char Population[10]; } ; Struct* insertSort(Struct* a, int size) ;       void main()     { int n, i, j;     printf("Enter number of Auditions\n");     struct Struct sort[10];     for (i = 1; i < 4; ++i){         printf("Enter the Audition\n");         scanf("%s",sort[i].Audition);         printf("Enter the Population\n");         scanf("%s",sort[i].Population);     }   insertSort(sort, 10); for (i = 1; i < 4; ++i){ printf("%s",sort[i]); } }       Struct* insertSort(Struct* a, int size) {     int i, j;     char* tmp;     for (i = 1; i < 4; ++i) // цикл проходов, i - номер прохода     {         tmp = a[i].Audition;         for (j = i - 1; j >= 0 && a[j].Audition > tmp; --j) // поиск места элемента в готовой последовательности             a[j + 1] = a[j];    // сдвигаем элемент направо, пока не дошли          a[j + 1] = tmp;         return(a);         } }