Создание односвязного динамического списка с неограниченным количеством элементов - C (СИ)

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

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

Доброго времени суток. Данная работа подразумевает создание односвязного динамического списка с неограниченным количеством элементов. После ввода очередного элемента списка на экран должен выдаваться запрос об окончании ввода. Вот что я нацарапал:
Листинг программы
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <malloc.h>
  4. struct sea
  5. { char data[20];
  6. char anim[20];
  7. int temr;
  8. struct sea *next; };
  9. struct sea * create(void); //функция создания списка (возвращает адрес его головы)
  10. void list(sea *head); // функция просмотра списка
  11. struct sea *head; // глобальная переменная, адрес головы списка
  12. void main()
  13. {
  14. head=create();
  15. list(head);
  16. free(head);}
  17. struct sea * create(void)
  18. { sea *p, *pred; // pred – указатель на предыдущую структуру
  19. char c;
  20. head=pred=p=(sea *)malloc(sizeof(sea)); //выделяем память для первой записи
  21. printf(" Sea name: "); scanf("%s", p->data);
  22. fflush(stdin);
  23. printf(" Sea animal: "); scanf("%s", p->anim);
  24. fflush(stdin);
  25. printf(" Sea glubina: "); scanf_s("%d", p->temr);
  26. do { p=(sea *)malloc(sizeof(sea));
  27. printf("\n Sea name: "); scanf("%s", p->data);
  28. fflush(stdin);
  29. printf(" Sea animal: "); scanf("%s", p->anim);
  30. fflush(stdin);
  31. printf(" Sea glubina: "); scanf_s("%d", p->temr);
  32. pred->next=p; //ссылка из предыдущей записи на текущую
  33. pred=p; // сохранение адреса текущей записи в поле предыдущей
  34. printf(" \nThe End?\n * - exit ");
  35. c=_getch();
  36. }
  37. while (c!='*');
  38. p->next=NULL;
  39. return head;}
  40. void list(sea *head)
  41. { sea *p;
  42. p=head;
  43. while (p!=NULL) // пока не конец списка
  44. { printf("\n Sea name: %s",p->data);
  45. printf("\n Sea animal: %s",p->anim);
  46. printf("\n Sea glubina: %d",p->temr);
  47. p=p->next; // продвижение по списку
  48. }
  49. _getch();
  50. }
Но консольное приложение работает не правильно (провисает после ввода первого же поля), хотя компилятор ошибок при построении не видит. Где я напортачил?
Немного дописал код, всё компилится, но консолька провисает после ввода глубины (третьего параметра). Помогите пожалуйста, где я накосячил?
Листинг программы
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <malloc.h>
  4. struct sea
  5. { char data[20];
  6. char anim[20];
  7. int temr;
  8. struct temper { //структура вложенная в структуру
  9. int day;
  10. int night;
  11. }tmp;
  12. struct sea *next; };
  13. struct sea * create(void); //функция создания списка (возвращает адрес его головы)
  14. void list(sea *head); // функция просмотра списка
  15. struct sea *head; // глобальная переменная, адрес головы списка
  16. void main()
  17. {
  18. head=create();
  19. list(head);
  20. free(head);}
  21. struct sea * create(void)
  22. { sea *p, *pred; // pred – указатель на предыдущую структуру
  23. char c;
  24. head=pred=p=(sea *)malloc(sizeof(sea)); //выделяем память для первой записи
  25. printf(" Sea name: "); scanf("%s", p->data);
  26. fflush(stdin);
  27. printf(" Sea animal: "); scanf("%s", p->anim);
  28. fflush(stdin);
  29. printf(" Sea glubina: "); scanf_s("%d", p->temr);
  30. printf(" Sea temp day: "); scanf_s("%d", p->tmp.day);
  31. printf(" Sea temp night: "); scanf_s("%d", p->tmp.night);
  32. do { p=(sea *)malloc(sizeof(sea));
  33. printf("\n Sea name: "); scanf("%s", p->data);
  34. fflush(stdin);
  35. printf(" Sea animal: "); scanf("%s", p->anim);
  36. fflush(stdin);
  37. printf(" Sea glubina: "); scanf_s("%d", p->temr);
  38. printf(" Sea temp day: "); scanf_s("%d", p->tmp.day);
  39. printf(" Sea temp night: "); scanf_s("%d", p->tmp.night);
  40. pred->next=p; //ссылка из предыдущей записи на текущую
  41. pred=p; // сохранение адреса текущей записи в поле предыдущей
  42. printf(" \nThe End?\n * - exit ");
  43. c=_getch();
  44. }
  45. while (c!='*');
  46. p->next=NULL;
  47. return head;}
  48. void list(sea *head)
  49. { sea *p;
  50. p=head;
  51. while (p!=NULL) // пока не конец списка
  52. { printf("\n Sea name: %s",p->data);
  53. printf("\n Sea animal: %s",p->anim);
  54. printf("\n Sea glubina: %d",p->temr);
  55. printf("\n Sea temp day: %d",p->tmp.day);
  56. printf("\n Sea temp night: %d",p->tmp.night);
  57. p=p->next; // продвижение по списку
  58. }
  59. _getch();
  60. }

