Создание односвязного динамического списка с неограниченным количеством элементов - 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; // продвижение по списку
- }
- }
Объяснение кода листинга программы
- Ввод данных о морях в список.
- Создание функции для создания списка.
- Создание функции для удаления списка.
- Создание функции для просмотра списка.
- Объявление глобальной переменной для хранения головы списка.
- Инициализация головы списка с помощью функции create.
- Вызов функции list для просмотра списка.
- Вызов функции destroy для удаления списка.
- Использование _getch для ожидания нажатия клавиши перед выходом из программы.
- Возвращение значения 0 для успешного завершения программы.
- Создание цикла while для получения данных о морях и добавления их в список.
- Использование scanf для считывания данных о названии моря, животном, температуре и временных значениях температуры дня и ночи.
- Использование fflush для очистки буфера ввода.
- Использование malloc для выделения памяти под новую структуру sea.
- Использование printf для вывода данных о текущем море.
- Установка значения поля next для каждой новой структуры sea, кроме первой.
- Установка значения поля next для последней структуры sea в NULL.
- Возвращение головы списка из функции create.
- Рекурсивный вызов функции destroy для последовательного освобождения памяти, выделенной под каждую структуру sea.
- Использование printf для вывода данных о текущем море во время обхода списка функцией list.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д