При вводе второго ключа с информацией выводится ошибка - C (СИ)

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

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

Всем привет подскажите где косяк, заказал программу) у исполнителя она работает у меня нет, уже на куче машин пытался запустить. При вводе второго ключа с информацией выводит ошибку
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. const int SIZE = 10;
  5. typedef struct List
  6. {
  7. int key;
  8. char *info;
  9. struct List *next;
  10. } TList;
  11. int currentSize = 0;
  12. struct List* backInsert( struct List *lst, int k, char *s )
  13. {
  14. TList *ins = ( TList* )malloc( sizeof( TList ) );
  15. ins -> info = ( char* )malloc( 150 );
  16. strcpy( ins -> info, s );
  17. ins -> key = k;
  18. if ( lst == NULL )
  19. {
  20. currentSize = 1;
  21. lst = ins;
  22. }
  23. else
  24. {
  25. TList *pointer = lst;
  26. while ( pointer -> next != NULL )
  27. {
  28. if ( pointer -> key == k && ( strcmp( pointer -> info, s ) == NULL ) )
  29. {
  30. printf( "Error inserting!\n" );
  31. return NULL;
  32. }
  33. pointer = pointer -> next;
  34. }
  35. if ( currentSize + 1 > SIZE )
  36. {
  37. printf( "Overflow! > SIZE\n" );
  38. return lst;
  39. }
  40. currentSize++;
  41. pointer -> next = ins;
  42. }
  43. return lst;
  44. }
  45. TList* removeItem( TList *lst, int k )
  46. {
  47. TList *pointer = lst, *pnt;
  48. int wasRemoved = 0;
  49. while ( pointer != NULL )
  50. {
  51. if ( pointer -> key == k )
  52. {
  53. if ( pointer == lst )
  54. {
  55. lst = lst -> next;
  56. free( pointer );
  57. pointer = lst;
  58. }
  59. else
  60. {
  61. pnt -> next = pointer -> next;
  62. free( pointer );
  63. pointer = pnt -> next;
  64. }
  65. wasRemoved = 1;
  66. }
  67. else
  68. {
  69. pnt = pointer;
  70. pointer = pointer -> next;
  71. }
  72. }
  73. if ( wasRemoved == 0 )
  74. printf( "Item with key %d not removed!\n", k );
  75. return lst;
  76. }
  77. void printList( TList *lst )
  78. {
  79. TList *pointer = lst;
  80. printf( "\nCurrent list:\n" );
  81. while ( pointer != NULL )
  82. {
  83. printf( "\tKey: %d Info: %s\n", pointer -> key, pointer -> info );
  84. pointer = pointer -> next;
  85. }
  86. printf( "\n" );
  87. }
  88. void menu()
  89. {
  90. printf( "\n1) Insert data;\n" );
  91. printf( "2) Remove data;\n" );
  92. printf( "3) Print list;\n" );
  93. printf( "0) Exit.\n" );
  94. }
  95. int main()
  96. {
  97. TList *list = NULL;
  98. int choice;
  99. do
  100. {
  101. menu();
  102. printf( "\nYour choice: " );
  103. scanf( "%d", &choice );
  104. switch ( choice )
  105. {
  106. case 1 :
  107. {
  108. int key;
  109. char *info = ( char* )malloc( 150 );
  110. printf( "\n\tEnter key and info: " );
  111. scanf( "%d%s", &key, info );
  112. fflush( stdin );
  113. list = backInsert( list, key, info );
  114. } break;
  115. case 2 :
  116. {
  117. int key;
  118. printf( "\n\tEnter key for remove: " );
  119. scanf( "%d", &key );
  120. list = removeItem( list, key );
  121. } break;
  122. case 3 :
  123. {
  124. printList( list );
  125. } break;
  126. }
  127. }
  128. while ( choice != 0 );
  129. return 0;
  130. }

