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

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

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

Доброго времени суток. Данная работа подразумевает создание односвязного динамического списка с неограниченным количеством элементов. После ввода очередного элемента списка на экран должен выдаваться запрос об окончании ввода. Вот что я нацарапал:
#include <stdio.h>
#include <conio.h>
#include <malloc.h>
 
struct sea
{ char data[20];
  char anim[20];
  int temr;
  struct sea *next; };
 
struct sea * create(void); //функция создания списка (возвращает адрес его головы)
void list(sea *head); // функция просмотра списка
struct sea *head; // глобальная переменная, адрес головы списка
 
void main()
{ 
head=create();
list(head);
free(head);}
 
struct sea * create(void)
{ sea *p, *pred; // pred – указатель на предыдущую структуру
  char c;
  head=pred=p=(sea *)malloc(sizeof(sea)); //выделяем память для первой записи
  printf(" Sea name: "); scanf("%s", p->data);
  fflush(stdin);
  printf(" Sea animal: "); scanf("%s", p->anim);
  fflush(stdin);
  printf(" Sea glubina: "); scanf_s("%d", p->temr);
  do { p=(sea *)malloc(sizeof(sea));
       printf("\n Sea name: "); scanf("%s", p->data);
       fflush(stdin);
       printf(" Sea animal: "); scanf("%s", p->anim);
       fflush(stdin);
       printf(" Sea glubina: "); scanf_s("%d", p->temr);
       pred->next=p; //ссылка из предыдущей записи на текущую
       pred=p; // сохранение адреса текущей записи в поле предыдущей
       printf(" \nThe End?\n * - exit  ");
       c=_getch();
       } 
  
  while (c!='*');
  p->next=NULL;
  return head;}
 
void list(sea *head)
{ sea *p;
  p=head;
  while (p!=NULL) // пока не конец списка
  {  printf("\n Sea name: %s",p->data);
     printf("\n Sea animal: %s",p->anim);
     printf("\n Sea glubina: %d",p->temr);
     p=p->next; // продвижение по списку
   }
   _getch();
}
Но консольное приложение работает не правильно (провисает после ввода первого же поля), хотя компилятор ошибок при построении не видит. Где я напортачил?
Немного дописал код, всё компилится, но консолька провисает после ввода глубины (третьего параметра). Помогите пожалуйста, где я накосячил?
#include <stdio.h>
#include <conio.h>
#include <malloc.h>
 
struct sea
{ char data[20];
  char anim[20];
  int temr;
  struct temper { //структура вложенная в структуру
int day;
int night;
}tmp;
  struct sea *next; };
 
struct sea * create(void); //функция создания списка (возвращает адрес его головы)
void list(sea *head); // функция просмотра списка
struct sea *head; // глобальная переменная, адрес головы списка
 
void main()
{ 
head=create();
list(head);
free(head);}
 
struct sea * create(void)
{ sea *p, *pred; // pred – указатель на предыдущую структуру
  char c;
  head=pred=p=(sea *)malloc(sizeof(sea)); //выделяем память для первой записи
  printf(" Sea name: "); scanf("%s", p->data);
  fflush(stdin);
  printf(" Sea animal: "); scanf("%s", p->anim);
  fflush(stdin);
  printf(" Sea glubina: "); scanf_s("%d", p->temr);
  printf(" Sea temp day: "); scanf_s("%d", p->tmp.day);
  printf(" Sea temp night: "); scanf_s("%d", p->tmp.night);
  do { p=(sea *)malloc(sizeof(sea));
       printf("\n Sea name: "); scanf("%s", p->data);
       fflush(stdin);
       printf(" Sea animal: "); scanf("%s", p->anim);
       fflush(stdin);
       printf(" Sea glubina: "); scanf_s("%d", p->temr);
       printf(" Sea temp day: "); scanf_s("%d", p->tmp.day);
       printf(" Sea temp night: "); scanf_s("%d", p->tmp.night);
       pred->next=p; //ссылка из предыдущей записи на текущую
       pred=p; // сохранение адреса текущей записи в поле предыдущей
       printf(" \nThe End?\n * - exit  ");
       c=_getch();
       } 
  
  while (c!='*');
  p->next=NULL;
  return head;}
 
void list(sea *head)
{ sea *p;
  p=head;
  while (p!=NULL) // пока не конец списка
  {  printf("\n Sea name: %s",p->data);
     printf("\n Sea animal: %s",p->anim);
     printf("\n Sea glubina: %d",p->temr);
     printf("\n Sea temp day: %d",p->tmp.day);
     printf("\n Sea temp night: %d",p->tmp.night);
     p=p->next; // продвижение по списку
   }
   _getch();
}

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

textual
Листинг программы
#include <stdio.h>
#include <conio.h>
#include <malloc.h>
 
struct sea
{
   char data[20];
   char anim[20];
   int temr;
   struct temper   //структура вложенная в структуру
   {
      int day;
      int night;
   } tmp;
   struct sea* next;
};
 
struct sea* create(void);  // функция создания списка (возвращает адрес его головы)
void destroy(struct sea*); // удаление сиписка
void list(struct sea*);    // функция просмотра списка
 
int main()
{
   struct sea* head = create();// глобальная переменная, адрес головы списка
   list(head);
   destroy(head);
 
   _getch();
 
   return 0;
}
 
struct sea* create(void)
{
   struct sea* p, * pred = NULL, * head = NULL; // pred – указатель на предыдущую структуру
   char c = 0;
 
   while (c != '*')
   {
      p = (struct sea*) malloc(sizeof(struct sea));
      printf("\n Sea name: ");     scanf("%s", p->data);
      fflush(stdin);
      printf(" Sea animal: ");     scanf("%s", p->anim);
      fflush(stdin);
      printf(" Sea glubina: ");    scanf("%d", &p->temr);
      printf(" Sea temp day: ");   scanf("%d", &p->tmp.day);
      printf(" Sea temp night: "); scanf("%d", &p->tmp.night);
 
      if (pred == NULL)
      {
         head = p;
      }
      else
      {
         pred->next = p; //ссылка из предыдущей записи на текущую
      }
      pred = p; // сохранение адреса текущей записи в поле предыдущей
      printf(" \nThe End?\n * - exit  ");
      c = _getch();
   }
   p->next = NULL;
 
   return head;
}
 
void destroy(struct sea* head)
{
   struct sea* node;
   while (head != NULL)
   {
      node = head;
      head = head->next;
      free(node);
   }
}
 
void list(struct sea* head)
{
   while (head != NULL) // пока не конец списка
   {
      printf("\n Sea name: %s", head->data);
      printf("\n Sea animal: %s", head->anim);
      printf("\n Sea glubina: %d", head->temr);
      printf("\n Sea temp day: %d", head->tmp.day);
      printf("\n Sea temp night: %d\n", head->tmp.night);
      head = head->next; // продвижение по списку
   }
}

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

  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
Похожие ответы