Решение задачи: «Создание односвязного динамического списка с неограниченным количеством элементов»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <malloc.h>
  4.  
  5. struct sea
  6. {
  7.    char data[20];
  8.    char anim[20];
  9.    int temr;
  10.    struct temper   //структура вложенная в структуру
  11.    {
  12.       int day;
  13.       int night;
  14.    } tmp;
  15.    struct sea* next;
  16. };
  17.  
  18. struct sea* create(void);  // функция создания списка (возвращает адрес его головы)
  19. void destroy(struct sea*); // удаление сиписка
  20. void list(struct sea*);    // функция просмотра списка
  21.  
  22. int main()
  23. {
  24.    struct sea* head = create();// глобальная переменная, адрес головы списка
  25.    list(head);
  26.    destroy(head);
  27.  
  28.    _getch();
  29.  
  30.    return 0;
  31. }
  32.  
  33. struct sea* create(void)
  34. {
  35.    struct sea* p, * pred = NULL, * head = NULL; // pred – указатель на предыдущую структуру
  36.    char c = 0;
  37.  
  38.    while (c != '*')
  39.    {
  40.       p = (struct sea*) malloc(sizeof(struct sea));
  41.       printf("\n Sea name: ");     scanf("%s", p->data);
  42.       fflush(stdin);
  43.       printf(" Sea animal: ");     scanf("%s", p->anim);
  44.       fflush(stdin);
  45.       printf(" Sea glubina: ");    scanf("%d", &p->temr);
  46.       printf(" Sea temp day: ");   scanf("%d", &p->tmp.day);
  47.       printf(" Sea temp night: "); scanf("%d", &p->tmp.night);
  48.  
  49.       if (pred == NULL)
  50.       {
  51.          head = p;
  52.       }
  53.       else
  54.       {
  55.          pred->next = p; //ссылка из предыдущей записи на текущую
  56.       }
  57.       pred = p; // сохранение адреса текущей записи в поле предыдущей
  58.       printf(" \nThe End?\n * - exit  ");
  59.       c = _getch();
  60.    }
  61.    p->next = NULL;
  62.  
  63.    return head;
  64. }
  65.  
  66. void destroy(struct sea* head)
  67. {
  68.    struct sea* node;
  69.    while (head != NULL)
  70.    {
  71.       node = head;
  72.       head = head->next;
  73.       free(node);
  74.    }
  75. }
  76.  
  77. void list(struct sea* head)
  78. {
  79.    while (head != NULL) // пока не конец списка
  80.    {
  81.       printf("\n Sea name: %s", head->data);
  82.       printf("\n Sea animal: %s", head->anim);
  83.       printf("\n Sea glubina: %d", head->temr);
  84.       printf("\n Sea temp day: %d", head->tmp.day);
  85.       printf("\n Sea temp night: %d\n", head->tmp.night);
  86.       head = head->next; // продвижение по списку
  87.    }
  88. }

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

  1. Ввод данных о морях в список.
  2. Создание функции для создания списка.
  3. Создание функции для удаления списка.
  4. Создание функции для просмотра списка.
  5. Объявление глобальной переменной для хранения головы списка.
  6. Инициализация головы списка с помощью функции create.
  7. Вызов функции list для просмотра списка.
  8. Вызов функции destroy для удаления списка.
  9. Использование _getch для ожидания нажатия клавиши перед выходом из программы.
  10. Возвращение значения 0 для успешного завершения программы.
  11. Создание цикла while для получения данных о морях и добавления их в список.
  12. Использование scanf для считывания данных о названии моря, животном, температуре и временных значениях температуры дня и ночи.
  13. Использование fflush для очистки буфера ввода.
  14. Использование malloc для выделения памяти под новую структуру sea.
  15. Использование printf для вывода данных о текущем море.
  16. Установка значения поля next для каждой новой структуры sea, кроме первой.
  17. Установка значения поля next для последней структуры sea в NULL.
  18. Возвращение головы списка из функции create.
  19. Рекурсивный вызов функции destroy для последовательного освобождения памяти, выделенной под каждую структуру sea.
  20. Использование printf для вывода данных о текущем море во время обхода списка функцией list.

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


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

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

9   голосов , оценка 4.111 из 5

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

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

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