Решение задачи: «При вводе второго ключа с информацией выводится ошибка»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. typedef struct Item Item;
  6. struct Item
  7. {
  8.     int   key;
  9.     char *info;
  10.     Item *next;
  11. };
  12.  
  13. typedef struct List List;
  14. struct List
  15. {
  16.     Item *head;
  17.     Item *back;
  18. };
  19.  
  20. Item *
  21. alloc_item(int key, char *info)
  22. {
  23.     Item *item;
  24.     item = malloc(sizeof(Item));
  25.     if (item == NULL)
  26.         return NULL;
  27.     item->info = malloc(strlen(info)+1);
  28.     if (item->info == NULL) {
  29.         free(item);
  30.         return NULL;
  31.     }
  32.     strcpy(item->info, info);
  33.     item->key = key;
  34.     item->next = NULL;
  35.     return item;
  36. }
  37.  
  38. void
  39. free_item(Item *item)
  40. {
  41.     free(item->info);
  42.     free(item);
  43. }
  44.  
  45. int
  46. push_back(List *list, int key, char *info)
  47. {
  48.     Item *item;
  49.  
  50.     item = alloc_item(key, info);
  51.     if (item == NULL)
  52.         return 0;
  53.  
  54.     if (list->back == NULL) {
  55.         list->head = item;
  56.         list->back = item;
  57.     } else {
  58.         list->back->next = item;
  59.         list->back = item;
  60.     }
  61.     return 1;
  62. }
  63.  
  64. void
  65. remove_items(List *list, int key)
  66. {
  67.     Item *item, *curr;
  68.  
  69.     if (list->head->key == key) {
  70.         if (list->head->next == NULL) {
  71.             free_item(list->head);
  72.             list->head = list->back = NULL;
  73.         } else {
  74.             curr = list->head;
  75.             list->head = curr->next;
  76.             free_item(curr);
  77.         }
  78.         return;
  79.     }
  80.  
  81.     for (curr = list->head; curr->next != NULL; curr = item) {
  82.         item = curr->next;
  83.         if (item->key == key) {
  84.             if (item == list->back)
  85.                 list->back = curr;
  86.             curr->next = item->next;
  87.             free_item(item);
  88.         }
  89.     }
  90. }
  91.  
  92. void
  93. print_list(List *list, char *fmt, int newline)
  94. {
  95.     Item *curr;
  96.     for (curr = list->head; curr != NULL; curr = curr->next)
  97.         printf(fmt, curr->key, curr->info);
  98.     if (newline)
  99.         printf("\n");
  100. }
  101.  
  102. void
  103. menu()
  104. {
  105.     printf("\n");
  106.     printf("1) Insert data;\n");
  107.     printf("2) Remove data;\n");
  108.     printf("3) Print list;\n");
  109.     printf("0) Exit.\n");
  110.     printf("> ");
  111. }
  112.  
  113. #define BUFSIZE 8192
  114.  
  115. int
  116. main(void)
  117. {
  118.     List  list;
  119.     Item *item;
  120.     char  info[BUFSIZE];
  121.     int   key, choice;
  122.  
  123.     list.head = list.back = NULL;
  124.     do {
  125.         menu();
  126.         scanf("%d", &choice);
  127.         switch (choice) {
  128.         case 1:
  129.             memset(info, 0, BUFSIZE);
  130.             printf("\tEnter key and info: ");
  131.             scanf("%d ", &key);
  132.             fgets(info, BUFSIZE-1, stdin);
  133.             if (!push_back(&list, key, info))
  134.                 perror("can't allocate enough memory");
  135.             break;
  136.         case 2 :
  137.             printf("\tEnter key for remove: ");
  138.             scanf("%d", &key);
  139.             remove_items(&list, key);
  140.             break;
  141.         case 3:
  142.             print_list(&list, "%d. %s", 0);
  143.             break;
  144.         }
  145.     } while (choice);
  146.  
  147.     while (list.head != NULL) {
  148.         item = list.head->next;
  149.         free_item(list.head);
  150.         list.head = item;
  151.     }
  152.  
  153.     return 0;
  154. }

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

  1. Объявлены структуры данных: структура Item и структура List.
  2. В структуре Item есть поля key, info и next, а в структуре List - поля head и back.
  3. Функция alloc_item выделяет память под новый элемент списка и заполняет его поля.
  4. Функция free_item освобождает память, выделенную под элемент списка.
  5. Функция push_back добавляет новый элемент в конец списка.
  6. Функция remove_items удаляет элементы списка с заданным ключом.
  7. Функция print_list выводит элементы списка на экран.
  8. Функция menu выводит на экран меню программы.
  9. В основной функции программы создается экземпляр списка, инициализированный нулевыми значениями head и back.
  10. В цикле программы пользователю предлагается выбрать действие из меню.
  11. Выбор пользователя считывается с помощью функции scanf и переключается с помощью оператора switch.
  12. При выборе действия 1 пользователю предлагается ввести ключ и информацию для нового элемента списка.
  13. При выборе действия 2 пользователю предлагается ввести ключ для удаления элемента списка.
  14. При выборе действия 3 на экран выводится содержимое списка.
  15. После окончания цикла программа еще раз проходит по списку и освобождает память, выделенную под каждый элемент списка.
  16. Программа завершается возвратом функции main со значением 0.

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


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

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

11   голосов , оценка 4.091 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы