Создание односвязного динамического списка с неограниченным количеством элементов - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д